osrs-json-hiscores 2.16.1 → 2.16.3
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +5 -4
- package/lib/hiscores.js +33 -34
- package/lib/types.d.ts +8 -1
- package/lib/utils/constants.d.ts +18 -0
- package/lib/utils/constants.js +63 -1
- package/lib/utils/helpers.js +3 -3
- package/package.json +5 -2
package/README.md
CHANGED
@@ -115,11 +115,12 @@ Activities consist of all levels of clue scrolls as well as minigames and bosses
|
|
115
115
|
| Soul Wars Zeal | `soulWarsZeal` |
|
116
116
|
| Rifts closed | `riftsClosed` |
|
117
117
|
|
118
|
-
###
|
118
|
+
### Points
|
119
119
|
|
120
|
-
| Activity
|
121
|
-
|
|
122
|
-
| League Points
|
120
|
+
| Activity | Param |
|
121
|
+
| -------------- | :-------------: |
|
122
|
+
| League Points | `leaguePoints` |
|
123
|
+
| Deadman Points | `deadmanPoints` |
|
123
124
|
|
124
125
|
### Bosses
|
125
126
|
|
package/lib/hiscores.js
CHANGED
@@ -48,6 +48,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
48
48
|
};
|
49
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
50
50
|
exports.getActivityPage = exports.getSkillPage = exports.getStatsByGamemode = exports.getStats = exports.parseStats = exports.parseJsonStats = exports.getRSNFormat = exports.getOfficialStats = void 0;
|
51
|
+
var axios_1 = require("axios");
|
51
52
|
var jsdom_1 = require("jsdom");
|
52
53
|
var utils_1 = require("./utils");
|
53
54
|
/**
|
@@ -59,9 +60,10 @@ var utils_1 = require("./utils");
|
|
59
60
|
* @returns Official JSON stats object.
|
60
61
|
*/
|
61
62
|
function getOfficialStats(rsn, mode, config) {
|
63
|
+
var _a;
|
62
64
|
if (mode === void 0) { mode = 'main'; }
|
63
65
|
return __awaiter(this, void 0, void 0, function () {
|
64
|
-
var url, response,
|
66
|
+
var url, response, err_1;
|
65
67
|
return __generator(this, function (_b) {
|
66
68
|
switch (_b.label) {
|
67
69
|
case 0:
|
@@ -75,8 +77,12 @@ function getOfficialStats(rsn, mode, config) {
|
|
75
77
|
response = _b.sent();
|
76
78
|
return [2 /*return*/, response.data];
|
77
79
|
case 3:
|
78
|
-
|
79
|
-
|
80
|
+
err_1 = _b.sent();
|
81
|
+
if (!axios_1.default.isAxiosError(err_1))
|
82
|
+
throw err_1;
|
83
|
+
if (((_a = err_1.response) === null || _a === void 0 ? void 0 : _a.status) === 404)
|
84
|
+
throw new utils_1.PlayerNotFoundError();
|
85
|
+
throw new utils_1.HiScoresError();
|
80
86
|
case 4: return [2 /*return*/];
|
81
87
|
}
|
82
88
|
});
|
@@ -109,10 +115,10 @@ function getRSNFormat(rsn, config) {
|
|
109
115
|
if (anchor) {
|
110
116
|
return [2 /*return*/, (0, utils_1.rsnFromElement)(anchor)];
|
111
117
|
}
|
112
|
-
throw
|
118
|
+
throw new utils_1.PlayerNotFoundError();
|
113
119
|
case 3:
|
114
120
|
_a = _b.sent();
|
115
|
-
throw
|
121
|
+
throw new utils_1.HiScoresError();
|
116
122
|
case 4: return [2 /*return*/];
|
117
123
|
}
|
118
124
|
});
|
@@ -164,6 +170,7 @@ function parseJsonStats(json) {
|
|
164
170
|
var clues = reduceActivity(utils_1.CLUES, utils_1.FORMATTED_CLUE_NAMES);
|
165
171
|
var bosses = reduceActivity(utils_1.BOSSES, utils_1.FORMATTED_BOSS_NAMES);
|
166
172
|
var leaguePoints = getActivity(utils_1.FORMATTED_LEAGUE_POINTS);
|
173
|
+
var deadmanPoints = getActivity(utils_1.FORMATTED_DEADMAN_POINTS);
|
167
174
|
var lastManStanding = getActivity(utils_1.FORMATTED_LMS);
|
168
175
|
var pvpArena = getActivity(utils_1.FORMATTED_PVP_ARENA);
|
169
176
|
var soulWarsZeal = getActivity(utils_1.FORMATTED_SOUL_WARS);
|
@@ -171,6 +178,7 @@ function parseJsonStats(json) {
|
|
171
178
|
var stats = {
|
172
179
|
skills: skills,
|
173
180
|
leaguePoints: leaguePoints,
|
181
|
+
deadmanPoints: deadmanPoints,
|
174
182
|
bountyHunter: bountyHunter,
|
175
183
|
lastManStanding: lastManStanding,
|
176
184
|
pvpArena: pvpArena,
|
@@ -193,9 +201,8 @@ function parseStats(csv) {
|
|
193
201
|
.split('\n')
|
194
202
|
.filter(function (entry) { return !!entry; })
|
195
203
|
.map(function (stat) { return stat.split(','); });
|
196
|
-
if (splitCSV.length !==
|
197
|
-
|
198
|
-
throw Error(utils_1.INVALID_FORMAT_ERROR);
|
204
|
+
if (splitCSV.length !== utils_1.SKILLS.length + utils_1.ACTIVITIES.length) {
|
205
|
+
throw new utils_1.InvalidFormatError();
|
199
206
|
}
|
200
207
|
var skillObjects = splitCSV
|
201
208
|
.filter(function (stat) { return stat.length === 3; })
|
@@ -218,10 +225,10 @@ function parseStats(csv) {
|
|
218
225
|
};
|
219
226
|
return activity;
|
220
227
|
});
|
221
|
-
var
|
228
|
+
var _a = activityObjects.splice(0, 2), leaguePoints = _a[0], deadmanPoints = _a[1];
|
222
229
|
var bhObjects = activityObjects.splice(0, utils_1.BH_MODES.length);
|
223
230
|
var clueObjects = activityObjects.splice(0, utils_1.CLUES.length);
|
224
|
-
var
|
231
|
+
var _b = activityObjects.splice(0, 4), lastManStanding = _b[0], pvpArena = _b[1], soulWarsZeal = _b[2], riftsClosed = _b[3];
|
225
232
|
var bossObjects = activityObjects.splice(0, utils_1.BOSSES.length);
|
226
233
|
var skills = skillObjects.reduce(function (prev, curr, index) {
|
227
234
|
var newSkills = __assign({}, prev);
|
@@ -246,6 +253,7 @@ function parseStats(csv) {
|
|
246
253
|
var stats = {
|
247
254
|
skills: skills,
|
248
255
|
leaguePoints: leaguePoints,
|
256
|
+
deadmanPoints: deadmanPoints,
|
249
257
|
bountyHunter: bountyHunter,
|
250
258
|
lastManStanding: lastManStanding,
|
251
259
|
pvpArena: pvpArena,
|
@@ -269,7 +277,7 @@ exports.parseStats = parseStats;
|
|
269
277
|
function getStats(rsn, options) {
|
270
278
|
var _a, _b, _c, _d;
|
271
279
|
return __awaiter(this, void 0, void 0, function () {
|
272
|
-
var otherGamemodes, shouldGetFormattedRsn,
|
280
|
+
var otherGamemodes, shouldGetFormattedRsn, main, getModeStats, formattedName, _e, player, iron, hc, ult;
|
273
281
|
var _this = this;
|
274
282
|
return __generator(this, function (_f) {
|
275
283
|
switch (_f.label) {
|
@@ -281,23 +289,15 @@ function getStats(rsn, options) {
|
|
281
289
|
'ultimate'
|
282
290
|
];
|
283
291
|
shouldGetFormattedRsn = (_b = options === null || options === void 0 ? void 0 : options.shouldGetFormattedRsn) !== null && _b !== void 0 ? _b : true;
|
284
|
-
return [4 /*yield*/, (
|
292
|
+
return [4 /*yield*/, getOfficialStats(rsn, 'main', (_c = options === null || options === void 0 ? void 0 : options.axiosConfigs) === null || _c === void 0 ? void 0 : _c.main)];
|
285
293
|
case 1:
|
286
|
-
|
287
|
-
if (!(mainRes.status === 200)) return [3 /*break*/, 9];
|
288
|
-
emptyResponse_1 = {
|
289
|
-
status: 404,
|
290
|
-
data: { skills: [], activities: [] },
|
291
|
-
statusText: '',
|
292
|
-
headers: {},
|
293
|
-
config: {}
|
294
|
-
};
|
294
|
+
main = _f.sent();
|
295
295
|
getModeStats = function (mode) { return __awaiter(_this, void 0, void 0, function () {
|
296
296
|
var _a;
|
297
297
|
return __generator(this, function (_b) {
|
298
298
|
return [2 /*return*/, otherGamemodes.includes(mode)
|
299
|
-
? (
|
300
|
-
:
|
299
|
+
? getOfficialStats(rsn, mode, (_a = options === null || options === void 0 ? void 0 : options.axiosConfigs) === null || _a === void 0 ? void 0 : _a[mode]).catch(function () { return undefined; })
|
300
|
+
: undefined];
|
301
301
|
});
|
302
302
|
}); };
|
303
303
|
if (!shouldGetFormattedRsn) return [3 /*break*/, 3];
|
@@ -317,21 +317,21 @@ function getStats(rsn, options) {
|
|
317
317
|
deulted: false,
|
318
318
|
deironed: false
|
319
319
|
};
|
320
|
-
player.main = parseJsonStats(
|
320
|
+
player.main = parseJsonStats(main);
|
321
321
|
return [4 /*yield*/, getModeStats('ironman')];
|
322
322
|
case 5:
|
323
|
-
|
324
|
-
if (!
|
325
|
-
player.ironman = parseJsonStats(
|
323
|
+
iron = _f.sent();
|
324
|
+
if (!iron) return [3 /*break*/, 8];
|
325
|
+
player.ironman = parseJsonStats(iron);
|
326
326
|
return [4 /*yield*/, getModeStats('hardcore')];
|
327
327
|
case 6:
|
328
|
-
|
328
|
+
hc = _f.sent();
|
329
329
|
return [4 /*yield*/, getModeStats('ultimate')];
|
330
330
|
case 7:
|
331
|
-
|
332
|
-
if (
|
331
|
+
ult = _f.sent();
|
332
|
+
if (hc) {
|
333
333
|
player.mode = 'hardcore';
|
334
|
-
player.hardcore = parseJsonStats(
|
334
|
+
player.hardcore = parseJsonStats(hc);
|
335
335
|
if (player.ironman.skills.overall.xp !== player.hardcore.skills.overall.xp) {
|
336
336
|
player.dead = true;
|
337
337
|
player.mode = 'ironman';
|
@@ -341,9 +341,9 @@ function getStats(rsn, options) {
|
|
341
341
|
player.mode = 'main';
|
342
342
|
}
|
343
343
|
}
|
344
|
-
else if (
|
344
|
+
else if (ult) {
|
345
345
|
player.mode = 'ultimate';
|
346
|
-
player.ultimate = parseJsonStats(
|
346
|
+
player.ultimate = parseJsonStats(ult);
|
347
347
|
if (player.ironman.skills.overall.xp !== player.ultimate.skills.overall.xp) {
|
348
348
|
player.deulted = true;
|
349
349
|
player.mode = 'ironman';
|
@@ -362,7 +362,6 @@ function getStats(rsn, options) {
|
|
362
362
|
}
|
363
363
|
_f.label = 8;
|
364
364
|
case 8: return [2 /*return*/, player];
|
365
|
-
case 9: throw Error(utils_1.PLAYER_NOT_FOUND_ERROR);
|
366
365
|
}
|
367
366
|
});
|
368
367
|
});
|
package/lib/types.d.ts
CHANGED
@@ -25,11 +25,18 @@ export type Boss = 'abyssalSire' | 'alchemicalHydra' | 'artio' | 'barrows' | 'br
|
|
25
25
|
export type Bosses = {
|
26
26
|
[Type in Boss]: Activity;
|
27
27
|
};
|
28
|
-
export type ActivityName = 'leaguePoints' | 'hunterBHV2' | 'rogueBHV2' | 'hunterBH' | 'rogueBH' | 'lastManStanding' | 'pvpArena' | 'soulWarsZeal' | 'riftsClosed' | 'allClues' | 'beginnerClues' | 'easyClues' | 'mediumClues' | 'hardClues' | 'eliteClues' | 'masterClues' | Boss;
|
28
|
+
export type ActivityName = 'leaguePoints' | 'deadmanPoints' | 'hunterBHV2' | 'rogueBHV2' | 'hunterBH' | 'rogueBH' | 'lastManStanding' | 'pvpArena' | 'soulWarsZeal' | 'riftsClosed' | 'allClues' | 'beginnerClues' | 'easyClues' | 'mediumClues' | 'hardClues' | 'eliteClues' | 'masterClues' | Boss;
|
29
29
|
export interface Stats {
|
30
30
|
skills: Skills;
|
31
31
|
clues: Clues;
|
32
|
+
/**
|
33
|
+
* Will only contain rank and score data for the `seasonal` gamemode.
|
34
|
+
*/
|
32
35
|
leaguePoints: Activity;
|
36
|
+
/**
|
37
|
+
* Will only contain rank and score data for the `tournament` gamemode.
|
38
|
+
*/
|
39
|
+
deadmanPoints: Activity;
|
33
40
|
bountyHunter: BH;
|
34
41
|
lastManStanding: Activity;
|
35
42
|
pvpArena: Activity;
|
package/lib/utils/constants.d.ts
CHANGED
@@ -33,6 +33,24 @@ export declare const FORMATTED_LMS = "LMS - Rank";
|
|
33
33
|
export declare const FORMATTED_PVP_ARENA = "PvP Arena - Rank";
|
34
34
|
export declare const FORMATTED_SOUL_WARS = "Soul Wars Zeal";
|
35
35
|
export declare const FORMATTED_LEAGUE_POINTS = "League Points";
|
36
|
+
export declare const FORMATTED_DEADMAN_POINTS = "Deadman Points";
|
36
37
|
export declare const FORMATTED_RIFTS_CLOSED = "Rifts closed";
|
37
38
|
export declare const INVALID_FORMAT_ERROR = "Invalid hiscores format";
|
38
39
|
export declare const PLAYER_NOT_FOUND_ERROR = "Player not found";
|
40
|
+
export declare const HISCORES_ERROR = "HiScores not responding";
|
41
|
+
export declare class InvalidFormatError extends Error {
|
42
|
+
__proto__: ErrorConstructor;
|
43
|
+
constructor();
|
44
|
+
}
|
45
|
+
export declare class InvalidRSNError extends Error {
|
46
|
+
__proto__: ErrorConstructor;
|
47
|
+
constructor(message: string);
|
48
|
+
}
|
49
|
+
export declare class PlayerNotFoundError extends Error {
|
50
|
+
__proto__: ErrorConstructor;
|
51
|
+
constructor();
|
52
|
+
}
|
53
|
+
export declare class HiScoresError extends Error {
|
54
|
+
__proto__: ErrorConstructor;
|
55
|
+
constructor();
|
56
|
+
}
|
package/lib/utils/constants.js
CHANGED
@@ -1,4 +1,19 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
3
|
+
var extendStatics = function (d, b) {
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
7
|
+
return extendStatics(d, b);
|
8
|
+
};
|
9
|
+
return function (d, b) {
|
10
|
+
if (typeof b !== "function" && b !== null)
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
12
|
+
extendStatics(d, b);
|
13
|
+
function __() { this.constructor = d; }
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
15
|
+
};
|
16
|
+
})();
|
2
17
|
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
3
18
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
4
19
|
if (ar || !(i in from)) {
|
@@ -9,7 +24,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
9
24
|
return to.concat(ar || Array.prototype.slice.call(from));
|
10
25
|
};
|
11
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
-
exports.PLAYER_NOT_FOUND_ERROR = exports.INVALID_FORMAT_ERROR = exports.FORMATTED_RIFTS_CLOSED = exports.FORMATTED_LEAGUE_POINTS = exports.FORMATTED_SOUL_WARS = exports.FORMATTED_PVP_ARENA = exports.FORMATTED_LMS = exports.FORMATTED_BH_NAMES = exports.FORMATTED_CLUE_NAMES = exports.FORMATTED_SKILL_NAMES = exports.FORMATTED_BOSS_NAMES = exports.ACTIVITIES = exports.BOSSES = exports.GAMEMODES = exports.BH_MODES = exports.CLUES = exports.SKILLS = exports.GAMEMODE_URL = exports.SCORES_URL = exports.JSON_STATS_URL = exports.STATS_URL = exports.BASE_URL = void 0;
|
27
|
+
exports.HiScoresError = exports.PlayerNotFoundError = exports.InvalidRSNError = exports.InvalidFormatError = exports.HISCORES_ERROR = exports.PLAYER_NOT_FOUND_ERROR = exports.INVALID_FORMAT_ERROR = exports.FORMATTED_RIFTS_CLOSED = exports.FORMATTED_DEADMAN_POINTS = exports.FORMATTED_LEAGUE_POINTS = exports.FORMATTED_SOUL_WARS = exports.FORMATTED_PVP_ARENA = exports.FORMATTED_LMS = exports.FORMATTED_BH_NAMES = exports.FORMATTED_CLUE_NAMES = exports.FORMATTED_SKILL_NAMES = exports.FORMATTED_BOSS_NAMES = exports.ACTIVITIES = exports.BOSSES = exports.GAMEMODES = exports.BH_MODES = exports.CLUES = exports.SKILLS = exports.GAMEMODE_URL = exports.SCORES_URL = exports.JSON_STATS_URL = exports.STATS_URL = exports.BASE_URL = void 0;
|
13
28
|
exports.BASE_URL = 'https://secure.runescape.com/m=hiscore_oldschool';
|
14
29
|
exports.STATS_URL = 'index_lite.ws?player=';
|
15
30
|
exports.JSON_STATS_URL = 'index_lite.json?player=';
|
@@ -133,6 +148,7 @@ exports.BOSSES = [
|
|
133
148
|
];
|
134
149
|
exports.ACTIVITIES = __spreadArray([
|
135
150
|
'leaguePoints',
|
151
|
+
'deadmanPoints',
|
136
152
|
'hunterBHV2',
|
137
153
|
'rogueBHV2',
|
138
154
|
'hunterBH',
|
@@ -254,6 +270,52 @@ exports.FORMATTED_LMS = 'LMS - Rank';
|
|
254
270
|
exports.FORMATTED_PVP_ARENA = 'PvP Arena - Rank';
|
255
271
|
exports.FORMATTED_SOUL_WARS = 'Soul Wars Zeal';
|
256
272
|
exports.FORMATTED_LEAGUE_POINTS = 'League Points';
|
273
|
+
exports.FORMATTED_DEADMAN_POINTS = 'Deadman Points';
|
257
274
|
exports.FORMATTED_RIFTS_CLOSED = 'Rifts closed';
|
258
275
|
exports.INVALID_FORMAT_ERROR = 'Invalid hiscores format';
|
259
276
|
exports.PLAYER_NOT_FOUND_ERROR = 'Player not found';
|
277
|
+
exports.HISCORES_ERROR = 'HiScores not responding';
|
278
|
+
var InvalidFormatError = /** @class */ (function (_super) {
|
279
|
+
__extends(InvalidFormatError, _super);
|
280
|
+
function InvalidFormatError() {
|
281
|
+
var _this = _super.call(this, exports.INVALID_FORMAT_ERROR) || this;
|
282
|
+
_this.__proto__ = Error;
|
283
|
+
Object.setPrototypeOf(_this, InvalidFormatError.prototype);
|
284
|
+
return _this;
|
285
|
+
}
|
286
|
+
return InvalidFormatError;
|
287
|
+
}(Error));
|
288
|
+
exports.InvalidFormatError = InvalidFormatError;
|
289
|
+
var InvalidRSNError = /** @class */ (function (_super) {
|
290
|
+
__extends(InvalidRSNError, _super);
|
291
|
+
function InvalidRSNError(message) {
|
292
|
+
var _this = _super.call(this, message) || this;
|
293
|
+
_this.__proto__ = Error;
|
294
|
+
Object.setPrototypeOf(_this, InvalidRSNError.prototype);
|
295
|
+
return _this;
|
296
|
+
}
|
297
|
+
return InvalidRSNError;
|
298
|
+
}(Error));
|
299
|
+
exports.InvalidRSNError = InvalidRSNError;
|
300
|
+
var PlayerNotFoundError = /** @class */ (function (_super) {
|
301
|
+
__extends(PlayerNotFoundError, _super);
|
302
|
+
function PlayerNotFoundError() {
|
303
|
+
var _this = _super.call(this, exports.PLAYER_NOT_FOUND_ERROR) || this;
|
304
|
+
_this.__proto__ = Error;
|
305
|
+
Object.setPrototypeOf(_this, PlayerNotFoundError.prototype);
|
306
|
+
return _this;
|
307
|
+
}
|
308
|
+
return PlayerNotFoundError;
|
309
|
+
}(Error));
|
310
|
+
exports.PlayerNotFoundError = PlayerNotFoundError;
|
311
|
+
var HiScoresError = /** @class */ (function (_super) {
|
312
|
+
__extends(HiScoresError, _super);
|
313
|
+
function HiScoresError() {
|
314
|
+
var _this = _super.call(this, exports.HISCORES_ERROR) || this;
|
315
|
+
_this.__proto__ = Error;
|
316
|
+
Object.setPrototypeOf(_this, HiScoresError.prototype);
|
317
|
+
return _this;
|
318
|
+
}
|
319
|
+
return HiScoresError;
|
320
|
+
}(Error));
|
321
|
+
exports.HiScoresError = HiScoresError;
|
package/lib/utils/helpers.js
CHANGED
@@ -109,13 +109,13 @@ exports.httpGet = httpGet;
|
|
109
109
|
*/
|
110
110
|
var validateRSN = function (rsn) {
|
111
111
|
if (typeof rsn !== 'string') {
|
112
|
-
throw
|
112
|
+
throw new constants_1.InvalidRSNError('RSN must be a string');
|
113
113
|
}
|
114
114
|
else if (!/^[a-zA-Z0-9 _-]+$/.test(rsn)) {
|
115
|
-
throw
|
115
|
+
throw new constants_1.InvalidRSNError('RSN contains invalid character');
|
116
116
|
}
|
117
117
|
else if (rsn.length > 12 || rsn.length < 1) {
|
118
|
-
throw
|
118
|
+
throw new constants_1.InvalidRSNError('RSN must be between 1 and 12 characters');
|
119
119
|
}
|
120
120
|
};
|
121
121
|
exports.validateRSN = validateRSN;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "osrs-json-hiscores",
|
3
|
-
"version": "2.16.
|
3
|
+
"version": "2.16.3",
|
4
4
|
"description": "The Old School Runescape API wrapper that does more!",
|
5
5
|
"main": "lib/index.js",
|
6
6
|
"types": "lib/index.d.ts",
|
@@ -67,7 +67,10 @@
|
|
67
67
|
],
|
68
68
|
"ignorePatterns": [
|
69
69
|
"**/@types/*"
|
70
|
-
]
|
70
|
+
],
|
71
|
+
"rules": {
|
72
|
+
"max-classes-per-file": "off"
|
73
|
+
}
|
71
74
|
},
|
72
75
|
"prettier": {
|
73
76
|
"trailingComma": "none",
|