Skip to content

Commit 21e6ecc

Browse files
committed
Add new market functionality, add verbose option, fix snake_case AGAIN
1 parent 8861e68 commit 21e6ecc

File tree

7 files changed

+65
-90
lines changed

7 files changed

+65
-90
lines changed

XIVAPI.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ class XIVAPI {
1313
/*{
1414
private_key string undefined optional
1515
language string 'en' optional
16-
staging bool false optional
1716
snake_case bool false optional
17+
staging bool false optional
18+
verbose bool false optional
1819
}
1920
*/
2021
constructor(options = {}, legacyOptions = {}) {
@@ -30,9 +31,18 @@ See how in https://github.com/xivapi/xivapi-js/releases/tag/v0.1.3.\n\
3031

3132
this.endpoint = `https://${options.staging ? 'staging.' : ''}xivapi.com`
3233
if(options.language && !resources.languages.includes(options.language))
33-
throw Error(`Invalid language given, must be: ${this.resources.languages}`)
34+
throw Error(`Invalid language given, must be one of: ${this.resources.languages}`)
35+
36+
this.globalParams = {}
37+
38+
for (let x of ['private_key', 'language']) {
39+
if(typeof options[x] !== 'undefined')
40+
this.globalParams[x] = options[x]
41+
}
42+
if(options.snake_case)
43+
this.globalParams.snake_case = 1
3444

35-
this.globalParams = options
45+
this.verbose = options.verbose
3646

3747
this.resources = resources
3848

lib/data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class Content extends Lib {
6464
reject(Error('The id must be defined for get() in Content.'))
6565

6666
this.req(`/${name}/${id}`).then((res) => {
67-
resolve(cleanContent(res))
67+
resolve(cleanContent(res, this.parent.globalParams.snake_case))
6868
}).catch((err) => {
6969
reject(err)
7070
})

lib/market.js

Lines changed: 30 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// https://xivapi.com/docs/Welcome#section-4
22
const Lib = require('./Lib')
3-
let { firstCapital, cleanContent, correctCase, getCurrCase } = require('../utils')
3+
let { cleanContent, getCurrCase, makeCSV } = require('../utils')
44

55
class Content extends Lib {
66
constructor(parent) {
@@ -9,102 +9,48 @@ class Content extends Lib {
99
cleanContent = cleanContent.bind(parent)
1010
}
1111

12-
prices(id, server, params = {}) {
12+
get(ids, params = {}) {
1313
return new Promise((resolve, reject) => {
14-
if(typeof(id) === 'undefined')
15-
reject(Error('The id must be defined for market prices.'))
16-
if(typeof(server) === 'undefined')
17-
reject(Error('The server must be defined for market prices.'))
18-
if(!this.parent.resources.servers.includes(firstCapital(server)))
19-
reject(Error('The server is not valid for market prices.'))
14+
if(typeof(ids) === 'undefined')
15+
reject(Error('The ids must be defined for market get.'))
16+
if(!params.servers && !params.dc)
17+
reject(Error('The servers or dc params must be defined for market get.'))
2018

21-
let currCase = getCurrCase(this.parent.globalParams, params)
22-
23-
this.req(
24-
`/market/${server}/items/${id}`,
25-
params
26-
).then((res) => {
27-
let item = correctCase('item', currCase),
28-
prices = correctCase('prices', currCase),
29-
town = correctCase('town', currCase)
30-
31-
res[item] = cleanContent(res[item])
32-
for (let i = 0; i < res[prices].length; i++) {
33-
res[prices][i][town] = cleanContent(res[prices][i][town])
34-
}
35-
36-
resolve(res)
37-
}).catch((err) => {
38-
reject(err)
39-
})
40-
})
41-
}
19+
let path = '/market/'
20+
//currCase = getCurrCase(this.parent.globalParams, params)
4221

43-
history(id, server, params = {}) {
44-
return new Promise((resolve, reject) => {
45-
if(typeof(id) === 'undefined')
46-
reject(Error('The id must be defined for market history.'))
47-
if(typeof(server) === 'undefined')
48-
reject(Error('The server must be defined for market history.'))
49-
if(!this.parent.resources.servers.includes(firstCapital(server)))
50-
reject(Error('The server is not valid for market history.'))
22+
if(!getSingle(ids)) {//multiple IDs
23+
path += 'items'
24+
params.ids = makeCSV(ids)
25+
params.servers = makeCSV(params.servers)
5126

52-
let currCase = getCurrCase(this.parent.globalParams, params)
27+
} else if(params.dc || !getSingle(params.servers)) {//single ID, multiple servers
28+
path += `item/${getSingle(ids)}`
29+
params.servers = makeCSV(params.servers)
5330

54-
this.req(
55-
`/market/${server}/items/${id}/history`,
56-
params
57-
).then((res) => {
58-
let item = correctCase('item', currCase),
59-
history = correctCase('history', currCase),
60-
purchase_date = correctCase('purchase_date', currCase)
31+
} else {//single ID & server
32+
let server = getSingle(params.servers)
33+
path += `${server}/item/${getSingle(ids)}`
6134

62-
res[item] = cleanContent(res[item])
63-
for (let i = 0; i < res[history].length; i++) {
64-
res[history][i][purchase_date] = new Date(res[history][i][purchase_date] * 1000)
65-
}
35+
}
6636

37+
this.req(path, params).then((res) => {
6738
resolve(res)
6839
}).catch((err) => {
6940
reject(err)
7041
})
7142
})
7243
}
7344

74-
stock(category, server, params = {}) {
45+
categories(params = {}) {
7546
return new Promise((resolve, reject) => {
76-
if(typeof(category) === 'undefined')
77-
reject(Error('The category must be defined for market stock.'))
78-
if(typeof(server) === 'undefined')
79-
reject(Error('The server must be defined for market stock.'))
80-
if(!this.parent.resources.servers.includes(firstCapital(server)))
81-
reject(Error('The server is not valid for market stock.'))
82-
8347
let currCase = getCurrCase(this.parent.globalParams, params)
8448

85-
this.req(
86-
`/market/${server}/category/${category}`,
87-
params
88-
).then((res) => {
89-
let item = correctCase('item', currCase)
90-
for (let i = 0; i < res.length; i++) {
91-
res[i][item] = cleanContent(res[i][item])
92-
}
93-
94-
resolve(res)
95-
}).catch((err) => {
96-
reject(err)
97-
})
98-
})
99-
}
100-
101-
categories(params = {}) {
102-
return new Promise((resolve, reject) => {
10349
this.req(
10450
'/market/categories',
10551
params
10652
).then((res) => {
107-
res = cleanContent(res)
53+
res = cleanContent(res, currCase)
10854

10955
resolve(res)
11056
}).catch((err) => {
@@ -117,3 +63,11 @@ class Content extends Lib {
11763
}
11864

11965
module.exports = Content
66+
67+
const getSingle = (x) => {
68+
if(typeof x === 'number' || (typeof x === 'string' && !x.includes(',')))
69+
return x
70+
if(x.length === 1)
71+
return x[0]
72+
return false
73+
}

lib/search.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ module.exports = function(input, params = {}) {
3232
Object.assign(params, {string: input})
3333
).then((res) => {
3434
res[correctCase('results', currCase)].forEach((entry) => { //eslint-disable-line no-unused-vars
35-
entry = cleanContent(entry)
35+
entry = cleanContent(entry, currCase)
3636
})
3737
resolve(res)
3838
}).catch((err) => {
@@ -49,7 +49,7 @@ module.exports = function(input, params = {}) {
4949
input
5050
).then((res) => {
5151
res[correctCase('results', currCase)].forEach((entry) => { //eslint-disable-line no-unused-vars
52-
entry = cleanContent(entry)
52+
entry = cleanContent(entry, currCase)
5353
})
5454
resolve(res)
5555
}).catch((err) => {

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "xivapi-js",
3-
"version": "0.1.3",
4-
"description": "A pure JS wrapper for xivapi.com",
3+
"version": "0.2.0",
4+
"description": "A Node.JS wrapper for xivapi.com",
55
"main": "XIVAPI.js",
66
"directories": {
77
"lib": "lib"

test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
const XIVAPI = require('./XIVAPI'),
22
readline = require('readline')
33

4-
const xiv = new XIVAPI({snake_case: true})
4+
const xiv = new XIVAPI({
5+
//snake_case: true,
6+
verbose: true
7+
})
58

69
let rl = readline.createInterface({
710
input: process.stdin,

utils.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,26 @@ const request = require('request-promise-native'),
1010
module.exports = {
1111
//standard request function
1212
req(path, params) {
13-
if(typeof params.snake_case !== 'undefined')
13+
if(params && typeof params.snake_case !== 'undefined')
1414
params.snake_case = params.snake_case ? 1 : 0
1515

16+
params = Object.assign({}, this.globalParams, params)
17+
18+
if(this.verbose)
19+
console.log(`Requesting ${path} with params: `, params)
20+
1621
return request({
1722
uri: this.endpoint + path,
18-
qs: Object.assign(this.globalParams, params),
23+
qs: params,
1924
json: true
2025
})
2126
},
2227

2328
//JSON request function
2429
reqJSON(path, body) {
30+
if(this.verbose)
31+
console.log(`Requesting ${path} with body: `, body)
32+
2533
return request({
2634
method: 'POST',
2735
uri: this.endpoint + path,
@@ -64,9 +72,9 @@ module.exports = {
6472
},
6573

6674
//transform URLs properly
67-
cleanContent(input, deep) {
68-
let icon = module.exports.correctCase('icon', this.globalParams.snake_case),
69-
url = module.exports.correctCase('url', this.globalParams.snake_case)
75+
cleanContent(input, snake_case, deep) {
76+
let icon = module.exports.correctCase('icon', snake_case),
77+
url = module.exports.correctCase('url', snake_case)
7078

7179
const properties = [icon, url]
7280

0 commit comments

Comments
 (0)