@wise-old-man/utils 1.0.4 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierrc +1 -1
- package/dist/jest.config.d.ts +3 -0
- package/dist/jest.config.js +10 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/{competitions.d.ts → src/competitions.d.ts} +0 -0
- package/dist/{competitions.js → src/competitions.js} +2 -2
- package/dist/src/competitions.js.map +1 -0
- package/dist/{countries.d.ts → src/countries.d.ts} +0 -0
- package/dist/{countries.js → src/countries.js} +0 -0
- package/dist/src/countries.js.map +1 -0
- package/dist/{experience.d.ts → src/experience.d.ts} +3 -2
- package/dist/{experience.js → src/experience.js} +4 -2
- package/dist/src/experience.js.map +1 -0
- package/dist/{groups.d.ts → src/groups.d.ts} +2 -1
- package/dist/{groups.js → src/groups.js} +4 -2
- package/dist/src/groups.js.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +0 -0
- package/dist/{index.js → src/index.js} +0 -0
- package/dist/src/index.js.map +1 -0
- package/dist/{metrics.d.ts → src/metrics.d.ts} +16 -1
- package/dist/{metrics.js → src/metrics.js} +292 -2
- package/dist/src/metrics.js.map +1 -0
- package/dist/{numbers.d.ts → src/numbers.d.ts} +0 -0
- package/dist/{numbers.js → src/numbers.js} +0 -0
- package/dist/src/numbers.js.map +1 -0
- package/dist/{periods.d.ts → src/periods.d.ts} +0 -0
- package/dist/{periods.js → src/periods.js} +1 -1
- package/dist/src/periods.js.map +1 -0
- package/dist/{players.d.ts → src/players.d.ts} +4 -4
- package/dist/{players.js → src/players.js} +5 -4
- package/dist/src/players.js.map +1 -0
- package/dist/src/strings.d.ts +3 -0
- package/dist/{strings.js → src/strings.js} +1 -7
- package/dist/src/strings.js.map +1 -0
- package/jest.config.ts +10 -0
- package/package.json +7 -2
- package/src/competitions.ts +2 -2
- package/src/experience.ts +12 -3
- package/src/groups.ts +3 -2
- package/src/metrics.ts +364 -3
- package/src/periods.ts +1 -1
- package/src/players.ts +7 -6
- package/src/strings.ts +4 -7
- package/tests/competitions.test.ts +32 -0
- package/tests/countries.test.ts +22 -0
- package/tests/experience.test.ts +23 -0
- package/tests/groups.test.ts +14 -0
- package/tests/metrics.test.ts +113 -0
- package/tests/numbers.test.ts +9 -0
- package/tests/periods.test.ts +49 -0
- package/tests/players.test.ts +44 -0
- package/tests/strings.test.ts +27 -0
- package/tsconfig.json +1 -1
- package/dist/competitions.js.map +0 -1
- package/dist/countries.js.map +0 -1
- package/dist/experience.js.map +0 -1
- package/dist/groups.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/metrics.js.map +0 -1
- package/dist/numbers.js.map +0 -1
- package/dist/periods.js.map +0 -1
- package/dist/players.js.map +0 -1
- package/dist/strings.d.ts +0 -3
- package/dist/strings.js.map +0 -1
|
@@ -25,7 +25,7 @@ exports.PERIODS = PERIODS;
|
|
|
25
25
|
function findPeriod(periodName) {
|
|
26
26
|
for (var _i = 0, _a = Object.entries(PeriodProps); _i < _a.length; _i++) {
|
|
27
27
|
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
28
|
-
if (value.name === periodName)
|
|
28
|
+
if (value.name.toUpperCase() === periodName.toUpperCase())
|
|
29
29
|
return key;
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"periods.js","sourceRoot":"","sources":["../../src/periods.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ declare enum PlayerType {
|
|
|
2
2
|
UNKNOWN = "unknown",
|
|
3
3
|
REGULAR = "regular",
|
|
4
4
|
IRONMAN = "ironman",
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
HARDCORE = "hardcore",
|
|
6
|
+
ULTIMATE = "ultimate"
|
|
7
7
|
}
|
|
8
8
|
declare enum PlayerBuild {
|
|
9
9
|
MAIN = "main",
|
|
@@ -23,10 +23,10 @@ declare const PlayerTypeProps: {
|
|
|
23
23
|
ironman: {
|
|
24
24
|
name: string;
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
hardcore: {
|
|
27
27
|
name: string;
|
|
28
28
|
};
|
|
29
|
-
|
|
29
|
+
ultimate: {
|
|
30
30
|
name: string;
|
|
31
31
|
};
|
|
32
32
|
};
|
|
@@ -7,8 +7,8 @@ var PlayerType;
|
|
|
7
7
|
PlayerType["UNKNOWN"] = "unknown";
|
|
8
8
|
PlayerType["REGULAR"] = "regular";
|
|
9
9
|
PlayerType["IRONMAN"] = "ironman";
|
|
10
|
-
PlayerType["ULTIMATE"] = "ultimate";
|
|
11
10
|
PlayerType["HARDCORE"] = "hardcore";
|
|
11
|
+
PlayerType["ULTIMATE"] = "ultimate";
|
|
12
12
|
})(PlayerType || (PlayerType = {}));
|
|
13
13
|
exports.PlayerType = PlayerType;
|
|
14
14
|
var PlayerBuild;
|
|
@@ -25,8 +25,8 @@ var PlayerTypeProps = (_a = {},
|
|
|
25
25
|
_a[PlayerType.UNKNOWN] = { name: 'Unknown' },
|
|
26
26
|
_a[PlayerType.REGULAR] = { name: 'Regular' },
|
|
27
27
|
_a[PlayerType.IRONMAN] = { name: 'Ironman' },
|
|
28
|
-
_a[PlayerType.ULTIMATE] = { name: 'Ultimate' },
|
|
29
28
|
_a[PlayerType.HARDCORE] = { name: 'Hardcore' },
|
|
29
|
+
_a[PlayerType.ULTIMATE] = { name: 'Ultimate' },
|
|
30
30
|
_a);
|
|
31
31
|
exports.PlayerTypeProps = PlayerTypeProps;
|
|
32
32
|
var PlayerBuildProps = (_b = {},
|
|
@@ -45,7 +45,7 @@ exports.PLAYER_BUILDS = PLAYER_BUILDS;
|
|
|
45
45
|
function findPlayerType(typeName) {
|
|
46
46
|
for (var _i = 0, _a = Object.entries(PlayerTypeProps); _i < _a.length; _i++) {
|
|
47
47
|
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
48
|
-
if (value.name === typeName)
|
|
48
|
+
if (value.name.toUpperCase() === typeName.toUpperCase())
|
|
49
49
|
return key;
|
|
50
50
|
}
|
|
51
51
|
return null;
|
|
@@ -54,7 +54,7 @@ exports.findPlayerType = findPlayerType;
|
|
|
54
54
|
function findPlayerBuild(buildName) {
|
|
55
55
|
for (var _i = 0, _a = Object.entries(PlayerBuildProps); _i < _a.length; _i++) {
|
|
56
56
|
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
57
|
-
if (value.name === buildName)
|
|
57
|
+
if (value.name.toUpperCase() === buildName.toUpperCase())
|
|
58
58
|
return key;
|
|
59
59
|
}
|
|
60
60
|
return null;
|
|
@@ -64,6 +64,7 @@ function standardizeUsername(username) {
|
|
|
64
64
|
return sanitizeUsername(username).toLowerCase();
|
|
65
65
|
}
|
|
66
66
|
exports.standardizeUsername = standardizeUsername;
|
|
67
|
+
// TODO: should this also remove any non alphanumeric symbols?
|
|
67
68
|
function sanitizeUsername(username) {
|
|
68
69
|
return username.replace(/[-_\s]/g, ' ').trim();
|
|
69
70
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"players.js","sourceRoot":"","sources":["../../src/players.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.padNumber = exports.formatNumber =
|
|
4
|
-
function capitalize(string) {
|
|
5
|
-
if (!string)
|
|
6
|
-
return null;
|
|
7
|
-
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
8
|
-
}
|
|
9
|
-
exports.capitalize = capitalize;
|
|
3
|
+
exports.padNumber = exports.formatNumber = void 0;
|
|
10
4
|
function formatNumber(num, withLetters) {
|
|
11
5
|
if (withLetters === void 0) { withLetters = false; }
|
|
12
6
|
if (num === undefined || num === null)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/strings.ts"],"names":[],"mappings":";;;AAAA,SAAS,YAAY,CAAC,GAAW,EAAE,WAAmB;IAAnB,4BAAA,EAAA,mBAAmB;IACpD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAEjD,qBAAqB;IACrB,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;KAC3F;IAED,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;QACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;KACjE;IAED,eAAe;IACf,IAAI,GAAG,GAAG,QAAU,IAAI,GAAG,GAAG,CAAC,QAAU,EAAE;QACzC,OAAO,UAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAG,CAAC;KACrC;IAED,cAAc;IACd,IAAI,GAAG,GAAG,UAAa,IAAI,GAAG,GAAG,CAAC,UAAa,EAAE;QAC/C,OAAO,UAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAG,CAAC;KACvE;IAED,OAAO,UAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,MAAG,CAAC;AAC3E,CAAC;AAOQ,oCAAY;AALrB,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,WAAI,KAAK,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACrD,CAAC;AAEsB,8BAAS"}
|
package/jest.config.ts
ADDED
package/package.json
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wise-old-man/utils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "A few constants and helper functions to be re-used in all repositories under the WiseOldMan project.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"prepublish": "tsc",
|
|
9
|
-
"build": "tsc"
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"test": "jest"
|
|
10
11
|
},
|
|
11
12
|
"keywords": [],
|
|
12
13
|
"author": "",
|
|
13
14
|
"license": "ISC",
|
|
14
15
|
"devDependencies": {
|
|
16
|
+
"@types/jest": "^27.0.3",
|
|
15
17
|
"@types/lodash": "^4.14.177",
|
|
18
|
+
"jest": "^27.4.5",
|
|
19
|
+
"ts-jest": "^27.1.2",
|
|
20
|
+
"ts-node": "^10.4.0",
|
|
16
21
|
"typescript": "^4.4.3"
|
|
17
22
|
},
|
|
18
23
|
"dependencies": {
|
package/src/competitions.ts
CHANGED
|
@@ -10,8 +10,8 @@ enum CompetitionStatus {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
const CompetitionTypeProps = {
|
|
13
|
-
[CompetitionType.CLASSIC]: { name: '
|
|
14
|
-
[CompetitionType.TEAM]: { name: '
|
|
13
|
+
[CompetitionType.CLASSIC]: { name: 'Classic' },
|
|
14
|
+
[CompetitionType.TEAM]: { name: 'Team' }
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
const CompetitionStatusProps = {
|
package/src/experience.ts
CHANGED
|
@@ -8,10 +8,10 @@ const MAX_VIRTUAL_LEVEL = 126;
|
|
|
8
8
|
const MAX_SKILL_EXP = 200_000_000;
|
|
9
9
|
|
|
10
10
|
// The minimum skill exp for level 99
|
|
11
|
-
const SKILL_EXP_AT_99 =
|
|
11
|
+
const SKILL_EXP_AT_99 = 13_034_431;
|
|
12
12
|
|
|
13
13
|
// The maximum skill at exactly 99 on all skills
|
|
14
|
-
|
|
14
|
+
const CAPPED_MAX_TOTAL_XP = 23 * SKILL_EXP_AT_99;
|
|
15
15
|
|
|
16
16
|
// Builds a lookup table for each level's required experience
|
|
17
17
|
// exp = XP_FOR_LEVEL[level - 1] || 13m = XP_FOR_LEVEL[98]
|
|
@@ -74,4 +74,13 @@ function getCombatLevel(
|
|
|
74
74
|
return Math.floor(baseCombat + Math.max(meleeCombat, rangeCombat, mageCombat));
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export {
|
|
77
|
+
export {
|
|
78
|
+
MAX_LEVEL,
|
|
79
|
+
MAX_VIRTUAL_LEVEL,
|
|
80
|
+
MAX_SKILL_EXP,
|
|
81
|
+
CAPPED_MAX_TOTAL_XP,
|
|
82
|
+
SKILL_EXP_AT_99,
|
|
83
|
+
getExpForLevel,
|
|
84
|
+
getLevel,
|
|
85
|
+
getCombatLevel
|
|
86
|
+
};
|
package/src/groups.ts
CHANGED
|
@@ -543,13 +543,14 @@ const GroupRoleProps = {
|
|
|
543
543
|
};
|
|
544
544
|
|
|
545
545
|
const GROUP_ROLES = Object.values(GroupRole);
|
|
546
|
+
const PRIVELEGED_GROUP_ROLES = GROUP_ROLES.filter(r => GroupRoleProps[r].isPriveleged);
|
|
546
547
|
|
|
547
548
|
function findGroupRole(roleName: string): GroupRole | null {
|
|
548
549
|
for (var [key, value] of Object.entries(GroupRoleProps)) {
|
|
549
|
-
if (value.name === roleName) return key as GroupRole;
|
|
550
|
+
if (value.name.toUpperCase() === roleName.toUpperCase()) return key as GroupRole;
|
|
550
551
|
}
|
|
551
552
|
|
|
552
553
|
return null;
|
|
553
554
|
}
|
|
554
555
|
|
|
555
|
-
export { GroupRole, GroupRoleProps, GROUP_ROLES, findGroupRole };
|
|
556
|
+
export { GroupRole, GroupRoleProps, GROUP_ROLES, PRIVELEGED_GROUP_ROLES, findGroupRole };
|
package/src/metrics.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mapValues } from 'lodash';
|
|
1
|
+
import { mapValues, capitalize } from 'lodash';
|
|
2
2
|
|
|
3
3
|
enum Skill {
|
|
4
4
|
OVERALL = 'overall',
|
|
@@ -241,14 +241,360 @@ const BOSSES = Object.values(Boss);
|
|
|
241
241
|
const ACTIVITIES = Object.values(Activity);
|
|
242
242
|
const VIRTUAL_METRICS = Object.values(VirtualMetric);
|
|
243
243
|
|
|
244
|
+
const METRICS = [...SKILLS, ...BOSSES, ...ACTIVITIES, ...VIRTUAL_METRICS];
|
|
245
|
+
|
|
246
|
+
const F2P_BOSSES = BOSSES.filter(b => !MetricProps[b].isMembers);
|
|
247
|
+
const MEMBER_SKILLS = SKILLS.filter(s => MetricProps[s].isMembers);
|
|
248
|
+
const COMBAT_SKILLS = SKILLS.filter(s => MetricProps[s].isCombat);
|
|
249
|
+
|
|
244
250
|
function findMetric(metricName: string): Metric | null {
|
|
245
251
|
for (var [key, value] of Object.entries(MetricProps)) {
|
|
246
|
-
if (value.name === metricName) return key as Metric;
|
|
252
|
+
if (value.name.toUpperCase() === metricName.toUpperCase()) return key as Metric;
|
|
247
253
|
}
|
|
248
254
|
|
|
249
255
|
return null;
|
|
250
256
|
}
|
|
251
257
|
|
|
258
|
+
function isSkill(metric: Metric) {
|
|
259
|
+
return metric in SkillProps;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function isBoss(metric: Metric) {
|
|
263
|
+
return metric in BossProps;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function isActivity(metric: Metric) {
|
|
267
|
+
return metric in ActivityProps;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function isVirtualMetric(metric: Metric) {
|
|
271
|
+
return metric in VirtualMetricProps;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function getMetricRankKey(metric: Metric) {
|
|
275
|
+
return `${metric}Rank`;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function getMetricValueKey(metric: Metric) {
|
|
279
|
+
return `${metric}${capitalize(MetricProps[metric].measure)}`;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function getMetricMeasure(metric: Metric) {
|
|
283
|
+
return MetricProps[metric].measure;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function getMetricName(metric: Metric) {
|
|
287
|
+
return MetricProps[metric].name;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function getMinimumBossKc(metric: Metric) {
|
|
291
|
+
return isBoss(metric) ? MetricProps[metric as Boss].minimumKc : 0;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function getParentVirtualMetric(metric: Metric) {
|
|
295
|
+
if (isBoss(metric)) return Metrics.EHB;
|
|
296
|
+
if (isSkill(metric)) return Metrics.EHP;
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function parseMetricAbbreviation(abbreviation: string): string | null {
|
|
301
|
+
if (!abbreviation || abbreviation.length === 0) {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
switch (abbreviation.toLowerCase()) {
|
|
306
|
+
// Bosses
|
|
307
|
+
case 'sire':
|
|
308
|
+
return Metrics.ABYSSAL_SIRE;
|
|
309
|
+
|
|
310
|
+
case 'hydra':
|
|
311
|
+
return Metrics.ALCHEMICAL_HYDRA;
|
|
312
|
+
|
|
313
|
+
case 'barrows':
|
|
314
|
+
return Metrics.BARROWS_CHESTS;
|
|
315
|
+
|
|
316
|
+
case 'bryo':
|
|
317
|
+
return Metrics.BRYOPHYTA;
|
|
318
|
+
|
|
319
|
+
case 'cerb':
|
|
320
|
+
return Metrics.CERBERUS;
|
|
321
|
+
|
|
322
|
+
case 'cox':
|
|
323
|
+
case 'xeric':
|
|
324
|
+
case 'chambers':
|
|
325
|
+
case 'olm':
|
|
326
|
+
case 'raids':
|
|
327
|
+
return Metrics.CHAMBERS_OF_XERIC;
|
|
328
|
+
|
|
329
|
+
case 'cox-cm':
|
|
330
|
+
case 'xeric-cm':
|
|
331
|
+
case 'chambers-cm':
|
|
332
|
+
case 'olm-cm':
|
|
333
|
+
case 'raids-cm':
|
|
334
|
+
return Metrics.CHAMBERS_OF_XERIC_CM;
|
|
335
|
+
|
|
336
|
+
case 'chaos-ele':
|
|
337
|
+
return Metrics.CHAOS_ELEMENTAL;
|
|
338
|
+
|
|
339
|
+
case 'fanatic':
|
|
340
|
+
return Metrics.CHAOS_FANATIC;
|
|
341
|
+
|
|
342
|
+
case 'sara':
|
|
343
|
+
case 'saradomin':
|
|
344
|
+
case 'zilyana':
|
|
345
|
+
case 'zily':
|
|
346
|
+
return Metrics.COMMANDER_ZILYANA;
|
|
347
|
+
|
|
348
|
+
case 'corp':
|
|
349
|
+
return Metrics.CORPOREAL_BEAST;
|
|
350
|
+
|
|
351
|
+
case 'crazy-arch':
|
|
352
|
+
return Metrics.CRAZY_ARCHAEOLOGIST;
|
|
353
|
+
|
|
354
|
+
case 'prime':
|
|
355
|
+
return Metrics.DAGANNOTH_PRIME;
|
|
356
|
+
case 'rex':
|
|
357
|
+
return Metrics.DAGANNOTH_REX;
|
|
358
|
+
case 'supreme':
|
|
359
|
+
return Metrics.DAGANNOTH_SUPREME;
|
|
360
|
+
|
|
361
|
+
case 'deranged-arch':
|
|
362
|
+
return Metrics.DERANGED_ARCHAEOLOGIST;
|
|
363
|
+
|
|
364
|
+
case 'bandos':
|
|
365
|
+
case 'graardor':
|
|
366
|
+
return Metrics.GENERAL_GRAARDOR;
|
|
367
|
+
|
|
368
|
+
case 'mole':
|
|
369
|
+
return Metrics.GIANT_MOLE;
|
|
370
|
+
|
|
371
|
+
case 'dusk':
|
|
372
|
+
case 'dawn':
|
|
373
|
+
case 'gargs':
|
|
374
|
+
case 'guardians':
|
|
375
|
+
case 'ggs':
|
|
376
|
+
return Metrics.GROTESQUE_GUARDIANS;
|
|
377
|
+
|
|
378
|
+
case 'kq':
|
|
379
|
+
return Metrics.KALPHITE_QUEEN;
|
|
380
|
+
|
|
381
|
+
case 'kbd':
|
|
382
|
+
return Metrics.KING_BLACK_DRAGON;
|
|
383
|
+
|
|
384
|
+
case 'kree':
|
|
385
|
+
case 'kreearra':
|
|
386
|
+
case 'armadyl':
|
|
387
|
+
case 'arma':
|
|
388
|
+
return Metrics.KREEARRA;
|
|
389
|
+
|
|
390
|
+
case 'zammy':
|
|
391
|
+
case 'zamorak':
|
|
392
|
+
case 'kril':
|
|
393
|
+
case 'kril-tsutsaroth':
|
|
394
|
+
return Metrics.KRIL_TSUTSAROTH;
|
|
395
|
+
|
|
396
|
+
case 'gaunt':
|
|
397
|
+
case 'gauntlet':
|
|
398
|
+
case 'the-gauntlet':
|
|
399
|
+
return Metrics.THE_GAUNTLET;
|
|
400
|
+
|
|
401
|
+
case 'cgaunt':
|
|
402
|
+
case 'cgauntlet':
|
|
403
|
+
case 'corrupted':
|
|
404
|
+
case 'corrupted-gauntlet':
|
|
405
|
+
case 'the-corrupted-gauntlet':
|
|
406
|
+
return Metrics.THE_CORRUPTED_GAUNTLET;
|
|
407
|
+
|
|
408
|
+
case 'tob':
|
|
409
|
+
case 'theatre':
|
|
410
|
+
case 'verzik':
|
|
411
|
+
case 'tob-normal':
|
|
412
|
+
return Metrics.THEATRE_OF_BLOOD;
|
|
413
|
+
|
|
414
|
+
case 'tob-hm':
|
|
415
|
+
case 'tob-cm':
|
|
416
|
+
case 'tob-hard-mode':
|
|
417
|
+
case 'tob-hard':
|
|
418
|
+
return Metrics.THEATRE_OF_BLOOD_HARD_MODE;
|
|
419
|
+
|
|
420
|
+
case 'nm':
|
|
421
|
+
case 'tnm':
|
|
422
|
+
case 'nmare':
|
|
423
|
+
case 'the-nightmare':
|
|
424
|
+
return Metrics.NIGHTMARE;
|
|
425
|
+
|
|
426
|
+
case 'pnm':
|
|
427
|
+
case 'phosani':
|
|
428
|
+
case 'phosanis':
|
|
429
|
+
case 'phosani-nm':
|
|
430
|
+
case 'phosani-nightmare':
|
|
431
|
+
case 'phosanis nightmare':
|
|
432
|
+
return Metrics.PHOSANIS_NIGHTMARE;
|
|
433
|
+
|
|
434
|
+
case 'thermy':
|
|
435
|
+
case 'smoke-devil':
|
|
436
|
+
return Metrics.THERMONUCLEAR_SMOKE_DEVIL;
|
|
437
|
+
|
|
438
|
+
case 'zuk':
|
|
439
|
+
case 'inferno':
|
|
440
|
+
return Metrics.TZKAL_ZUK;
|
|
441
|
+
|
|
442
|
+
case 'jad':
|
|
443
|
+
case 'fight-caves':
|
|
444
|
+
case 'fc':
|
|
445
|
+
return Metrics.TZTOK_JAD;
|
|
446
|
+
|
|
447
|
+
case 'vork':
|
|
448
|
+
case 'vorky':
|
|
449
|
+
return Metrics.VORKATH;
|
|
450
|
+
|
|
451
|
+
case 'wt':
|
|
452
|
+
return Metrics.WINTERTODT;
|
|
453
|
+
|
|
454
|
+
case 'snek':
|
|
455
|
+
case 'zul':
|
|
456
|
+
return Metrics.ZULRAH;
|
|
457
|
+
|
|
458
|
+
// Minigames and others
|
|
459
|
+
|
|
460
|
+
case 'all-clues':
|
|
461
|
+
case 'clues':
|
|
462
|
+
return Metrics.CLUE_SCROLLS_ALL;
|
|
463
|
+
|
|
464
|
+
case 'beginner':
|
|
465
|
+
case 'beginner-clues':
|
|
466
|
+
case 'beg-clues':
|
|
467
|
+
case 'beginners':
|
|
468
|
+
return Metrics.CLUE_SCROLLS_BEGINNER;
|
|
469
|
+
|
|
470
|
+
case 'easy':
|
|
471
|
+
case 'easy-clues':
|
|
472
|
+
case 'easies':
|
|
473
|
+
return Metrics.CLUE_SCROLLS_EASY;
|
|
474
|
+
|
|
475
|
+
case 'medium':
|
|
476
|
+
case 'med':
|
|
477
|
+
case 'meds':
|
|
478
|
+
case 'medium-clues':
|
|
479
|
+
case 'med-clues':
|
|
480
|
+
case 'mediums':
|
|
481
|
+
return Metrics.CLUE_SCROLLS_MEDIUM;
|
|
482
|
+
|
|
483
|
+
case 'hard':
|
|
484
|
+
case 'hard-clues':
|
|
485
|
+
case 'hards':
|
|
486
|
+
return Metrics.CLUE_SCROLLS_HARD;
|
|
487
|
+
|
|
488
|
+
case 'elite':
|
|
489
|
+
case 'elite-clues':
|
|
490
|
+
case 'elites':
|
|
491
|
+
return Metrics.CLUE_SCROLLS_ELITE;
|
|
492
|
+
|
|
493
|
+
case 'master':
|
|
494
|
+
case 'master-clues':
|
|
495
|
+
case 'masters':
|
|
496
|
+
return Metrics.CLUE_SCROLLS_MASTER;
|
|
497
|
+
|
|
498
|
+
case 'lms':
|
|
499
|
+
return Metrics.LAST_MAN_STANDING;
|
|
500
|
+
|
|
501
|
+
case 'league':
|
|
502
|
+
case 'lp':
|
|
503
|
+
case 'lps':
|
|
504
|
+
return Metrics.LEAGUE_POINTS;
|
|
505
|
+
|
|
506
|
+
case 'sw':
|
|
507
|
+
case 'zeal':
|
|
508
|
+
case 'soul-wars':
|
|
509
|
+
return Metrics.SOUL_WARS_ZEAL;
|
|
510
|
+
|
|
511
|
+
// Skills
|
|
512
|
+
|
|
513
|
+
case 'runecraft':
|
|
514
|
+
case 'rc':
|
|
515
|
+
return Metrics.RUNECRAFTING;
|
|
516
|
+
|
|
517
|
+
case 'att':
|
|
518
|
+
case 'atk':
|
|
519
|
+
case 'attk':
|
|
520
|
+
return Metrics.ATTACK;
|
|
521
|
+
|
|
522
|
+
case 'def':
|
|
523
|
+
case 'defense':
|
|
524
|
+
return Metrics.DEFENCE;
|
|
525
|
+
|
|
526
|
+
case 'str':
|
|
527
|
+
return Metrics.STRENGTH;
|
|
528
|
+
|
|
529
|
+
case 'hp':
|
|
530
|
+
return Metrics.HITPOINTS;
|
|
531
|
+
|
|
532
|
+
case 'range':
|
|
533
|
+
return Metrics.RANGED;
|
|
534
|
+
|
|
535
|
+
case 'pray':
|
|
536
|
+
return Metrics.PRAYER;
|
|
537
|
+
|
|
538
|
+
case 'mage':
|
|
539
|
+
return Metrics.MAGIC;
|
|
540
|
+
|
|
541
|
+
case 'cook':
|
|
542
|
+
return Metrics.COOKING;
|
|
543
|
+
|
|
544
|
+
case 'wc':
|
|
545
|
+
return Metrics.WOODCUTTING;
|
|
546
|
+
|
|
547
|
+
case 'fletch':
|
|
548
|
+
return Metrics.FLETCHING;
|
|
549
|
+
|
|
550
|
+
case 'fish':
|
|
551
|
+
return Metrics.FISHING;
|
|
552
|
+
|
|
553
|
+
case 'fm':
|
|
554
|
+
case 'burning':
|
|
555
|
+
return Metrics.FIREMAKING;
|
|
556
|
+
|
|
557
|
+
case 'craft':
|
|
558
|
+
return Metrics.CRAFTING;
|
|
559
|
+
|
|
560
|
+
case 'sm':
|
|
561
|
+
case 'smith':
|
|
562
|
+
return Metrics.SMITHING;
|
|
563
|
+
|
|
564
|
+
case 'mine':
|
|
565
|
+
case 'smash':
|
|
566
|
+
return Metrics.MINING;
|
|
567
|
+
|
|
568
|
+
case 'herb':
|
|
569
|
+
return Metrics.HERBLORE;
|
|
570
|
+
|
|
571
|
+
case 'agi':
|
|
572
|
+
case 'agil':
|
|
573
|
+
return Metrics.AGILITY;
|
|
574
|
+
|
|
575
|
+
case 'thief':
|
|
576
|
+
return Metrics.THIEVING;
|
|
577
|
+
|
|
578
|
+
case 'slay':
|
|
579
|
+
return Metrics.SLAYER;
|
|
580
|
+
|
|
581
|
+
case 'farm':
|
|
582
|
+
return Metrics.FARMING;
|
|
583
|
+
|
|
584
|
+
case 'hunt':
|
|
585
|
+
case 'hunting':
|
|
586
|
+
return Metrics.HUNTER;
|
|
587
|
+
|
|
588
|
+
case 'con':
|
|
589
|
+
case 'cons':
|
|
590
|
+
case 'const':
|
|
591
|
+
return Metrics.CONSTRUCTION;
|
|
592
|
+
|
|
593
|
+
default:
|
|
594
|
+
return abbreviation;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
252
598
|
export {
|
|
253
599
|
// Types
|
|
254
600
|
Metric,
|
|
@@ -262,6 +608,21 @@ export {
|
|
|
262
608
|
BOSSES,
|
|
263
609
|
ACTIVITIES,
|
|
264
610
|
VIRTUAL_METRICS,
|
|
611
|
+
METRICS,
|
|
612
|
+
F2P_BOSSES,
|
|
613
|
+
MEMBER_SKILLS,
|
|
614
|
+
COMBAT_SKILLS,
|
|
265
615
|
// Functions
|
|
266
|
-
findMetric
|
|
616
|
+
findMetric,
|
|
617
|
+
parseMetricAbbreviation,
|
|
618
|
+
getMetricRankKey,
|
|
619
|
+
getMetricValueKey,
|
|
620
|
+
getMetricMeasure,
|
|
621
|
+
getMetricName,
|
|
622
|
+
getMinimumBossKc,
|
|
623
|
+
getParentVirtualMetric,
|
|
624
|
+
isSkill,
|
|
625
|
+
isBoss,
|
|
626
|
+
isActivity,
|
|
627
|
+
isVirtualMetric
|
|
267
628
|
};
|
package/src/periods.ts
CHANGED
|
@@ -20,7 +20,7 @@ const PERIODS = Object.values(Period);
|
|
|
20
20
|
|
|
21
21
|
function findPeriod(periodName: string): Period | null {
|
|
22
22
|
for (var [key, value] of Object.entries(PeriodProps)) {
|
|
23
|
-
if (value.name === periodName) return key as Period;
|
|
23
|
+
if (value.name.toUpperCase() === periodName.toUpperCase()) return key as Period;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
return null;
|
package/src/players.ts
CHANGED
|
@@ -2,8 +2,8 @@ enum PlayerType {
|
|
|
2
2
|
UNKNOWN = 'unknown',
|
|
3
3
|
REGULAR = 'regular',
|
|
4
4
|
IRONMAN = 'ironman',
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
HARDCORE = 'hardcore',
|
|
6
|
+
ULTIMATE = 'ultimate'
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
enum PlayerBuild {
|
|
@@ -19,8 +19,8 @@ const PlayerTypeProps = {
|
|
|
19
19
|
[PlayerType.UNKNOWN]: { name: 'Unknown' },
|
|
20
20
|
[PlayerType.REGULAR]: { name: 'Regular' },
|
|
21
21
|
[PlayerType.IRONMAN]: { name: 'Ironman' },
|
|
22
|
-
[PlayerType.
|
|
23
|
-
[PlayerType.
|
|
22
|
+
[PlayerType.HARDCORE]: { name: 'Hardcore' },
|
|
23
|
+
[PlayerType.ULTIMATE]: { name: 'Ultimate' }
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
const PlayerBuildProps = {
|
|
@@ -37,7 +37,7 @@ const PLAYER_BUILDS = Object.values(PlayerBuild);
|
|
|
37
37
|
|
|
38
38
|
function findPlayerType(typeName: string): PlayerType | null {
|
|
39
39
|
for (var [key, value] of Object.entries(PlayerTypeProps)) {
|
|
40
|
-
if (value.name === typeName) return key as PlayerType;
|
|
40
|
+
if (value.name.toUpperCase() === typeName.toUpperCase()) return key as PlayerType;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
return null;
|
|
@@ -45,7 +45,7 @@ function findPlayerType(typeName: string): PlayerType | null {
|
|
|
45
45
|
|
|
46
46
|
function findPlayerBuild(buildName: string): PlayerBuild | null {
|
|
47
47
|
for (var [key, value] of Object.entries(PlayerBuildProps)) {
|
|
48
|
-
if (value.name === buildName) return key as PlayerBuild;
|
|
48
|
+
if (value.name.toUpperCase() === buildName.toUpperCase()) return key as PlayerBuild;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
return null;
|
|
@@ -55,6 +55,7 @@ function standardizeUsername(username) {
|
|
|
55
55
|
return sanitizeUsername(username).toLowerCase();
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// TODO: should this also remove any non alphanumeric symbols?
|
|
58
59
|
function sanitizeUsername(username) {
|
|
59
60
|
return username.replace(/[-_\s]/g, ' ').trim();
|
|
60
61
|
}
|
package/src/strings.ts
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
if (!string) return null;
|
|
3
|
-
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export function formatNumber(num: number, withLetters = false) {
|
|
1
|
+
function formatNumber(num: number, withLetters = false) {
|
|
7
2
|
if (num === undefined || num === null) return -1;
|
|
8
3
|
|
|
9
4
|
// If number is float
|
|
@@ -28,7 +23,9 @@ export function formatNumber(num: number, withLetters = false) {
|
|
|
28
23
|
return `${Math.round((num / 1000000000 + Number.EPSILON) * 100) / 100}b`;
|
|
29
24
|
}
|
|
30
25
|
|
|
31
|
-
|
|
26
|
+
function padNumber(value: number): string {
|
|
32
27
|
if (!value) return '00';
|
|
33
28
|
return value < 10 ? `0${value}` : value.toString();
|
|
34
29
|
}
|
|
30
|
+
|
|
31
|
+
export { formatNumber, padNumber };
|