Compare commits

..

126 Commits

Author SHA1 Message Date
maxswa
e77737f422 Add Guardians of the Rift. 2022-04-18 15:44:45 -04:00
Max Swartwout
3a72315498 Merge pull request #49 from maxswa/dependabot/npm_and_yarn/follow-redirects-1.14.8
Bump follow-redirects from 1.14.7 to 1.14.8
2022-02-15 14:37:28 -05:00
dependabot[bot]
c1c9833ad0 Bump follow-redirects from 1.14.7 to 1.14.8
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-12 12:01:29 +00:00
Max Swartwout
9fe03746e1 Merge pull request #48 from maxswa/dependabot/npm_and_yarn/follow-redirects-1.14.7
Bump follow-redirects from 1.14.4 to 1.14.7
2022-01-18 10:42:22 -05:00
dependabot[bot]
66a4fb47a6 Bump follow-redirects from 1.14.4 to 1.14.7
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.4 to 1.14.7.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.4...v1.14.7)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 14:22:21 +00:00
Max Swartwout
83c44148a7 Merge pull request #47 from maxswa/fix-tests-nex
Fix tests
2022-01-05 21:54:48 -05:00
maxswa
44dea6b35c Add line for nex in lynxTitanStats.csv 2022-01-05 21:50:28 -05:00
maxswa
0bf491638c v2.7.0 2022-01-05 10:04:11 -05:00
Max Swartwout
febca534b0 Merge pull request #45 from maxswa/add-nex
Add Nex.
2022-01-05 09:57:56 -05:00
Max Swartwout
8daee5c39b Merge pull request #46 from molo-pl/main
Throw error for unknown hiscores CSV format
2022-01-05 09:52:42 -05:00
molo-pl
f98cf8aaaa Throw error for unknown hiscores CSV format 2022-01-04 23:05:34 +01:00
maxswa
5d9f6a6bac Add Nex. 2021-12-19 21:40:09 -05:00
Max Swartwout
8737b50a82 Merge pull request #44 from maxswa/dependabot/npm_and_yarn/axios-0.21.2
Bump axios from 0.21.1 to 0.21.2
2021-09-27 16:38:12 -04:00
dependabot[bot]
1255e7e3d2 Bump axios from 0.21.1 to 0.21.2
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-27 20:36:33 +00:00
Max Swartwout
f4135d0b0f Merge pull request #42 from maxswa/dependabot/npm_and_yarn/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7
2021-09-27 16:36:09 -04:00
Max Swartwout
6135ff459c Merge pull request #43 from maxswa/dependabot/npm_and_yarn/tmpl-1.0.5
Bump tmpl from 1.0.4 to 1.0.5
2021-09-27 16:36:00 -04:00
dependabot[bot]
9fb7e4cebc Bump tmpl from 1.0.4 to 1.0.5
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-21 04:35:18 +00:00
dependabot[bot]
11350b2444 Bump path-parse from 1.0.6 to 1.0.7
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-11 02:52:55 +00:00
maxswa
e0d6c5b20f v2.6.0 2021-07-02 10:53:19 -04:00
Max Swartwout
c8a4440ac3 Merge pull request #41 from Not-Jayden/phosanis-nightmare
New Boss: Phosani's Nightmare
2021-07-02 10:49:19 -04:00
Not-Jayden
f3781cf142 add to readme 2021-07-02 18:09:10 +08:00
Not-Jayden
5fbc04217b Merge branch 'phosanis-nightmare' of https://github.com/Not-Jayden/osrs-json-hiscores into phosanis-nightmare 2021-07-02 13:20:45 +08:00
Not-Jayden
eb5d0ba49f add to lynxTitanStats.csv 2021-07-02 13:20:33 +08:00
Not-Jayden
c68e3bebea Update __tests__/hiscores.test.ts 2021-07-02 13:13:07 +08:00
Not-Jayden
aa6fd6f39a add phosani's nightmare to api 2021-07-01 20:14:31 +08:00
maxswa
cc9aae8ced v2.5.2 2021-06-11 14:46:04 -04:00
Max Swartwout
12882b4e34 Merge pull request #37 from Not-Jayden/revert-seasonal-changes
[Bug] Remove conditional `seasonal` gameMode logic for bosses
2021-06-11 14:44:07 -04:00
Max Swartwout
b17a8b9299 Merge pull request #39 from maxswa/dependabot/npm_and_yarn/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9
2021-06-11 14:42:54 -04:00
dependabot[bot]
50f2c19257 Bump hosted-git-info from 2.8.8 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

---
updated-dependencies:
- dependency-name: hosted-git-info
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-11 18:40:53 +00:00
Max Swartwout
d892f8e67b Merge pull request #38 from maxswa/dependabot/npm_and_yarn/normalize-url-4.5.1
Bump normalize-url from 4.5.0 to 4.5.1
2021-06-11 14:39:31 -04:00
dependabot[bot]
af5664ae6e Bump normalize-url from 4.5.0 to 4.5.1
Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1.
- [Release notes](https://github.com/sindresorhus/normalize-url/releases)
- [Commits](https://github.com/sindresorhus/normalize-url/commits)

---
updated-dependencies:
- dependency-name: normalize-url
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-09 17:37:06 +00:00
NotJayden
20c5c2f730 delete seasonal changes 2021-06-10 00:15:11 +08:00
Max Swartwout
04e59cff04 Merge pull request #36 from maxswa/dependabot/npm_and_yarn/trim-newlines-3.0.1
Bump trim-newlines from 3.0.0 to 3.0.1
2021-06-08 17:14:27 -04:00
dependabot[bot]
ad2249ba76 Bump trim-newlines from 3.0.0 to 3.0.1
Bumps [trim-newlines](https://github.com/sindresorhus/trim-newlines) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/sindresorhus/trim-newlines/releases)
- [Commits](https://github.com/sindresorhus/trim-newlines/commits)

---
updated-dependencies:
- dependency-name: trim-newlines
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-08 21:11:36 +00:00
maxswa
5c52bfd883 v2.5.1 2021-06-08 17:10:31 -04:00
Max Swartwout
947d994cdf Merge pull request #35 from Not-Jayden/fix-seasonal-bosses-results
[Bug fix] Add conditional bosses filter if gamemode is seasonal
2021-06-08 17:08:44 -04:00
NotJayden
130446ab74 use boss generic 2021-06-08 16:36:36 +08:00
NotJayden
f96e7e3e2d check bossKeys strict equals the BOSSES array, and check seasonal bossKeys doesn't include tob hard mode 2021-06-08 16:29:43 +08:00
NotJayden
90d66b6b2c prettier 2021-06-08 16:16:00 +08:00
NotJayden
14cedb5877 add fysadStatsSeasonal.csv, update lynxTitanStats.csv, and write tests to make sure the keys for bosses match the expectation for the given gamemode 2021-06-08 16:15:36 +08:00
NotJayden
4703812b52 add comment 2021-06-08 15:49:02 +08:00
NotJayden
a11ac96f68 prettier 2021-06-07 14:53:36 +08:00
NotJayden
f97caa6a15 undo lib change 2021-06-07 14:51:15 +08:00
NotJayden
e7e54741d2 add conditional bosses filter if gamemode is seasonal 2021-06-07 14:50:21 +08:00
maxswa
062e5e02b2 v2.5.0 2021-06-03 22:26:38 -04:00
Max Swartwout
ed7036f9c0 Merge pull request #33 from maxswa/add-tob-hard-mode
Add TOB hard mode.
2021-06-03 22:25:24 -04:00
maxswa
74aba3e818 Add TOB hard mode. 2021-06-03 22:19:03 -04:00
Max Swartwout
09fe7ed539 Merge pull request #32 from maxswa/dependabot/npm_and_yarn/ws-7.4.6
Bump ws from 7.4.2 to 7.4.6
2021-06-03 22:05:32 -04:00
dependabot[bot]
7a78e1ea0a Bump ws from 7.4.2 to 7.4.6
Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.2...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-29 07:30:11 +00:00
maxswa
7a4163aed2 Add .gitattributes to ignore html test files. 2021-05-11 00:02:17 -04:00
Max Swartwout
85464d02fe Add build badge to README.md 2021-05-10 23:44:50 -04:00
maxswa
592d82f86b v2.4.2 2021-05-10 23:37:48 -04:00
maxswa
a28a9e253e Replace watch package with tsc --watch 2021-05-10 23:34:46 -04:00
Max Swartwout
0bd15f2402 Merge pull request #30 from maxswa/dependabot/npm_and_yarn/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21
2021-05-10 23:24:21 -04:00
dependabot[bot]
ed8ad51b4d Bump lodash from 4.17.20 to 4.17.21
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 03:22:49 +00:00
Max Swartwout
311ea88c61 Merge pull request #31 from maxswa/add-axios-test-mocks
Mock axios requests for tests.
2021-05-10 23:21:18 -04:00
maxswa
e056d052a5 Mock axios requests for tests. 2021-05-10 23:18:28 -04:00
maxswa
b230560442 v2.4.1 2021-05-01 14:41:39 -04:00
Max Swartwout
b2c6efecbd Merge pull request #29 from maxswa/rsn-hyphen
Fixes #28 Add hyphen to valid rsn regex.
2021-05-01 14:31:16 -04:00
maxswa
e9f47b9f08 Restrict GH workflow push builds to main 2021-05-01 14:22:41 -04:00
maxswa
3a6671d3d1 Fix expected test result, typo. 2021-05-01 14:16:38 -04:00
maxswa
a4065022d6 Add hyphen to valid rsn regex. 2021-05-01 14:09:08 -04:00
maxswa
163f4dd184 Fix test script. 2021-03-25 00:59:18 -04:00
maxswa
e200a8d566 Add lint and format to github workflow. 2021-03-25 00:55:34 -04:00
maxswa
89944ca8cc Add jsdoc to hiscores and helper functions. 2021-03-25 00:53:50 -04:00
maxswa
29c76b4afb Add husky, lint-staged and set up pre-commit hook. 2021-03-25 00:53:25 -04:00
maxswa
e3e904a23f Swap tslint for eslint. 2021-03-25 00:20:02 -04:00
maxswa
0b96530a8e Add license file. 2021-03-25 00:10:43 -04:00
maxswa
175f945ab8 v2.4.0 2021-03-24 22:49:58 -04:00
maxswa
6b31e8b08c Add Tempoross to boss list. 2021-03-24 22:46:37 -04:00
maxswa
d097567a3c v2.3.2 2021-02-13 11:22:26 -05:00
maxswa
be5c093cf7 Downgrade np. 2021-02-13 11:13:52 -05:00
maxswa
db72f0c57d Bump np. 2021-02-13 11:08:57 -05:00
Max Swartwout
bd2ea21980 Merge pull request #26 from maxswa/bh-order-fix
Fixes #25 Flipped BH modes.
2021-02-13 11:07:27 -05:00
maxswa
d67837c161 Fix flipped BH modes. 2021-02-13 10:50:58 -05:00
Max Swartwout
4aa6ad2752 Add github action. 2021-02-13 10:48:31 -05:00
maxswa
2f788fabf6 v2.3.1 2021-01-12 19:56:17 -05:00
maxswa
0f5aea795c Upgrade dependencies. 2021-01-12 19:55:36 -05:00
Max Swartwout
7acb84e310 Merge pull request #21 from maxswa/dependabot/npm_and_yarn/dot-prop-4.2.1
Bump dot-prop from 4.2.0 to 4.2.1
2021-01-12 19:48:41 -05:00
Max Swartwout
9619bd2a2b Merge pull request #23 from molo-pl/master
Fixes #22 adding User-Agent request header to bypass Incapsula
2021-01-12 19:48:29 -05:00
molo-pl
55abd9f800 Fixes #22 adding User-Agent request header - post review changes 2021-01-12 23:29:25 +01:00
molo-pl
cf8a4cc26e Fixes #22 adding User-Agent request header to bypass Incapsula protection of OSRS hiscore pages 2021-01-12 16:05:47 +01:00
maxswa
0f68c1995c v2.3.0 2021-01-10 16:20:54 -05:00
dependabot[bot]
ae47df31f1 Bump dot-prop from 4.2.0 to 4.2.1
Bumps [dot-prop](https://github.com/sindresorhus/dot-prop) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/sindresorhus/dot-prop/releases)
- [Commits](https://github.com/sindresorhus/dot-prop/compare/v4.2.0...v4.2.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-10 21:00:31 +00:00
Max Swartwout
7a3f3a0800 Merge pull request #17 from maxswa/dependabot/npm_and_yarn/ini-1.3.7
Bump ini from 1.3.5 to 1.3.7
2021-01-10 16:00:05 -05:00
Max Swartwout
b16e8ace6e Merge pull request #18 from maxswa/dependabot/npm_and_yarn/axios-0.21.1
Bump axios from 0.19.2 to 0.21.1
2021-01-10 15:59:55 -05:00
Max Swartwout
09f7805fd4 Merge pull request #20 from molo-pl/master
Fixes #19 adding support for Soul Wars Zeal
2021-01-10 15:59:43 -05:00
molo-pl
939f4d2721 Fixes #19 adding support for Soul Wars Zeal 2021-01-06 17:21:46 +01:00
dependabot[bot]
a4577ffb2c Bump axios from 0.19.2 to 0.21.1
Bumps [axios](https://github.com/axios/axios) from 0.19.2 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.2...v0.21.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-05 09:06:49 +00:00
dependabot[bot]
19ba7e2916 Bump ini from 1.3.5 to 1.3.7
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-11 09:18:50 +00:00
maxswa
7de2d9a95a v2.2.0 2020-07-23 18:22:38 -04:00
Max Swartwout
a143306519 Merge pull request #15 from maxswa/release/2.2.0
Release/2.2.0
2020-07-23 18:20:49 -04:00
maxswa
86b81abfd8 Upgrade dependencies. 2020-07-23 18:18:58 -04:00
maxswa
8d065742d0 Replace cheerio with jsdom. 2020-07-23 18:13:51 -04:00
Max
eaa3d4a299 v2.1.0 2020-04-01 00:30:08 -04:00
Max Swartwout
a92fa7fffe Merge pull request #10 from maxswa/release/1.2.2
Release/1.2.2
2020-04-01 00:27:54 -04:00
Max
90f2939761 Upgrade dependencies, fix tests. 2020-04-01 00:23:56 -04:00
Max
12046246ef Add nightmare to boss list. 2020-04-01 00:23:37 -04:00
Max Swartwout
adf73e59c4 Merge pull request #9 from maxswa/dependabot/npm_and_yarn/acorn-5.7.4
Bump acorn from 5.7.3 to 5.7.4
2020-03-31 23:53:56 -04:00
dependabot[bot]
f2fcbad1c4 Bump acorn from 5.7.3 to 5.7.4
Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4.
- [Release notes](https://github.com/acornjs/acorn/releases)
- [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-01 03:53:20 +00:00
Max Swartwout
0f47310814 Merge pull request #8 from maxswa/bug/rsn-format-error
Add catch for getRSNFormat error.
2020-03-31 23:52:30 -04:00
maxswa
30530fde01 Add catch for getRSNFormat error. 2020-01-29 12:24:59 -05:00
maxswa
2c0268939d v2.0.2 2020-01-06 21:54:21 -05:00
maxswa
0142783d43 Remove temporary bosses fix. 2020-01-06 21:53:50 -05:00
maxswa
468b43f66f v2.0.1 2020-01-05 20:43:45 -05:00
maxswa
d5bbe2a169 Update getActivityPage to accept bosses. 2020-01-05 20:43:15 -05:00
maxswa
26d06da24b v2.0.0 2020-01-05 18:10:22 -05:00
Max Swartwout
582a5c01fd Merge pull request #6 from maxswa/boss-hiscores
Add Boss Hiscores
2020-01-05 18:02:47 -05:00
maxswa
0138dcd5fd Add trailing slash to gamemode urls. 2020-01-05 17:57:22 -05:00
maxswa
f1730d44ec Rename properties for clarity, add formatted names 2020-01-05 17:47:13 -05:00
maxswa
ae73fef5ed Add bosses and support for leagues. 2020-01-04 16:59:07 -05:00
Max Swartwout
8bf1f6cdbc Merge pull request #5 from maxswa/dependabot/npm_and_yarn/mixin-deep-1.3.2
Bump mixin-deep from 1.3.1 to 1.3.2
2019-12-31 13:37:35 -05:00
dependabot[bot]
50d8365e87 Bump mixin-deep from 1.3.1 to 1.3.2
Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2.
- [Release notes](https://github.com/jonschlinkert/mixin-deep/releases)
- [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-31 18:36:46 +00:00
Max Swartwout
8f9c9777e5 Merge pull request #4 from maxswa/dependabot/npm_and_yarn/handlebars-4.5.3
Bump handlebars from 4.1.2 to 4.5.3
2019-12-31 13:36:18 -05:00
dependabot[bot]
470d788327 Bump handlebars from 4.1.2 to 4.5.3
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.5.3.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-28 15:44:13 +00:00
maxswa
58e8eaad59 v1.2.2 2019-07-15 09:48:13 -04:00
Max Swartwout
6b6d561a1f Merge pull request #2 from maxswa/dependabot/npm_and_yarn/lodash-4.17.14
Bump lodash from 4.17.11 to 4.17.14
2019-07-15 09:44:30 -04:00
dependabot[bot]
26aefe95a0 Bump lodash from 4.17.11 to 4.17.14
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.14.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.14)

Signed-off-by: dependabot[bot] <support@github.com>
2019-07-15 13:23:37 +00:00
maxswa
880679b9e6 v1.2.1 2019-06-26 09:53:55 -04:00
maxswa
f679e2bde8 Remove rsn string literals from test 2019-06-26 09:44:59 -04:00
maxswa
06a176873b Add CORS disclaimer 2019-06-26 09:37:28 -04:00
maxswa
553f4f5c36 Add test for getStatsByGamemode 2019-06-18 10:03:26 -04:00
maxswa
e95efb5cdf Remove renamed import 2019-06-17 16:42:25 -04:00
maxswa
68eb807657 Separate getStats into getStatsByGamemode 2019-06-17 16:32:51 -04:00
maxswa
93d6961a4c Remove Modes in favor of Gamemodes 2019-06-17 16:30:44 -04:00
Max
fbce22fd07 Fix link to types in readme 2019-06-15 15:47:31 -04:00
22 changed files with 8068 additions and 3046 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
*.html linguist-vendored

28
.github/workflows/main.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: CI
on:
push:
branches:
- main
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: borales/actions-yarn@v2.0.0
with:
cmd: install
- uses: borales/actions-yarn@v2.0.0
with:
cmd: lint
- uses: borales/actions-yarn@v2.0.0
with:
cmd: format
- uses: borales/actions-yarn@v2.0.0
with:
cmd: build
- uses: borales/actions-yarn@v2.0.0
with:
cmd: test

View File

@@ -1,6 +0,0 @@
{
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}

5
LICENSE Normal file
View File

@@ -0,0 +1,5 @@
Copyright 2021 maxswa
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

150
README.md
View File

@@ -2,19 +2,28 @@
[![npm](https://img.shields.io/npm/v/osrs-json-hiscores.svg?style=flat-square)](https://www.npmjs.com/package/osrs-json-hiscores)
[![downloads](https://img.shields.io/npm/dm/osrs-json-hiscores.svg?style=flat-square)](https://npm-stat.com/charts.html?package=osrs-json-hiscores)
[![types](https://img.shields.io/npm/types/osrs-json-hiscores.svg?style=flat-square)](https://github.com/maxswa/osrs-json-hiscores/src/types.ts)
[![types](https://img.shields.io/npm/types/osrs-json-hiscores.svg?style=flat-square)](https://github.com/maxswa/osrs-json-hiscores/blob/master/src/types.ts)
[![build](https://img.shields.io/github/workflow/status/maxswa/osrs-json-hiscores/CI?style=flat-square)](https://github.com/maxswa/osrs-json-hiscores/actions/workflows/main.yml?query=branch%3Amain)
**The Oldschool Runescape API wrapper that does more!**
**The Old School Runescape API wrapper that does more!**
## What it does
The official hiscores API for Oldschool Runescape (OSRS) returns CSV.
The official hiscores API for Old School Runescape (OSRS) returns CSV.
This wrapper converts it to json and provides extra information about the given player. By comparing player info it infers the player's game mode, as well as any previous modes (de-ultimated, de-ironed and/or died as a hardcore ironman).
Additional functions are provided that screen-scrape the OSRS leaderboards and return a list of players as json.
`osrs-json-hiscores` has TypeScript support, with full definitions for all functions and custom data types.
---
### Disclaimer
Jagex does not provide `Access-Control-Allow-Origin` headers in their responses. This means that [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) will block all browser requests to their hiscores API. In order to get around this, osrs-json-hiscores should be installed on the server side and exposed to the front end via a simple API. Here is an example of this in use: [codesandbox.io/s/osrs-json-hiscores-demo](https://codesandbox.io/s/osrs-json-hiscores-demo-qz656)
---
## Installation
With npm:
@@ -41,9 +50,9 @@ Once you import it you can call the functions asynchronously:
```javascript
hiscores
.getStats('Lynx Titan', 'full')
.then(res => console.log(res))
.catch(err => console.error(err));
.getStats('Lynx Titan')
.then((res) => console.log(res))
.catch((err) => console.error(err));
```
If you are using TypeScript or transpiling your JS you can use ES6 syntax:
@@ -57,48 +66,110 @@ const stats = await hiscores.getStats('Lynx Titan');
const topPage = await getSkillPage('overall');
```
`getStats` will return a `full` player object with game mode by default, but it will also accept any of the following game modes:
`getStats` will return a full player object with gamemode.
`getStatsByGameMode` will return a stats object and accepts a gamemode parameter:
| Game mode | Param |
| ---------------- | :----: |
| ---------------- | :----------: |
| Regular | `main` |
| Ironman | `iron` |
| Hardcore Ironman | `hc` |
| Ultimate Ironman | `ult` |
| Deadman Mode | `dmm` |
| Seasonal Deadman | `sdmm` |
| DMM Tournament | `dmmt` |
| Ironman | `ironman` |
| Hardcore Ironman | `hardcore` |
| Ultimate Ironman | `ultimate` |
| Deadman Mode | `deadman` |
| Tournament | `tournament` |
| Leagues | `seasonal` |
`getSkillPage` and `getActivityPage` require a skill / activity and optionally a gamemode and page:
```javascript
hiscores
.getSkillPage('attack', 'main', 1)
.then(res => console.log(res))
.catch(err => console.error(err));
.then((res) => console.log(res))
.catch((err) => console.error(err));
```
Activities consist of all levels of clue scrolls as well as minigames:
Activities consist of all levels of clue scrolls as well as minigames and bosses:
### Clue Scrolls
| Type | Param |
| -------- | :-------------: |
| All | `allclues` |
| Beginner | `beginnerclues` |
| Easy | `easyclues` |
| Medium | `mediumclues` |
| Hard | `hardclues` |
| Elite | `eliteclues` |
| Master | `masterclues` |
| All | `allClues` |
| Beginner | `beginnerClues` |
| Easy | `easyClues` |
| Medium | `mediumClues` |
| Hard | `hardClues` |
| Elite | `eliteClues` |
| Master | `masterClues` |
### Minigames
| Minigame | Param |
| ---------------------- | :--------: |
| Bounty Hunter (Rogue) | `roguebh` |
| Bounty Hunter (Hunter) | `hunterbh` |
| Last Man Standing | `lms` |
| ---------------------- | :---------------: |
| Bounty Hunter (Rogue) | `rogueBH` |
| Bounty Hunter (Hunter) | `hunterBH` |
| Last Man Standing | `lastManStanding` |
| Soul Wars Zeal | `soulWarsZeal` |
| Rifts Closed | `riftsClosed` |
### Leagues
| Activity | Param |
| ------------- | :------------: |
| League Points | `leaguePoints` |
### Bosses
| Boss Name | Param |
| --------------------------------- | :----------------------------: |
| Abyssal Sire | `abyssalSire` |
| Alchemical Hydra | `alchemicalHydra` |
| Barrows Chests | `barrows` |
| Bryophyta | `bryophyta` |
| Callisto | `callisto` |
| Cerberus | `cerberus` |
| Chambers Of Xeric | `chambersOfXeric` |
| Chambers Of Xeric: Challenge Mode | `chambersOfXericChallengeMode` |
| Chaos Elemental | `chaosElemental` |
| Chaos Fanatic | `chaosFanatic` |
| Commander Zilyana | `commanderZilyana` |
| Corporeal Beast | `corporealBeast` |
| Crazy Archaeologist | `crazyArchaeologist` |
| Dagannoth Prime | `dagannothPrime` |
| Dagannoth Rex | `dagannothRex` |
| Dagannoth Supreme | `dagannothSupreme` |
| Deranged Archaeologist | `derangedArchaeologist` |
| General Graardor | `generalGraardor` |
| Giant Mole | `giantMole` |
| Grotesque Guardians | `grotesqueGuardians` |
| Hespori | `hespori` |
| Kalphite Queen | `kalphiteQueen` |
| King Black Dragon | `kingBlackDragon` |
| Kraken | `kraken` |
| Kreearra | `kreeArra` |
| K'ril Tsutsaroth | `krilTsutsaroth` |
| Mimic | `mimic` |
| Nex | `nex` |
| The Nightmare of Ashihama | `nightmare` |
| Phosani's Nightmare | `phosanisNightmare` |
| Obor | `obor` |
| Sarachnis | `sarachnis` |
| Scorpia | `scorpia` |
| Skotizo | `skotizo` |
| Tempoross | `tempoross` |
| The Gauntlet | `gauntlet` |
| The Corrupted Gauntlet | `corruptedGauntlet` |
| Theatre Of Blood | `theatreOfBlood` |
| Theatre Of Blood: Hard Mode | `theatreOfBloodHardMode` |
| Thermonuclear Smoke Devil | `thermonuclearSmokeDevil` |
| TzKal-Zuk | `tzKalZuk` |
| TzTok-Jad | `tzTokJad` |
| Venenatis | `venenatis` |
| Vetion | `vetion` |
| Vorkath | `vorkath` |
| Wintertodt | `wintertodt` |
| Zalcano | `zalcano` |
| Zulrah | `zulrah` |
## What you'll get
@@ -106,7 +177,7 @@ Activities consist of all levels of clue scrolls as well as minigames:
```javascript
{
rsn: 'Lynx Titan',
name: 'Lynx Titan',
mode: 'main',
dead: false,
deulted: false,
@@ -119,8 +190,12 @@ Activities consist of all levels of clue scrolls as well as minigames:
// ...
},
clues: {},
bh: {},
lms: {}
leaguePoints: {},
bountyHunter: {},
lastManStanding: {},
soulWarsZeal: {},
riftsClosed: {},
bosses: {}
}
}
```
@@ -129,9 +204,18 @@ Activities consist of all levels of clue scrolls as well as minigames:
```javascript
[
{ rank: 1, rsn: 'Lynx Titan', level: 2277, xp: 4600000000, dead: false },
{},
{ rank: 1, name: 'Lynx Titan', level: 2277, xp: 4600000000, dead: false },
{},
{}
// ...
];
```
## Helpful Extras
Get the properly formatted name of any skill, boss, clue or other activity:
```javascript
// kril === "K'ril Tsutsaroth"
const kril = FORMATTED_BOSS_NAMES['krilTsutsaroth'];
```

953
__tests__/attackTopPage.html vendored Normal file
View File

@@ -0,0 +1,953 @@
<!DOCTYPE html>
<!-- saved from url=(0079)https://secure.runescape.com/m=hiscore_oldschool/overall?table=1#headerHiscores -->
<html class="js svg websockets localstorage websocketsbinary sharedworkers webworkers classlist canvas video webgl csspointerevents progressbar meter fileinput inlinesvg supports datalistelem no-touchevents details indexeddb indexeddb-deletedatabase appearance backgroundcliptext borderimage boxsizing cssfilters flexbox flexboxlegacy no-flexboxtweener webp webp-alpha webp-animation webp-lossless videoautoplay dataworkers blobworkers" lang="en" data-whatinput="mouse" data-whatintent="mouse"><!--<![endif]--><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><script src="./attackTopPage_files/sdk.js" async="" crossorigin="anonymous"></script><script async="" src="./attackTopPage_files/gtm.js"></script><script src="./attackTopPage_files/Criciousand-meth-shake-Exit-be-till-in-ches-Shad" async=""></script>
<link href="./attackTopPage_files/rsp777_basic-101.css" rel="stylesheet" type="text/css" media="all">
<script src="./attackTopPage_files/vendor-1.js"></script>
<title>Old School Hiscores</title>
<meta name="keywords" content="MMORPG, free RPG games online, online multiplayer, role-playing, massively multiplayer games, mmo, RuneScape, Jagex">
<meta name="description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<link rel="icon" type="image/vnd.microsoft.icon" href="https://www.runescape.com/img/global/favicon.ico">
<link rel="SHORTCUT ICON" href="https://www.runescape.com/img/global/favicon.ico">
<link rel="apple-touch-icon" href="https://www.runescape.com/img/global/mobile.png">
<meta property="fb:app_id" content="174823375888281">
<meta property="og:title" content="Old School Hiscores">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Old School RuneScape">
<meta property="og:image" content="https://www.runescape.com/img/rsp777/social-share-fb.jpg?1">
<meta property="og:url" content="https://www.runescape.com">
<meta property="og:description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="google-site-verification" content="RFtGg-G07XweT7nQe032HocvnRPhJAsdZqrq4NX_Op8">
<meta itemprop="name" content="RuneScape">
<meta itemprop="description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="twitter:domain" content="Oldschool.RuneScape.com">
<meta name="twitter:url" content="https://www.runescape.com">
<meta name="twitter:title" content="Old School Hiscores">
<meta name="twitter:description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="twitter:image:src" content="https://www.runescape.com/img/rsp777/social-share.jpg?1">
<meta name="twitter:site" content="@OldSchoolRS">
<meta name="google-site-verification" content="pUwl5KYHKSZ6tbbgsR2wYNv1kbVmsYral3iFmijHTWM">
<link href="./attackTopPage_files/rsp777_hiscore-105.css" rel="stylesheet" type="text/css" media="all">
<style>
.leaguepoints:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_leaguepoints.png?2');
}
.bountyhunterhunter:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bountyhunterhunter.png?2');
}
.bountyhunterrogue:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bountyhunterrogue.png?2');
}
.cluescrollsall:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsall.png?2');
}
.cluescrollsbeginner:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsbeginner.png?2');
}
.cluescrollseasy:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollseasy.png?2');
}
.cluescrollsmedium:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsmedium.png?2');
}
.cluescrollshard:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollshard.png?2');
}
.cluescrollselite:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollselite.png?2');
}
.cluescrollsmaster:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsmaster.png?2');
}
.lmsrank:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_lmsrank.png?2');
}
.soulwarszeal:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_soulwarszeal.png?2');
}
.abyssalsire:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_abyssalsire.png?2');
}
.alchemicalhydra:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_alchemicalhydra.png?2');
}
.barrowschests:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_barrowschests.png?2');
}
.bryophyta:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bryophyta.png?2');
}
.callisto:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_callisto.png?2');
}
.cerberus:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cerberus.png?2');
}
.chambersofxeric:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chambersofxeric.png?2');
}
.chambersofxericchallengemode:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chambersofxericchallengemode.png?2');
}
.chaoselemental:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chaoselemental.png?2');
}
.chaosfanatic:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chaosfanatic.png?2');
}
.commanderzilyana:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_commanderzilyana.png?2');
}
.corporealbeast:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_corporealbeast.png?2');
}
.crazyarchaeologist:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_crazyarchaeologist.png?2');
}
.dagannothprime:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothprime.png?2');
}
.dagannothrex:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothrex.png?2');
}
.dagannothsupreme:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothsupreme.png?2');
}
.derangedarchaeologist:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_derangedarchaeologist.png?2');
}
.generalgraardor:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_generalgraardor.png?2');
}
.giantmole:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_giantmole.png?2');
}
.grotesqueguardians:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_grotesqueguardians.png?2');
}
.hespori:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_hespori.png?2');
}
.kalphitequeen:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kalphitequeen.png?2');
}
.kingblackdragon:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kingblackdragon.png?2');
}
.kraken:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kraken.png?2');
}
.kreearra:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kreearra.png?2');
}
.kriltsutsaroth:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kriltsutsaroth.png?2');
}
.mimic:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_mimic.png?2');
}
.nightmare:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_nightmare.png?2');
}
.obor:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_obor.png?2');
}
.sarachnis:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_sarachnis.png?2');
}
.scorpia:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_scorpia.png?2');
}
.skotizo:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_skotizo.png?2');
}
.tempoross:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tempoross.png?2');
}
.thegauntlet:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thegauntlet.png?2');
}
.thecorruptedgauntlet:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thecorruptedgauntlet.png?2');
}
.theatreofblood:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_theatreofblood.png?2');
}
.thermonuclearsmokedevil:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thermonuclearsmokedevil.png?2');
}
.tzkalzuk:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tzkalzuk.png?2');
}
.tztokjad:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tztokjad.png?2');
}
.venenatis:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_venenatis.png?2');
}
.vetion:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_vetion.png?2');
}
.vorkath:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_vorkath.png?2');
}
.wintertodt:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_wintertodt.png?2');
}
.zalcano:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_zalcano.png?2');
}
.zulrah:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_zulrah.png?2');
}
</style>
<style type="text/css" data-fbcssmodules="css:fb.css.base css:fb.css.dialog css:fb.css.iframewidget css:fb.css.customer_chat_plugin_iframe">.fb_hidden{position:absolute;top:-10000px;z-index:10001}.fb_reposition{overflow:hidden;position:relative}.fb_invisible{display:none}.fb_reset{background:none;border:0;border-spacing:0;color:#000;cursor:auto;direction:ltr;font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:1;margin:0;overflow:visible;padding:0;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;visibility:visible;white-space:normal;word-spacing:normal}.fb_reset>div{overflow:hidden}@keyframes fb_transform{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.fb_animate{animation:fb_transform .3s forwards}
.fb_dialog{background:rgba(82, 82, 82, .7);position:absolute;top:-10000px;z-index:10001}.fb_dialog_advanced{border-radius:8px;padding:10px}.fb_dialog_content{background:#fff;color:#373737}.fb_dialog_close_icon{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 0 transparent;cursor:pointer;display:block;height:15px;position:absolute;right:18px;top:17px;width:15px}.fb_dialog_mobile .fb_dialog_close_icon{left:5px;right:auto;top:5px}.fb_dialog_padding{background-color:transparent;position:absolute;width:1px;z-index:-1}.fb_dialog_close_icon:hover{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 -15px transparent}.fb_dialog_close_icon:active{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 -30px transparent}.fb_dialog_iframe{line-height:0}.fb_dialog_content .dialog_title{background:#6d84b4;border:1px solid #365899;color:#fff;font-size:14px;font-weight:bold;margin:0}.fb_dialog_content .dialog_title>span{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yd/r/Cou7n-nqK52.gif) no-repeat 5px 50%;float:left;padding:5px 0 7px 26px}body.fb_hidden{height:100%;left:0;margin:0;overflow:visible;position:absolute;top:-10000px;transform:none;width:100%}.fb_dialog.fb_dialog_mobile.loading{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/ya/r/3rhSv5V8j3o.gif) white no-repeat 50% 50%;min-height:100%;min-width:100%;overflow:hidden;position:absolute;top:0;z-index:10001}.fb_dialog.fb_dialog_mobile.loading.centered{background:none;height:auto;min-height:initial;min-width:initial;width:auto}.fb_dialog.fb_dialog_mobile.loading.centered #fb_dialog_loader_spinner{width:100%}.fb_dialog.fb_dialog_mobile.loading.centered .fb_dialog_content{background:none}.loading.centered #fb_dialog_loader_close{clear:both;color:#fff;display:block;font-size:18px;padding-top:20px}#fb-root #fb_dialog_ipad_overlay{background:rgba(0, 0, 0, .4);bottom:0;left:0;min-height:100%;position:absolute;right:0;top:0;width:100%;z-index:10000}#fb-root #fb_dialog_ipad_overlay.hidden{display:none}.fb_dialog.fb_dialog_mobile.loading iframe{visibility:hidden}.fb_dialog_mobile .fb_dialog_iframe{position:sticky;top:0}.fb_dialog_content .dialog_header{background:linear-gradient(from(#738aba), to(#2c4987));border-bottom:1px solid;border-color:#043b87;box-shadow:white 0 1px 1px -1px inset;color:#fff;font:bold 14px Helvetica, sans-serif;text-overflow:ellipsis;text-shadow:rgba(0, 30, 84, .296875) 0 -1px 0;vertical-align:middle;white-space:nowrap}.fb_dialog_content .dialog_header table{height:43px;width:100%}.fb_dialog_content .dialog_header td.header_left{font-size:12px;padding-left:5px;vertical-align:middle;width:60px}.fb_dialog_content .dialog_header td.header_right{font-size:12px;padding-right:5px;vertical-align:middle;width:60px}.fb_dialog_content .touchable_button{background:linear-gradient(from(#4267B2), to(#2a4887));background-clip:padding-box;border:1px solid #29487d;border-radius:3px;display:inline-block;line-height:18px;margin-top:3px;max-width:85px;padding:4px 12px;position:relative}.fb_dialog_content .dialog_header .touchable_button input{background:none;border:none;color:#fff;font:bold 12px Helvetica, sans-serif;margin:2px -12px;padding:2px 6px 3px 6px;text-shadow:rgba(0, 30, 84, .296875) 0 -1px 0}.fb_dialog_content .dialog_header .header_center{color:#fff;font-size:16px;font-weight:bold;line-height:18px;text-align:center;vertical-align:middle}.fb_dialog_content .dialog_content{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/y9/r/jKEcVPZFk-2.gif) no-repeat 50% 50%;border:1px solid #4a4a4a;border-bottom:0;border-top:0;height:150px}.fb_dialog_content .dialog_footer{background:#f5f6f7;border:1px solid #4a4a4a;border-top-color:#ccc;height:40px}#fb_dialog_loader_close{float:left}.fb_dialog.fb_dialog_mobile .fb_dialog_close_icon{visibility:hidden}#fb_dialog_loader_spinner{animation:rotateSpinner 1.2s linear infinite;background-color:transparent;background-image:url(https://static.xx.fbcdn.net/rsrc.php/v3/yD/r/t-wz8gw1xG1.png);background-position:50% 50%;background-repeat:no-repeat;height:24px;width:24px}@keyframes rotateSpinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
.fb_iframe_widget{display:inline-block;position:relative}.fb_iframe_widget span{display:inline-block;position:relative;text-align:justify}.fb_iframe_widget iframe{position:absolute}.fb_iframe_widget_fluid_desktop,.fb_iframe_widget_fluid_desktop span,.fb_iframe_widget_fluid_desktop iframe{max-width:100%}.fb_iframe_widget_fluid_desktop iframe{min-width:220px;position:relative}.fb_iframe_widget_lift{z-index:1}.fb_iframe_widget_fluid{display:inline}.fb_iframe_widget_fluid span{width:100%}
.fb_mpn_mobile_landing_page_slide_out{animation-duration:200ms;animation-name:fb_mpn_landing_page_slide_out;transition-timing-function:ease-in}.fb_mpn_mobile_landing_page_slide_out_from_left{animation-duration:200ms;animation-name:fb_mpn_landing_page_slide_out_from_left;transition-timing-function:ease-in}.fb_mpn_mobile_landing_page_slide_up{animation-duration:500ms;animation-name:fb_mpn_landing_page_slide_up;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_in{animation-duration:300ms;animation-name:fb_mpn_bounce_in;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_out{animation-duration:300ms;animation-name:fb_mpn_bounce_out;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_out_v2{animation-duration:300ms;animation-name:fb_mpn_fade_out;transition-timing-function:ease-in}.fb_customer_chat_bounce_in_v2{animation-duration:300ms;animation-name:fb_bounce_in_v2;transition-timing-function:ease-in}.fb_customer_chat_bounce_in_from_left{animation-duration:300ms;animation-name:fb_bounce_in_from_left;transition-timing-function:ease-in}.fb_customer_chat_bounce_out_v2{animation-duration:300ms;animation-name:fb_bounce_out_v2;transition-timing-function:ease-in}.fb_customer_chat_bounce_out_from_left{animation-duration:300ms;animation-name:fb_bounce_out_from_left;transition-timing-function:ease-in}.fb_customer_chat_bubble_animated_no_badge{box-shadow:0 3px 12px rgba(0, 0, 0, .15);transition:box-shadow 150ms linear}.fb_customer_chat_bubble_animated_no_badge:hover{box-shadow:0 5px 24px rgba(0, 0, 0, .3)}.fb_customer_chat_bubble_animated_with_badge{box-shadow:-5px 4px 14px rgba(0, 0, 0, .15);transition:box-shadow 150ms linear}.fb_customer_chat_bubble_animated_with_badge:hover{box-shadow:-5px 8px 24px rgba(0, 0, 0, .2)}.fb_invisible_flow{display:inherit;height:0;overflow-x:hidden;width:0}.fb_new_ui_mobile_overlay_active{overflow:hidden}@keyframes fb_mpn_landing_page_slide_in{0%{border-radius:50%;margin:0 24px;width:60px}40%{border-radius:18px}100%{margin:0 12px;width:100% - 24px}}@keyframes fb_mpn_landing_page_slide_in_from_left{0%{border-radius:50%;left:12px;margin:0 24px;width:60px}40%{border-radius:18px}100%{left:12px;margin:0 12px;width:100% - 24px}}@keyframes fb_mpn_landing_page_slide_out{0%{margin:0 12px;width:100% - 24px}60%{border-radius:18px}100%{border-radius:50%;margin:0 24px;width:60px}}@keyframes fb_mpn_landing_page_slide_out_from_left{0%{left:12px;width:100% - 24px}60%{border-radius:18px}100%{border-radius:50%;left:12px;width:60px}}@keyframes fb_mpn_landing_page_slide_up{0%{bottom:0;opacity:0}100%{bottom:24px;opacity:1}}@keyframes fb_mpn_bounce_in{0%{opacity:.5;top:100%}100%{opacity:1;top:0}}@keyframes fb_mpn_fade_out{0%{bottom:30px;opacity:1}100%{bottom:0;opacity:0}}@keyframes fb_mpn_bounce_out{0%{opacity:1;top:0}100%{opacity:.5;top:100%}}@keyframes fb_bounce_in_v2{0%{opacity:0;transform:scale(0, 0);transform-origin:bottom right}50%{transform:scale(1.03, 1.03);transform-origin:bottom right}100%{opacity:1;transform:scale(1, 1);transform-origin:bottom right}}@keyframes fb_bounce_in_from_left{0%{opacity:0;transform:scale(0, 0);transform-origin:bottom left}50%{transform:scale(1.03, 1.03);transform-origin:bottom left}100%{opacity:1;transform:scale(1, 1);transform-origin:bottom left}}@keyframes fb_bounce_out_v2{0%{opacity:1;transform:scale(1, 1);transform-origin:bottom right}100%{opacity:0;transform:scale(0, 0);transform-origin:bottom right}}@keyframes fb_bounce_out_from_left{0%{opacity:1;transform:scale(1, 1);transform-origin:bottom left}100%{opacity:0;transform:scale(0, 0);transform-origin:bottom left}}@keyframes fb_bounce_out_v2_mobile_chat_started{0%{opacity:1;top:0}100%{opacity:0;top:20px}}@keyframes fb_customer_chat_bubble_bounce_in_animation{0%{bottom:6pt;opacity:0;transform:scale(0, 0);transform-origin:center}70%{bottom:18pt;opacity:1;transform:scale(1.2, 1.2)}100%{transform:scale(1, 1)}}@keyframes slideInFromBottom{0%{opacity:.1;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}@keyframes slideInFromBottomDelay{0%{opacity:0;transform:translateY(100%)}97%{opacity:0;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}</style></head>
<body id="body"><div id="fb-root" class="174823375888281 fb_reset"><script async="" src="./attackTopPage_files/sdk(1).js"></script><div style="position: absolute; top: -10000px; width: 0px; height: 0px;"><div></div></div></div>
<div class="centerDiv">
<div class="frame wide_e">
<span style="float:right;"><a id="loginLink" href="https://secure.runescape.com/m=weblogin/loginform?theme=oldschool&amp;mod=hiscore_oldschool&amp;ssl=1&amp;dest=overall?table=1">Log in</a></span>
</div>
<br>
<div class="hiscoretitlebground">
<div class="hiscoretitleframe">
<strong>Old School Hiscores</strong><br>
<a href="https://oldschool.runescape.com/">Home</a>
</div>
</div>
<br>
<div align="center">
<div class="ironman-nav">
<span class="ironman-nav__option ironman-nav__option--current">Hiscores</span>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_ironman/">Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_ultimate/">Ultimate Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_hardcore_ironman/">Hardcore Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_deadman/">Deadman Mode</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_seasonal/">Leagues</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_tournament/">Tournament</a>
</div>
<div class="personal-hiscores">
<nav class="personal-hiscores__side-banner">
<div id="col1">
<div id="headerCategory"></div>
<a class="personal-hiscores__scroll-arrow personal-hiscores__scroll-arrow--up personal-hiscores__scroll-arrow--disabled" href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=1#" data-js-scroll="up">Up</a>
<div id="contentCategory">
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=0#headerHiscores" class=" Overall ">
Overall
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=1#headerHiscores" class=" Attack ">
Attack
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=2#headerHiscores" class=" Defence ">
Defence
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=3#headerHiscores" class=" Strength ">
Strength
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=4#headerHiscores" class=" Hitpoints ">
Hitpoints
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=5#headerHiscores" class=" Ranged ">
Ranged
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=6#headerHiscores" class=" Prayer ">
Prayer
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=7#headerHiscores" class=" Magic ">
Magic
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=8#headerHiscores" class=" Cooking ">
Cooking
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=9#headerHiscores" class=" Woodcutting ">
Woodcutting
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=10#headerHiscores" class=" Fletching ">
Fletching
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=11#headerHiscores" class=" Fishing ">
Fishing
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=12#headerHiscores" class=" Firemaking ">
Firemaking
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=13#headerHiscores" class=" Crafting ">
Crafting
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=14#headerHiscores" class=" Smithing ">
Smithing
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=15#headerHiscores" class=" Mining ">
Mining
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=16#headerHiscores" class=" Herblore ">
Herblore
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=17#headerHiscores" class=" Agility ">
Agility
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=18#headerHiscores" class=" Thieving ">
Thieving
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=19#headerHiscores" class=" Slayer ">
Slayer
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=20#headerHiscores" class=" Farming ">
Farming
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=21#headerHiscores" class=" Runecraft ">
Runecraft
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=22#headerHiscores" class=" Hunter ">
Hunter
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=23#headerHiscores" class=" Construction ">
Construction
</a>
<span style="color: #d9c27e;display: block;text-align: center;">----</span>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=1#headerHiscores" class="activity-link bountyhunterhunter">Bounty Hunter - Hunter</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=2#headerHiscores" class="activity-link bountyhunterrogue">Bounty Hunter - Rogue</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=3#headerHiscores" class="activity-link cluescrollsall">Clue Scrolls (all)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=4#headerHiscores" class="activity-link cluescrollsbeginner">Clue Scrolls (beginner)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=5#headerHiscores" class="activity-link cluescrollseasy">Clue Scrolls (easy)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=6#headerHiscores" class="activity-link cluescrollsmedium">Clue Scrolls (medium)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=7#headerHiscores" class="activity-link cluescrollshard">Clue Scrolls (hard)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=8#headerHiscores" class="activity-link cluescrollselite">Clue Scrolls (elite)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=9#headerHiscores" class="activity-link cluescrollsmaster">Clue Scrolls (master)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=10#headerHiscores" class="activity-link lmsrank">LMS - Rank</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=11#headerHiscores" class="activity-link soulwarszeal">Soul Wars Zeal</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=12#headerHiscores" class="activity-link abyssalsire">Abyssal Sire</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=13#headerHiscores" class="activity-link alchemicalhydra">Alchemical Hydra</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=14#headerHiscores" class="activity-link barrowschests">Barrows Chests</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=15#headerHiscores" class="activity-link bryophyta">Bryophyta</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=16#headerHiscores" class="activity-link callisto">Callisto</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=17#headerHiscores" class="activity-link cerberus">Cerberus</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=18#headerHiscores" class="activity-link chambersofxeric">Chambers of Xeric</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=19#headerHiscores" class="activity-link chambersofxericchallengemode">Chambers of Xeric: Challenge Mode</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=20#headerHiscores" class="activity-link chaoselemental">Chaos Elemental</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=21#headerHiscores" class="activity-link chaosfanatic">Chaos Fanatic</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=22#headerHiscores" class="activity-link commanderzilyana">Commander Zilyana</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=23#headerHiscores" class="activity-link corporealbeast">Corporeal Beast</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=24#headerHiscores" class="activity-link crazyarchaeologist">Crazy Archaeologist</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=25#headerHiscores" class="activity-link dagannothprime">Dagannoth Prime</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=26#headerHiscores" class="activity-link dagannothrex">Dagannoth Rex</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=27#headerHiscores" class="activity-link dagannothsupreme">Dagannoth Supreme</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=28#headerHiscores" class="activity-link derangedarchaeologist">Deranged Archaeologist</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=29#headerHiscores" class="activity-link generalgraardor">General Graardor</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=30#headerHiscores" class="activity-link giantmole">Giant Mole</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=31#headerHiscores" class="activity-link grotesqueguardians">Grotesque Guardians</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=32#headerHiscores" class="activity-link hespori">Hespori</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=33#headerHiscores" class="activity-link kalphitequeen">Kalphite Queen</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=34#headerHiscores" class="activity-link kingblackdragon">King Black Dragon</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=35#headerHiscores" class="activity-link kraken">Kraken</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=36#headerHiscores" class="activity-link kreearra">Kree'Arra</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=37#headerHiscores" class="activity-link kriltsutsaroth">K'ril Tsutsaroth</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=38#headerHiscores" class="activity-link mimic">Mimic</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=39#headerHiscores" class="activity-link nightmare">Nightmare</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=40#headerHiscores" class="activity-link obor">Obor</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=41#headerHiscores" class="activity-link sarachnis">Sarachnis</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=42#headerHiscores" class="activity-link scorpia">Scorpia</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=43#headerHiscores" class="activity-link skotizo">Skotizo</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=44#headerHiscores" class="activity-link tempoross">Tempoross</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=45#headerHiscores" class="activity-link thegauntlet">The Gauntlet</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=46#headerHiscores" class="activity-link thecorruptedgauntlet">The Corrupted Gauntlet</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=47#headerHiscores" class="activity-link theatreofblood">Theatre of Blood</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=48#headerHiscores" class="activity-link thermonuclearsmokedevil">Thermonuclear Smoke Devil</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=49#headerHiscores" class="activity-link tzkalzuk">TzKal-Zuk</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=50#headerHiscores" class="activity-link tztokjad">TzTok-Jad</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=51#headerHiscores" class="activity-link venenatis">Venenatis</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=52#headerHiscores" class="activity-link vetion">Vet'ion</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=53#headerHiscores" class="activity-link vorkath">Vorkath</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=54#headerHiscores" class="activity-link wintertodt">Wintertodt</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=55#headerHiscores" class="activity-link zalcano">Zalcano</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=56#headerHiscores" class="activity-link zulrah">Zulrah</a>
</div>
<a class="personal-hiscores__scroll-arrow personal-hiscores__scroll-arrow--down" href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=1#" data-js-scroll="down">Down</a>
<div id="footerCategory"></div>
</div>
</nav>
<div class="personal-hiscores__table">
<div id="col2">
<div id="headerHiscores"></div>
<div class="hiscoresHiddenBG">
<div id="contentHiscores">
<table>
<caption>
<img class="miniimg" src="./attackTopPage_files/skill_icon_attack1.gif">
&nbsp;
Attack
Hiscores
</caption>
<thead>
<tr>
<th class="right">Rank</th>
<th class="left">Name</th>
<th>Level</th><th class="right">XP</th>
</tr>
</thead>
<tbody>
<tr>
<td width="60"></td>
<td width="120"></td>
<td width="70"></td><td width="100"></td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
1
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Heur">Heur</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
2
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Unohdettu2">Unohdettu2</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
3
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Drakon">Drakon</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
4
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Ame%A0Umehara">Ame&nbsp;Umehara</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
5
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Jakee">Jakee</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
6
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=L00OO00OO00l">L00OO00OO00l</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
7
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Howson">Howson</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Dr%A0PFAFF">Dr&nbsp;PFAFF</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
9
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Malt%A0Lickeys">Malt&nbsp;Lickeys</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
10
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Burned">Burned</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
11
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Blue%A0Limes">Blue&nbsp;Limes</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
12
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Mini%A0Finbarr">Mini&nbsp;Finbarr</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
13
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Unohdettu3">Unohdettu3</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
14
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Eslihero">Eslihero</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
15
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Lynx%A0Titan">Lynx&nbsp;Titan</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
16
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=AndrewWigins">AndrewWigins</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
17
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=iMelee">iMelee</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
18
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Portuguese">Portuguese</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
19
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=MarkoOSRS">MarkoOSRS</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
20
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Cairo">Cairo</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
21
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Hey%A0Jase">Hey&nbsp;Jase</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
22
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=H%A0D%A0M%A0P">H&nbsp;D&nbsp;M&nbsp;P</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
23
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Yumemi">Yumemi</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
24
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Fiiggy">Fiiggy</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
25
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Edgecrusher">Edgecrusher</a>
</td>
<td>
99
</td>
<td class="right">
200,000,000
</td>
</tr>
</tbody>
</table>
<nav class="personal-hiscores__pagination">
<a class="personal-hiscores__pagination-arrow personal-hiscores__pagination-arrow--down" href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=1&amp;page=2" title="Scroll down table">
<img src="./attackTopPage_files/arrow_down.gif" alt="Scroll Down">
</a>
</nav>
</div>
</div>
<div id="footerHiscores"></div>
</div>
</div>
<div class="personal-hiscores__side-input">
<form action="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal" method="post">
<div class="smallBox">
<p>
<b>Search by name</b>
<input class="text" maxlength="12" type="text" name="user1" value="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input maxlength="12" type="submit" name="submit" value="Search">
</p>
</div>
</form>
<form action="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0" method="post">
<div class="smallBox">
<p>
<b>Search by rank</b>
<input class="text" maxlength="12" type="text" name="rank" value="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;">
<input type="hidden" name="table" value="1">
<input type="submit" name="submit" value="Search">
</p>
</div>
</form>
<form action="https://secure.runescape.com/m=hiscore_oldschool/compare" method="post" class="compareForm">
<div class="largeBox">
<p>
<b>Compare Users</b>
<input class="text" maxlength="12" type="text" name="user1" value="" pattern="^[a-zA-Z0-9]+([ _-&amp;nbsp;]{0,10}[0-9a-zA-Z]+)*$" title="player name" required="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input class="text" maxlength="12" type="text" name="user2" value="" pattern="^[a-zA-Z0-9]+([ _-&amp;nbsp;]{0,10}[0-9a-zA-Z]+)*$" title="player name" required="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input type="submit" name="submit" value="Compare">
</p>
</div>
</form>
<div class="largeBox">
<div class="loginPrompt">
<b>Friends Hiscores</b>
To view personal<br>
hiscores and compare<br>
yourself to your friends<br>
</div>
<a href="https://secure.runescape.com/m=weblogin/oldschool_login?mod=hiscore_oldschool&amp;ssl=0&amp;dest=hiscorefriends_all" class="linkToFriends">Click here</a>
</div>
</div>
</div>
</div>
<div class="tandc">
<a href="http://www.jagex.com/" target="_top"><img class="footer__jagex-img" src="./attackTopPage_files/jagex-logo-landscape.svg" alt="Jagex Software"></a>
<p class="tandc__copy">This website and its contents are copyright <20> 1999 - 2021 Jagex Ltd, 220 Science Park, Cambridge, CB4 0WA, United Kingdom.<br>Use of this website is subject to our <a href="https://www.jagex.com/terms/terms.ws" target="_blank">Terms &amp; Conditions</a> and <a href="https://www.jagex.com/privacy/privacy.ws" target="_blank">Privacy Policy</a>. <br><a href="https://www.jagex.com/terms/rules-of-old-school-runescape">Rules of Old School RuneScape</a> | <a href="https://www.jagex.com/terms/cookies.ws">Change Cookie Settings</a></p>
<a class="osrsRSS" target="_BLANK" href="https://secure.runescape.com/m=news/latest_news.rss?oldschool=true"><img src="./attackTopPage_files/rss.png" title="OSRS RSS Feed" alt="OSRS RSS Feed"></a>
</div> <script src="./attackTopPage_files/modernizr_3_0_0_min-100.js"></script>
<script src="./attackTopPage_files/rsp777_basic-105.js"></script>
<script src="./attackTopPage_files/rsp777_twitter-100.js"></script>
<script type="text/javascript">
if ($("#fb-root").length == 0){
$("body").prepend('<div id="fb-root" class="174823375888281"></div>');
window.fbAsyncInit = function() {
FB.init({
appId: '174823375888281',
status: false,
cookie: true,
xfbml: true,
oauth: true,
version: 'v2.8'
});
};
(function() {
var e = document.createElement('script');
e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/sdk.js';
document.getElementById('fb-root').appendChild(e);
}());
}
</script>
<a style="display:none" id="SNbuttonLink" class="thickbox"></a>
<script type="text/javascript">
function fbLoginRedirect(buttonName, loginUrl, destUrl, destStr, _target){
$.getJSON('https://secure.runescape.com/m=sn-integration/checkLogin.ws?json=?', {"tps":0, "token":FB.getAuthResponse().accessToken, "expiry":FB.getAuthResponse().expiresIn, "signed":FB.getAuthResponse().signedRequest}, function(data) {
if(typeof(_target) != 'undefined' && _target != '') $("#SNbuttonLink").attr('target',_target);
if (data['sso']<0) {
JAGEX.socialnetworks.SNNotification("There was a problem verifying your login. Please try again.");
} else if (data['sso'].length > 1){
if(data['sna']>-1) {
$("#SNbuttonLink").attr('href',loginUrl+'key='+data['sso']+'&tps=0&'+destStr+'&KeepThis=true&TB_iframe=true&height=500&width=560');
$("#SNbuttonLink").click();
$("#TB_iframeContent").attr("allowTransparency", "true");
$("#TB_iframeContent").css("padding-left", "50px");
} else {
var loc = destUrl+'?key='+data['sso']+'?'+destStr;
if(typeof(_target) != 'undefined' && _target != ''){
window.parent.location = loc;
}
else {
window.location = loc;
}
}
} else {
$("#SNbuttonLink").attr('href',loginUrl+destStr+'&KeepThis=true&TB_iframe=true&height=400&width=442');
$("#SNbuttonLink").click();
$("#TB_iframeContent").attr("allowTransparency", "true");
}
});
return false;
}
</script>
<script type="text/javascript" src="./attackTopPage_files/plugins-100.js"></script>
<script>
var RESPONSIVE = RESPONSIVE || {};
RESPONSIVE.constant = RESPONSIVE.constant || {};
RESPONSIVE.constant.user = {
language: 0,
isLoggedIn: 0
};
</script>
<script type="text/javascript" src="./attackTopPage_files/gtm-100.js"></script>
</div>
</body></html>

955
__tests__/b0atyNamePage.html vendored Normal file
View File

@@ -0,0 +1,955 @@
<!DOCTYPE html>
<!-- saved from url=(0083)https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0&user=b0aty -->
<html class="js svg websockets localstorage websocketsbinary sharedworkers webworkers classlist canvas video webgl csspointerevents progressbar meter fileinput inlinesvg supports datalistelem no-touchevents details indexeddb indexeddb-deletedatabase appearance backgroundcliptext borderimage boxsizing cssfilters flexbox flexboxlegacy no-flexboxtweener webp webp-alpha webp-animation webp-lossless dataworkers blobworkers no-videoautoplay" lang="en" data-whatinput="mouse" data-whatintent="mouse"><!--<![endif]--><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><script src="./b0atyNamePage_files/sdk.js" async="" crossorigin="anonymous"></script><script async="" src="./b0atyNamePage_files/gtm.js"></script><script src="./b0atyNamePage_files/Criciousand-meth-shake-Exit-be-till-in-ches-Shad" async=""></script>
<link href="./b0atyNamePage_files/rsp777_basic-101.css" rel="stylesheet" type="text/css" media="all">
<script src="./b0atyNamePage_files/vendor-1.js"></script>
<title>Old School Hiscores</title>
<meta name="keywords" content="MMORPG, free RPG games online, online multiplayer, role-playing, massively multiplayer games, mmo, RuneScape, Jagex">
<meta name="description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<link rel="icon" type="image/vnd.microsoft.icon" href="https://www.runescape.com/img/global/favicon.ico">
<link rel="SHORTCUT ICON" href="https://www.runescape.com/img/global/favicon.ico">
<link rel="apple-touch-icon" href="https://www.runescape.com/img/global/mobile.png">
<meta property="fb:app_id" content="174823375888281">
<meta property="og:title" content="Old School Hiscores">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Old School RuneScape">
<meta property="og:image" content="https://www.runescape.com/img/rsp777/social-share-fb.jpg?1">
<meta property="og:url" content="https://www.runescape.com">
<meta property="og:description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="google-site-verification" content="RFtGg-G07XweT7nQe032HocvnRPhJAsdZqrq4NX_Op8">
<meta itemprop="name" content="RuneScape">
<meta itemprop="description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="twitter:domain" content="Oldschool.RuneScape.com">
<meta name="twitter:url" content="https://www.runescape.com">
<meta name="twitter:title" content="Old School Hiscores">
<meta name="twitter:description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="twitter:image:src" content="https://www.runescape.com/img/rsp777/social-share.jpg?1">
<meta name="twitter:site" content="@OldSchoolRS">
<meta name="google-site-verification" content="pUwl5KYHKSZ6tbbgsR2wYNv1kbVmsYral3iFmijHTWM">
<link href="./b0atyNamePage_files/rsp777_hiscore-105.css" rel="stylesheet" type="text/css" media="all">
<style>
.leaguepoints:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_leaguepoints.png?2');
}
.bountyhunterhunter:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bountyhunterhunter.png?2');
}
.bountyhunterrogue:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bountyhunterrogue.png?2');
}
.cluescrollsall:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsall.png?2');
}
.cluescrollsbeginner:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsbeginner.png?2');
}
.cluescrollseasy:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollseasy.png?2');
}
.cluescrollsmedium:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsmedium.png?2');
}
.cluescrollshard:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollshard.png?2');
}
.cluescrollselite:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollselite.png?2');
}
.cluescrollsmaster:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsmaster.png?2');
}
.lmsrank:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_lmsrank.png?2');
}
.soulwarszeal:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_soulwarszeal.png?2');
}
.abyssalsire:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_abyssalsire.png?2');
}
.alchemicalhydra:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_alchemicalhydra.png?2');
}
.barrowschests:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_barrowschests.png?2');
}
.bryophyta:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bryophyta.png?2');
}
.callisto:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_callisto.png?2');
}
.cerberus:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cerberus.png?2');
}
.chambersofxeric:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chambersofxeric.png?2');
}
.chambersofxericchallengemode:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chambersofxericchallengemode.png?2');
}
.chaoselemental:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chaoselemental.png?2');
}
.chaosfanatic:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chaosfanatic.png?2');
}
.commanderzilyana:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_commanderzilyana.png?2');
}
.corporealbeast:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_corporealbeast.png?2');
}
.crazyarchaeologist:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_crazyarchaeologist.png?2');
}
.dagannothprime:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothprime.png?2');
}
.dagannothrex:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothrex.png?2');
}
.dagannothsupreme:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothsupreme.png?2');
}
.derangedarchaeologist:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_derangedarchaeologist.png?2');
}
.generalgraardor:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_generalgraardor.png?2');
}
.giantmole:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_giantmole.png?2');
}
.grotesqueguardians:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_grotesqueguardians.png?2');
}
.hespori:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_hespori.png?2');
}
.kalphitequeen:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kalphitequeen.png?2');
}
.kingblackdragon:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kingblackdragon.png?2');
}
.kraken:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kraken.png?2');
}
.kreearra:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kreearra.png?2');
}
.kriltsutsaroth:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kriltsutsaroth.png?2');
}
.mimic:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_mimic.png?2');
}
.nightmare:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_nightmare.png?2');
}
.obor:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_obor.png?2');
}
.sarachnis:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_sarachnis.png?2');
}
.scorpia:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_scorpia.png?2');
}
.skotizo:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_skotizo.png?2');
}
.tempoross:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tempoross.png?2');
}
.thegauntlet:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thegauntlet.png?2');
}
.thecorruptedgauntlet:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thecorruptedgauntlet.png?2');
}
.theatreofblood:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_theatreofblood.png?2');
}
.thermonuclearsmokedevil:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thermonuclearsmokedevil.png?2');
}
.tzkalzuk:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tzkalzuk.png?2');
}
.tztokjad:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tztokjad.png?2');
}
.venenatis:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_venenatis.png?2');
}
.vetion:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_vetion.png?2');
}
.vorkath:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_vorkath.png?2');
}
.wintertodt:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_wintertodt.png?2');
}
.zalcano:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_zalcano.png?2');
}
.zulrah:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_zulrah.png?2');
}
</style>
<style type="text/css" data-fbcssmodules="css:fb.css.base css:fb.css.dialog css:fb.css.iframewidget css:fb.css.customer_chat_plugin_iframe">.fb_hidden{position:absolute;top:-10000px;z-index:10001}.fb_reposition{overflow:hidden;position:relative}.fb_invisible{display:none}.fb_reset{background:none;border:0;border-spacing:0;color:#000;cursor:auto;direction:ltr;font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:1;margin:0;overflow:visible;padding:0;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;visibility:visible;white-space:normal;word-spacing:normal}.fb_reset>div{overflow:hidden}@keyframes fb_transform{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.fb_animate{animation:fb_transform .3s forwards}
.fb_dialog{background:rgba(82, 82, 82, .7);position:absolute;top:-10000px;z-index:10001}.fb_dialog_advanced{border-radius:8px;padding:10px}.fb_dialog_content{background:#fff;color:#373737}.fb_dialog_close_icon{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 0 transparent;cursor:pointer;display:block;height:15px;position:absolute;right:18px;top:17px;width:15px}.fb_dialog_mobile .fb_dialog_close_icon{left:5px;right:auto;top:5px}.fb_dialog_padding{background-color:transparent;position:absolute;width:1px;z-index:-1}.fb_dialog_close_icon:hover{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 -15px transparent}.fb_dialog_close_icon:active{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 -30px transparent}.fb_dialog_iframe{line-height:0}.fb_dialog_content .dialog_title{background:#6d84b4;border:1px solid #365899;color:#fff;font-size:14px;font-weight:bold;margin:0}.fb_dialog_content .dialog_title>span{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yd/r/Cou7n-nqK52.gif) no-repeat 5px 50%;float:left;padding:5px 0 7px 26px}body.fb_hidden{height:100%;left:0;margin:0;overflow:visible;position:absolute;top:-10000px;transform:none;width:100%}.fb_dialog.fb_dialog_mobile.loading{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/ya/r/3rhSv5V8j3o.gif) white no-repeat 50% 50%;min-height:100%;min-width:100%;overflow:hidden;position:absolute;top:0;z-index:10001}.fb_dialog.fb_dialog_mobile.loading.centered{background:none;height:auto;min-height:initial;min-width:initial;width:auto}.fb_dialog.fb_dialog_mobile.loading.centered #fb_dialog_loader_spinner{width:100%}.fb_dialog.fb_dialog_mobile.loading.centered .fb_dialog_content{background:none}.loading.centered #fb_dialog_loader_close{clear:both;color:#fff;display:block;font-size:18px;padding-top:20px}#fb-root #fb_dialog_ipad_overlay{background:rgba(0, 0, 0, .4);bottom:0;left:0;min-height:100%;position:absolute;right:0;top:0;width:100%;z-index:10000}#fb-root #fb_dialog_ipad_overlay.hidden{display:none}.fb_dialog.fb_dialog_mobile.loading iframe{visibility:hidden}.fb_dialog_mobile .fb_dialog_iframe{position:sticky;top:0}.fb_dialog_content .dialog_header{background:linear-gradient(from(#738aba), to(#2c4987));border-bottom:1px solid;border-color:#043b87;box-shadow:white 0 1px 1px -1px inset;color:#fff;font:bold 14px Helvetica, sans-serif;text-overflow:ellipsis;text-shadow:rgba(0, 30, 84, .296875) 0 -1px 0;vertical-align:middle;white-space:nowrap}.fb_dialog_content .dialog_header table{height:43px;width:100%}.fb_dialog_content .dialog_header td.header_left{font-size:12px;padding-left:5px;vertical-align:middle;width:60px}.fb_dialog_content .dialog_header td.header_right{font-size:12px;padding-right:5px;vertical-align:middle;width:60px}.fb_dialog_content .touchable_button{background:linear-gradient(from(#4267B2), to(#2a4887));background-clip:padding-box;border:1px solid #29487d;border-radius:3px;display:inline-block;line-height:18px;margin-top:3px;max-width:85px;padding:4px 12px;position:relative}.fb_dialog_content .dialog_header .touchable_button input{background:none;border:none;color:#fff;font:bold 12px Helvetica, sans-serif;margin:2px -12px;padding:2px 6px 3px 6px;text-shadow:rgba(0, 30, 84, .296875) 0 -1px 0}.fb_dialog_content .dialog_header .header_center{color:#fff;font-size:16px;font-weight:bold;line-height:18px;text-align:center;vertical-align:middle}.fb_dialog_content .dialog_content{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/y9/r/jKEcVPZFk-2.gif) no-repeat 50% 50%;border:1px solid #4a4a4a;border-bottom:0;border-top:0;height:150px}.fb_dialog_content .dialog_footer{background:#f5f6f7;border:1px solid #4a4a4a;border-top-color:#ccc;height:40px}#fb_dialog_loader_close{float:left}.fb_dialog.fb_dialog_mobile .fb_dialog_close_icon{visibility:hidden}#fb_dialog_loader_spinner{animation:rotateSpinner 1.2s linear infinite;background-color:transparent;background-image:url(https://static.xx.fbcdn.net/rsrc.php/v3/yD/r/t-wz8gw1xG1.png);background-position:50% 50%;background-repeat:no-repeat;height:24px;width:24px}@keyframes rotateSpinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
.fb_iframe_widget{display:inline-block;position:relative}.fb_iframe_widget span{display:inline-block;position:relative;text-align:justify}.fb_iframe_widget iframe{position:absolute}.fb_iframe_widget_fluid_desktop,.fb_iframe_widget_fluid_desktop span,.fb_iframe_widget_fluid_desktop iframe{max-width:100%}.fb_iframe_widget_fluid_desktop iframe{min-width:220px;position:relative}.fb_iframe_widget_lift{z-index:1}.fb_iframe_widget_fluid{display:inline}.fb_iframe_widget_fluid span{width:100%}
.fb_mpn_mobile_landing_page_slide_out{animation-duration:200ms;animation-name:fb_mpn_landing_page_slide_out;transition-timing-function:ease-in}.fb_mpn_mobile_landing_page_slide_out_from_left{animation-duration:200ms;animation-name:fb_mpn_landing_page_slide_out_from_left;transition-timing-function:ease-in}.fb_mpn_mobile_landing_page_slide_up{animation-duration:500ms;animation-name:fb_mpn_landing_page_slide_up;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_in{animation-duration:300ms;animation-name:fb_mpn_bounce_in;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_out{animation-duration:300ms;animation-name:fb_mpn_bounce_out;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_out_v2{animation-duration:300ms;animation-name:fb_mpn_fade_out;transition-timing-function:ease-in}.fb_customer_chat_bounce_in_v2{animation-duration:300ms;animation-name:fb_bounce_in_v2;transition-timing-function:ease-in}.fb_customer_chat_bounce_in_from_left{animation-duration:300ms;animation-name:fb_bounce_in_from_left;transition-timing-function:ease-in}.fb_customer_chat_bounce_out_v2{animation-duration:300ms;animation-name:fb_bounce_out_v2;transition-timing-function:ease-in}.fb_customer_chat_bounce_out_from_left{animation-duration:300ms;animation-name:fb_bounce_out_from_left;transition-timing-function:ease-in}.fb_customer_chat_bubble_animated_no_badge{box-shadow:0 3px 12px rgba(0, 0, 0, .15);transition:box-shadow 150ms linear}.fb_customer_chat_bubble_animated_no_badge:hover{box-shadow:0 5px 24px rgba(0, 0, 0, .3)}.fb_customer_chat_bubble_animated_with_badge{box-shadow:-5px 4px 14px rgba(0, 0, 0, .15);transition:box-shadow 150ms linear}.fb_customer_chat_bubble_animated_with_badge:hover{box-shadow:-5px 8px 24px rgba(0, 0, 0, .2)}.fb_invisible_flow{display:inherit;height:0;overflow-x:hidden;width:0}.fb_new_ui_mobile_overlay_active{overflow:hidden}@keyframes fb_mpn_landing_page_slide_in{0%{border-radius:50%;margin:0 24px;width:60px}40%{border-radius:18px}100%{margin:0 12px;width:100% - 24px}}@keyframes fb_mpn_landing_page_slide_in_from_left{0%{border-radius:50%;left:12px;margin:0 24px;width:60px}40%{border-radius:18px}100%{left:12px;margin:0 12px;width:100% - 24px}}@keyframes fb_mpn_landing_page_slide_out{0%{margin:0 12px;width:100% - 24px}60%{border-radius:18px}100%{border-radius:50%;margin:0 24px;width:60px}}@keyframes fb_mpn_landing_page_slide_out_from_left{0%{left:12px;width:100% - 24px}60%{border-radius:18px}100%{border-radius:50%;left:12px;width:60px}}@keyframes fb_mpn_landing_page_slide_up{0%{bottom:0;opacity:0}100%{bottom:24px;opacity:1}}@keyframes fb_mpn_bounce_in{0%{opacity:.5;top:100%}100%{opacity:1;top:0}}@keyframes fb_mpn_fade_out{0%{bottom:30px;opacity:1}100%{bottom:0;opacity:0}}@keyframes fb_mpn_bounce_out{0%{opacity:1;top:0}100%{opacity:.5;top:100%}}@keyframes fb_bounce_in_v2{0%{opacity:0;transform:scale(0, 0);transform-origin:bottom right}50%{transform:scale(1.03, 1.03);transform-origin:bottom right}100%{opacity:1;transform:scale(1, 1);transform-origin:bottom right}}@keyframes fb_bounce_in_from_left{0%{opacity:0;transform:scale(0, 0);transform-origin:bottom left}50%{transform:scale(1.03, 1.03);transform-origin:bottom left}100%{opacity:1;transform:scale(1, 1);transform-origin:bottom left}}@keyframes fb_bounce_out_v2{0%{opacity:1;transform:scale(1, 1);transform-origin:bottom right}100%{opacity:0;transform:scale(0, 0);transform-origin:bottom right}}@keyframes fb_bounce_out_from_left{0%{opacity:1;transform:scale(1, 1);transform-origin:bottom left}100%{opacity:0;transform:scale(0, 0);transform-origin:bottom left}}@keyframes fb_bounce_out_v2_mobile_chat_started{0%{opacity:1;top:0}100%{opacity:0;top:20px}}@keyframes fb_customer_chat_bubble_bounce_in_animation{0%{bottom:6pt;opacity:0;transform:scale(0, 0);transform-origin:center}70%{bottom:18pt;opacity:1;transform:scale(1.2, 1.2)}100%{transform:scale(1, 1)}}@keyframes slideInFromBottom{0%{opacity:.1;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}@keyframes slideInFromBottomDelay{0%{opacity:0;transform:translateY(100%)}97%{opacity:0;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}</style></head>
<body id="body"><div id="fb-root" class="174823375888281 fb_reset"><script async="" src="./b0atyNamePage_files/sdk(1).js"></script><div style="position: absolute; top: -10000px; width: 0px; height: 0px;"><div></div></div></div>
<div class="centerDiv">
<div class="frame wide_e">
<span style="float:right;"><a id="loginLink" href="https://secure.runescape.com/m=weblogin/loginform?theme=oldschool&amp;mod=hiscore_oldschool&amp;ssl=1&amp;dest=overall?category_type=0&amp;user=b0aty">Log in</a></span>
</div>
<br>
<div class="hiscoretitlebground">
<div class="hiscoretitleframe">
<strong>Old School Hiscores</strong><br>
<a href="https://oldschool.runescape.com/">Home</a>
</div>
</div>
<br>
<div align="center">
<div class="ironman-nav">
<span class="ironman-nav__option ironman-nav__option--current">Hiscores</span>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_ironman/">Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_ultimate/">Ultimate Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_hardcore_ironman/">Hardcore Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_deadman/">Deadman Mode</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_seasonal/">Leagues</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_tournament/">Tournament</a>
</div>
<div class="personal-hiscores">
<nav class="personal-hiscores__side-banner">
<div id="col1">
<div id="headerCategory"></div>
<a class="personal-hiscores__scroll-arrow personal-hiscores__scroll-arrow--up personal-hiscores__scroll-arrow--disabled" href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0&amp;user=b0aty#" data-js-scroll="up">Up</a>
<div id="contentCategory">
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&amp;user=b0aty" class=" Overall ">
Overall
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=1&amp;user=b0aty" class=" Attack ">
Attack
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=2&amp;user=b0aty" class=" Defence ">
Defence
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=3&amp;user=b0aty" class=" Strength ">
Strength
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=4&amp;user=b0aty" class=" Hitpoints ">
Hitpoints
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=5&amp;user=b0aty" class=" Ranged ">
Ranged
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=6&amp;user=b0aty" class=" Prayer ">
Prayer
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=7&amp;user=b0aty" class=" Magic ">
Magic
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=8&amp;user=b0aty" class=" Cooking ">
Cooking
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=9&amp;user=b0aty" class=" Woodcutting ">
Woodcutting
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=10&amp;user=b0aty" class=" Fletching ">
Fletching
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=11&amp;user=b0aty" class=" Fishing ">
Fishing
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=12&amp;user=b0aty" class=" Firemaking ">
Firemaking
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=13&amp;user=b0aty" class=" Crafting ">
Crafting
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=14&amp;user=b0aty" class=" Smithing ">
Smithing
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=15&amp;user=b0aty" class=" Mining ">
Mining
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=16&amp;user=b0aty" class=" Herblore ">
Herblore
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=17&amp;user=b0aty" class=" Agility ">
Agility
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=18&amp;user=b0aty" class=" Thieving ">
Thieving
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=19&amp;user=b0aty" class=" Slayer ">
Slayer
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=20&amp;user=b0aty" class=" Farming ">
Farming
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=21&amp;user=b0aty" class=" Runecraft ">
Runecraft
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=22&amp;user=b0aty" class=" Hunter ">
Hunter
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=23&amp;user=b0aty" class=" Construction ">
Construction
</a>
<span style="color: #d9c27e;display: block;text-align: center;">----</span>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=1&amp;user=b0aty" class="activity-link bountyhunterhunter">Bounty Hunter - Hunter</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=2&amp;user=b0aty" class="activity-link bountyhunterrogue">Bounty Hunter - Rogue</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=3&amp;user=b0aty" class="activity-link cluescrollsall">Clue Scrolls (all)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=4&amp;user=b0aty" class="activity-link cluescrollsbeginner">Clue Scrolls (beginner)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=5&amp;user=b0aty" class="activity-link cluescrollseasy">Clue Scrolls (easy)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=6&amp;user=b0aty" class="activity-link cluescrollsmedium">Clue Scrolls (medium)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=7&amp;user=b0aty" class="activity-link cluescrollshard">Clue Scrolls (hard)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=8&amp;user=b0aty" class="activity-link cluescrollselite">Clue Scrolls (elite)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=9&amp;user=b0aty" class="activity-link cluescrollsmaster">Clue Scrolls (master)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=10&amp;user=b0aty" class="activity-link lmsrank">LMS - Rank</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=11&amp;user=b0aty" class="activity-link soulwarszeal">Soul Wars Zeal</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=12&amp;user=b0aty" class="activity-link abyssalsire">Abyssal Sire</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=13&amp;user=b0aty" class="activity-link alchemicalhydra">Alchemical Hydra</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=14&amp;user=b0aty" class="activity-link barrowschests">Barrows Chests</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=15&amp;user=b0aty" class="activity-link bryophyta">Bryophyta</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=16&amp;user=b0aty" class="activity-link callisto">Callisto</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=17&amp;user=b0aty" class="activity-link cerberus">Cerberus</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=18&amp;user=b0aty" class="activity-link chambersofxeric">Chambers of Xeric</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=19&amp;user=b0aty" class="activity-link chambersofxericchallengemode">Chambers of Xeric: Challenge Mode</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=20&amp;user=b0aty" class="activity-link chaoselemental">Chaos Elemental</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=21&amp;user=b0aty" class="activity-link chaosfanatic">Chaos Fanatic</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=22&amp;user=b0aty" class="activity-link commanderzilyana">Commander Zilyana</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=23&amp;user=b0aty" class="activity-link corporealbeast">Corporeal Beast</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=24&amp;user=b0aty" class="activity-link crazyarchaeologist">Crazy Archaeologist</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=25&amp;user=b0aty" class="activity-link dagannothprime">Dagannoth Prime</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=26&amp;user=b0aty" class="activity-link dagannothrex">Dagannoth Rex</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=27&amp;user=b0aty" class="activity-link dagannothsupreme">Dagannoth Supreme</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=28&amp;user=b0aty" class="activity-link derangedarchaeologist">Deranged Archaeologist</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=29&amp;user=b0aty" class="activity-link generalgraardor">General Graardor</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=30&amp;user=b0aty" class="activity-link giantmole">Giant Mole</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=31&amp;user=b0aty" class="activity-link grotesqueguardians">Grotesque Guardians</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=32&amp;user=b0aty" class="activity-link hespori">Hespori</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=33&amp;user=b0aty" class="activity-link kalphitequeen">Kalphite Queen</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=34&amp;user=b0aty" class="activity-link kingblackdragon">King Black Dragon</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=35&amp;user=b0aty" class="activity-link kraken">Kraken</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=36&amp;user=b0aty" class="activity-link kreearra">Kree'Arra</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=37&amp;user=b0aty" class="activity-link kriltsutsaroth">K'ril Tsutsaroth</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=38&amp;user=b0aty" class="activity-link mimic">Mimic</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=39&amp;user=b0aty" class="activity-link nightmare">Nightmare</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=40&amp;user=b0aty" class="activity-link obor">Obor</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=41&amp;user=b0aty" class="activity-link sarachnis">Sarachnis</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=42&amp;user=b0aty" class="activity-link scorpia">Scorpia</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=43&amp;user=b0aty" class="activity-link skotizo">Skotizo</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=44&amp;user=b0aty" class="activity-link tempoross">Tempoross</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=45&amp;user=b0aty" class="activity-link thegauntlet">The Gauntlet</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=46&amp;user=b0aty" class="activity-link thecorruptedgauntlet">The Corrupted Gauntlet</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=47&amp;user=b0aty" class="activity-link theatreofblood">Theatre of Blood</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=48&amp;user=b0aty" class="activity-link thermonuclearsmokedevil">Thermonuclear Smoke Devil</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=49&amp;user=b0aty" class="activity-link tzkalzuk">TzKal-Zuk</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=50&amp;user=b0aty" class="activity-link tztokjad">TzTok-Jad</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=51&amp;user=b0aty" class="activity-link venenatis">Venenatis</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=52&amp;user=b0aty" class="activity-link vetion">Vet'ion</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=53&amp;user=b0aty" class="activity-link vorkath">Vorkath</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=54&amp;user=b0aty" class="activity-link wintertodt">Wintertodt</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=55&amp;user=b0aty" class="activity-link zalcano">Zalcano</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=56&amp;user=b0aty" class="activity-link zulrah">Zulrah</a>
</div>
<a class="personal-hiscores__scroll-arrow personal-hiscores__scroll-arrow--down" href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0&amp;user=b0aty#" data-js-scroll="down">Down</a>
<div id="footerCategory"></div>
</div>
</nav>
<div class="personal-hiscores__table">
<div id="col2">
<div id="headerHiscores"></div>
<div class="hiscoresHiddenBG">
<div id="contentHiscores">
<table>
<caption>
<img class="miniimg" src="./b0atyNamePage_files/blank.gif">
&nbsp;
Overall
Hiscores
</caption>
<thead>
<tr>
<th class="right">Rank</th>
<th class="left">Name</th>
<th>Level</th><th class="right">XP</th>
</tr>
</thead>
<tbody>
<tr>
<td width="60"></td>
<td width="120"></td>
<td width="70"></td><td width="100"></td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,576
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Skreecher">Skreecher</a>
</td>
<td>
2,277
</td>
<td class="right">
456,007,859
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,577
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Headlines%A0v2">Headlines&nbsp;v2</a>
</td>
<td>
2,277
</td>
<td class="right">
456,004,101
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,578
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Bald%A0Male">Bald&nbsp;Male</a>
</td>
<td>
2,277
</td>
<td class="right">
455,954,019
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,579
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Pennywise">Pennywise</a>
</td>
<td>
2,277
</td>
<td class="right">
455,939,160
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,580
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=zwolle%A00038">zwolle&nbsp;0038</a>
</td>
<td>
2,277
</td>
<td class="right">
455,931,261
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,581
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Adios%A0luega">Adios&nbsp;luega</a>
</td>
<td>
2,277
</td>
<td class="right">
455,916,692
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,582
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Will%A0man">Will&nbsp;man</a>
</td>
<td>
2,277
</td>
<td class="right">
455,916,362
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,583
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=My%A0Coxy%A0Rekt">My&nbsp;Coxy&nbsp;Rekt</a>
</td>
<td>
2,277
</td>
<td class="right">
455,885,198
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,584
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Facehuntter">Facehuntter</a>
</td>
<td>
2,277
</td>
<td class="right">
455,852,905
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,585
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Wtf%A0Need%A0Yak">Wtf&nbsp;Need&nbsp;Yak</a>
</td>
<td>
2,277
</td>
<td class="right">
455,818,042
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,586
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Hakala">Hakala</a>
</td>
<td>
2,277
</td>
<td class="right">
455,817,635
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,587
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Mike%A0TheGuy">Mike&nbsp;TheGuy</a>
</td>
<td>
2,277
</td>
<td class="right">
455,798,477
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,588
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=microwave62">microwave62</a>
</td>
<td>
2,277
</td>
<td class="right">
455,716,336
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,589
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=PCCZ">PCCZ</a>
</td>
<td>
2,277
</td>
<td class="right">
455,706,491
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,590
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=CK9">CK9</a>
</td>
<td>
2,277
</td>
<td class="right">
455,704,723
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,591
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Flavaaaaa">Flavaaaaa</a>
</td>
<td>
2,277
</td>
<td class="right">
455,685,632
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,592
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=LoliElie">LoliElie</a>
</td>
<td>
2,277
</td>
<td class="right">
455,659,464
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,593
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Give%A0Advice">Give&nbsp;Advice</a>
</td>
<td>
2,277
</td>
<td class="right">
455,653,828
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,594
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=danzing">danzing</a>
</td>
<td>
2,277
</td>
<td class="right">
455,651,024
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,595
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=EVScape">EVScape</a>
</td>
<td>
2,277
</td>
<td class="right">
455,634,426
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,596
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=rakete">rakete</a>
</td>
<td>
2,277
</td>
<td class="right">
455,623,918
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,597
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Bear%A0MaxYmum">Bear&nbsp;MaxYmum</a>
</td>
<td>
2,277
</td>
<td class="right">
455,618,823
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
<span style="color:#AA0022;">8,598</span>
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=B0aty"><span style="color:#AA0022;">B0aty</span></a>
</td>
<td>
<span style="color:#AA0022;">2,277</span>
</td>
<td class="right">
<span color="#AA0022">455,618,480</span>
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,599
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Alt%A0Huss">Alt&nbsp;Huss</a>
</td>
<td>
2,277
</td>
<td class="right">
455,613,721
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8,600
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Blak%A0Mk">Blak&nbsp;Mk</a>
</td>
<td>
2,277
</td>
<td class="right">
455,609,237
</td>
</tr>
</tbody>
</table>
<nav class="personal-hiscores__pagination">
<a class="personal-hiscores__pagination-arrow personal-hiscores__pagination-arrow--up" href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&amp;page=343" title="Scroll up table">
<img src="./b0atyNamePage_files/arrow_up.gif" alt="Scroll Up">
</a>
<a class="personal-hiscores__pagination-arrow personal-hiscores__pagination-arrow--down" href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&amp;page=345" title="Scroll down table">
<img src="./b0atyNamePage_files/arrow_down.gif" alt="Scroll Down">
</a>
</nav>
</div>
</div>
<div id="footerHiscores"></div>
</div>
</div>
<div class="personal-hiscores__side-input">
<form action="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal" method="post">
<div class="smallBox">
<p>
<b>Search by name</b>
<input class="text" maxlength="12" type="text" name="user1" value="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input maxlength="12" type="submit" name="submit" value="Search">
</p>
</div>
</form>
<form action="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0" method="post">
<div class="smallBox">
<p>
<b>Search by rank</b>
<input class="text" maxlength="12" type="text" name="rank" value="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input type="hidden" name="table" value="0">
<input type="submit" name="submit" value="Search">
</p>
</div>
</form>
<form action="https://secure.runescape.com/m=hiscore_oldschool/compare" method="post" class="compareForm">
<div class="largeBox">
<p>
<b>Compare Users</b>
<input class="text" maxlength="12" type="text" name="user1" value="" pattern="^[a-zA-Z0-9]+([ _-&amp;nbsp;]{0,10}[0-9a-zA-Z]+)*$" title="player name" required="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;">
<input class="text" maxlength="12" type="text" name="user2" value="" pattern="^[a-zA-Z0-9]+([ _-&amp;nbsp;]{0,10}[0-9a-zA-Z]+)*$" title="player name" required="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: pointer;">
<input type="submit" name="submit" value="Compare">
</p>
</div>
</form>
<div class="largeBox">
<div class="loginPrompt">
<b>Friends Hiscores</b>
To view personal<br>
hiscores and compare<br>
yourself to your friends<br>
</div>
<a href="https://secure.runescape.com/m=weblogin/oldschool_login?mod=hiscore_oldschool&amp;ssl=0&amp;dest=hiscorefriends_all" class="linkToFriends">Click here</a>
</div>
</div>
</div>
</div>
<div class="tandc">
<a href="http://www.jagex.com/" target="_top"><img class="footer__jagex-img" src="./b0atyNamePage_files/jagex-logo-landscape.svg" alt="Jagex Software"></a>
<p class="tandc__copy">This website and its contents are copyright <20> 1999 - 2021 Jagex Ltd, 220 Science Park, Cambridge, CB4 0WA, United Kingdom.<br>Use of this website is subject to our <a href="https://www.jagex.com/terms/terms.ws" target="_blank">Terms &amp; Conditions</a> and <a href="https://www.jagex.com/privacy/privacy.ws" target="_blank">Privacy Policy</a>. <br><a href="https://www.jagex.com/terms/rules-of-old-school-runescape">Rules of Old School RuneScape</a> | <a href="https://www.jagex.com/terms/cookies.ws">Change Cookie Settings</a></p>
<a class="osrsRSS" target="_BLANK" href="https://secure.runescape.com/m=news/latest_news.rss?oldschool=true"><img src="./b0atyNamePage_files/rss.png" title="OSRS RSS Feed" alt="OSRS RSS Feed"></a>
</div> <script src="./b0atyNamePage_files/modernizr_3_0_0_min-100.js"></script>
<script src="./b0atyNamePage_files/rsp777_basic-105.js"></script>
<script src="./b0atyNamePage_files/rsp777_twitter-100.js"></script>
<script type="text/javascript">
if ($("#fb-root").length == 0){
$("body").prepend('<div id="fb-root" class="174823375888281"></div>');
window.fbAsyncInit = function() {
FB.init({
appId: '174823375888281',
status: false,
cookie: true,
xfbml: true,
oauth: true,
version: 'v2.8'
});
};
(function() {
var e = document.createElement('script');
e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/sdk.js';
document.getElementById('fb-root').appendChild(e);
}());
}
</script>
<a style="display:none" id="SNbuttonLink" class="thickbox"></a>
<script type="text/javascript">
function fbLoginRedirect(buttonName, loginUrl, destUrl, destStr, _target){
$.getJSON('https://secure.runescape.com/m=sn-integration/checkLogin.ws?json=?', {"tps":0, "token":FB.getAuthResponse().accessToken, "expiry":FB.getAuthResponse().expiresIn, "signed":FB.getAuthResponse().signedRequest}, function(data) {
if(typeof(_target) != 'undefined' && _target != '') $("#SNbuttonLink").attr('target',_target);
if (data['sso']<0) {
JAGEX.socialnetworks.SNNotification("There was a problem verifying your login. Please try again.");
} else if (data['sso'].length > 1){
if(data['sna']>-1) {
$("#SNbuttonLink").attr('href',loginUrl+'key='+data['sso']+'&tps=0&'+destStr+'&KeepThis=true&TB_iframe=true&height=500&width=560');
$("#SNbuttonLink").click();
$("#TB_iframeContent").attr("allowTransparency", "true");
$("#TB_iframeContent").css("padding-left", "50px");
} else {
var loc = destUrl+'?key='+data['sso']+'?'+destStr;
if(typeof(_target) != 'undefined' && _target != ''){
window.parent.location = loc;
}
else {
window.location = loc;
}
}
} else {
$("#SNbuttonLink").attr('href',loginUrl+destStr+'&KeepThis=true&TB_iframe=true&height=400&width=442');
$("#SNbuttonLink").click();
$("#TB_iframeContent").attr("allowTransparency", "true");
}
});
return false;
}
</script>
<script type="text/javascript" src="./b0atyNamePage_files/plugins-100.js"></script>
<script>
var RESPONSIVE = RESPONSIVE || {};
RESPONSIVE.constant = RESPONSIVE.constant || {};
RESPONSIVE.constant.user = {
language: 0,
isLoggedIn: 0
};
</script>
<script type="text/javascript" src="./b0atyNamePage_files/gtm-100.js"></script>
</div>
</body></html>

View File

@@ -1,222 +1,499 @@
import { parseStats, getRSNFormat, getSkillPage, getStats } from '../src/index';
import { PlayerSkillRow, Player } from '../src/types';
import axios, { AxiosError } from 'axios';
import axios from 'axios';
import { readFileSync } from 'fs';
import {
parseStats,
getSkillPage,
getStats,
getStatsByGamemode,
getRSNFormat,
Stats,
getPlayerTableURL,
getSkillPageURL,
getStatsURL,
BOSSES,
INVALID_FORMAT_ERROR
} from '../src/index';
const B0ATY_NAME = 'B0ATY';
const B0ATY_FORMATTED_NAME = 'B0aty';
const LYNX_TITAN_SPACE_NAME = 'lYnX tiTaN';
const LYNX_TITAN_UNDERSCORE_NAME = 'lYnX_tiTaN';
const LYNX_TITAN_HYPHEN_NAME = 'lYnX-tiTaN';
const LYNX_TITAN_FORMATTED_NAME = 'Lynx Titan';
const attackTopPage = readFileSync(`${__dirname}/attackTopPage.html`, 'utf8');
const b0atyNamePage = readFileSync(`${__dirname}/b0atyNamePage.html`, 'utf8');
const lynxTitanStats = readFileSync(`${__dirname}/lynxTitanStats.csv`, 'utf8');
const lynxTitanNamePage = readFileSync(
`${__dirname}/lynxTitanNamePage.html`,
'utf8'
);
jest.spyOn(axios, 'get').mockImplementation((url) => {
const lynxUrls = [
getPlayerTableURL('main', LYNX_TITAN_SPACE_NAME),
getPlayerTableURL('main', LYNX_TITAN_UNDERSCORE_NAME),
getPlayerTableURL('main', LYNX_TITAN_HYPHEN_NAME)
];
if (lynxUrls.includes(url)) {
return Promise.resolve({ data: lynxTitanNamePage });
}
if (getPlayerTableURL('main', B0ATY_NAME) === url) {
return Promise.resolve({ data: b0atyNamePage });
}
if (getSkillPageURL('main', 'attack', 1) === url) {
return Promise.resolve({ data: attackTopPage });
}
if (getStatsURL('main', LYNX_TITAN_FORMATTED_NAME) === url) {
return Promise.resolve({ status: 200, data: lynxTitanStats });
}
throw new Error(`No mock response for URL: ${url}`);
});
test('Parse CSV to json', () => {
const csv = `40258,2063,218035714
20554, 99, 21102621
39059, 99, 15364425
14245, 99, 26556827
19819, 99, 33511407
27857, 99, 25774115
44278, 91, 6081159
40110, 99, 15128024
178948, 90, 5347474
175463, 81, 2355494
138677, 90, 5356303
77587, 91, 5904710
158478, 85, 3570485
93958, 83, 2684426
39179, 88, 4425107
138406, 77, 1591377
33399, 90, 5866307
1794, 99, 15057674
45551, 91, 6363261
121165, 90, 5748493
89460, 88, 4624078
53099, 80, 2008229
169127, 73, 1067670
115543, 82, 2546048
const csv = `246,2277,1338203419
615,99,77438259
428,99,69176307
425,99,115218641
138,99,181425111
160,99,169725807
97,99,50666171
144,99,93155913
2108,99,53198880
5750,99,19589494
295,99,76386488
1304,99,32252994
847,99,54325931
534,99,26379932
7213,99,13246799
2475,99,18161285
1837,99,14746134
668,99,23961670
3841,99,17970837
265,99,56230978
821,99,62123353
169,99,43127930
810,99,37688883
92,99,32005622
23423,478
99831,23
89912,37
32,12148
3105,76
1997,505
127,4259
361,915
392,250
1,6143
4814,898
37,225
23,467
382,2780
944,3000
1981,1452
4981,23
888,1046
613,4856
102,4038
156,334
6240,133
4569,250
6893,603
1,17798
9320,125
1030,2802
4342,1655
966,2951
10151,1
1288,2407
377,4669
545,1567
6083,94
264,2897
4052,1277
41643,1477
625,2391
120,2981
1,109
99,39002
3,22666
2,84
26,323
201,1101
82,3404
5085,61
18823,23
63,375
2870,6
6984,138
23,923141
4043,2000
489,8
967,47
11155,223
1940,272
8623,1340
605,1694
-1,-1
-1, -1
32875, 500
24817, 476
212728, 1
94827, 20
59099, 74
24642, 231
5206, 99
6293, 51`;
3867,4583`;
expect(parseStats(csv)).toStrictEqual({
const expectedOutput: Stats = {
skills: {
overall: { rank: 40258, level: 2063, xp: 218035714 },
attack: { rank: 20554, level: 99, xp: 21102621 },
defence: { rank: 39059, level: 99, xp: 15364425 },
strength: { rank: 14245, level: 99, xp: 26556827 },
hitpoints: { rank: 19819, level: 99, xp: 33511407 },
ranged: { rank: 27857, level: 99, xp: 25774115 },
prayer: { rank: 44278, level: 91, xp: 6081159 },
magic: { rank: 40110, level: 99, xp: 15128024 },
cooking: { rank: 178948, level: 90, xp: 5347474 },
woodcutting: { rank: 175463, level: 81, xp: 2355494 },
fletching: { rank: 138677, level: 90, xp: 5356303 },
fishing: { rank: 77587, level: 91, xp: 5904710 },
firemaking: { rank: 158478, level: 85, xp: 3570485 },
crafting: { rank: 93958, level: 83, xp: 2684426 },
smithing: { rank: 39179, level: 88, xp: 4425107 },
mining: { rank: 138406, level: 77, xp: 1591377 },
herblore: { rank: 33399, level: 90, xp: 5866307 },
agility: { rank: 1794, level: 99, xp: 15057674 },
thieving: { rank: 45551, level: 91, xp: 6363261 },
slayer: { rank: 121165, level: 90, xp: 5748493 },
farming: { rank: 89460, level: 88, xp: 4624078 },
runecraft: { rank: 53099, level: 80, xp: 2008229 },
hunter: { rank: 169127, level: 73, xp: 1067670 },
construction: { rank: 115543, level: 82, xp: 2546048 },
overall: { rank: 246, level: 2277, xp: 1338203419 },
attack: { rank: 615, level: 99, xp: 77438259 },
defence: { rank: 428, level: 99, xp: 69176307 },
strength: { rank: 425, level: 99, xp: 115218641 },
hitpoints: { rank: 138, level: 99, xp: 181425111 },
ranged: { rank: 160, level: 99, xp: 169725807 },
prayer: { rank: 97, level: 99, xp: 50666171 },
magic: { rank: 144, level: 99, xp: 93155913 },
cooking: { rank: 2108, level: 99, xp: 53198880 },
woodcutting: { rank: 5750, level: 99, xp: 19589494 },
fletching: { rank: 295, level: 99, xp: 76386488 },
fishing: { rank: 1304, level: 99, xp: 32252994 },
firemaking: { rank: 847, level: 99, xp: 54325931 },
crafting: { rank: 534, level: 99, xp: 26379932 },
smithing: { rank: 7213, level: 99, xp: 13246799 },
mining: { rank: 2475, level: 99, xp: 18161285 },
herblore: { rank: 1837, level: 99, xp: 14746134 },
agility: { rank: 668, level: 99, xp: 23961670 },
thieving: { rank: 3841, level: 99, xp: 17970837 },
slayer: { rank: 265, level: 99, xp: 56230978 },
farming: { rank: 821, level: 99, xp: 62123353 },
runecraft: { rank: 169, level: 99, xp: 43127930 },
hunter: { rank: 810, level: 99, xp: 37688883 },
construction: { rank: 92, level: 99, xp: 32005622 }
},
bh: {
rogue: { rank: -1, score: -1 },
hunter: { rank: -1, score: -1 },
leaguePoints: { rank: 23423, score: 478 },
bountyHunter: {
hunter: { rank: 99831, score: 23 },
rogue: { rank: 89912, score: 37 }
},
lms: { rank: 32875, score: 500 },
lastManStanding: { rank: 4814, score: 898 },
soulWarsZeal: { rank: 37, score: 225 },
riftsClosed: { rank: 23, score: 467 },
clues: {
all: { rank: 24817, score: 476 },
beginner: { rank: 212728, score: 1 },
easy: { rank: 94827, score: 20 },
medium: { rank: 59099, score: 74 },
hard: { rank: 24642, score: 231 },
elite: { rank: 5206, score: 99 },
master: { rank: 6293, score: 51 },
all: { rank: 32, score: 12148 },
beginner: { rank: 3105, score: 76 },
easy: { rank: 1997, score: 505 },
medium: { rank: 127, score: 4259 },
hard: { rank: 361, score: 915 },
elite: { rank: 392, score: 250 },
master: { rank: 1, score: 6143 }
},
});
});
test('Get rsn format', async done => {
const callback = (data: string) => {
expect(data).toBe('Lynx Titan');
done();
bosses: {
abyssalSire: { rank: 382, score: 2780 },
alchemicalHydra: { rank: 944, score: 3000 },
barrows: { rank: 1981, score: 1452 },
bryophyta: { rank: 4981, score: 23 },
callisto: { rank: 888, score: 1046 },
cerberus: { rank: 613, score: 4856 },
chambersOfXeric: { rank: 102, score: 4038 },
chambersOfXericChallengeMode: { rank: 156, score: 334 },
chaosElemental: { rank: 6240, score: 133 },
chaosFanatic: { rank: 4569, score: 250 },
commanderZilyana: { rank: 6893, score: 603 },
corporealBeast: { rank: 1, score: 17798 },
crazyArchaeologist: { rank: 9320, score: 125 },
dagannothPrime: { rank: 1030, score: 2802 },
dagannothRex: { rank: 4342, score: 1655 },
dagannothSupreme: { rank: 966, score: 2951 },
derangedArchaeologist: { rank: 10151, score: 1 },
generalGraardor: { rank: 1288, score: 2407 },
giantMole: { rank: 377, score: 4669 },
grotesqueGuardians: { rank: 545, score: 1567 },
hespori: { rank: 6083, score: 94 },
kalphiteQueen: { rank: 264, score: 2897 },
kingBlackDragon: { rank: 4052, score: 1277 },
kraken: { rank: 41643, score: 1477 },
kreeArra: { rank: 625, score: 2391 },
krilTsutsaroth: { rank: 120, score: 2981 },
mimic: { rank: 1, score: 109 },
nex: { rank: 99, score: 39002 },
nightmare: { rank: 3, score: 22666 },
phosanisNightmare: { rank: 2, score: 84 },
obor: { rank: 26, score: 323 },
sarachnis: { rank: 201, score: 1101 },
scorpia: { rank: 82, score: 3404 },
skotizo: { rank: 5085, score: 61 },
tempoross: { rank: 18823, score: 23 },
gauntlet: { rank: 63, score: 375 },
corruptedGauntlet: { rank: 2870, score: 6 },
theatreOfBlood: { rank: 6984, score: 138 },
theatreOfBloodHardMode: { rank: 23, score: 923141 },
thermonuclearSmokeDevil: { rank: 4043, score: 2000 },
tzKalZuk: { rank: 489, score: 8 },
tzTokJad: { rank: 967, score: 47 },
venenatis: { rank: 11155, score: 223 },
vetion: { rank: 1940, score: 272 },
vorkath: { rank: 8623, score: 1340 },
wintertodt: { rank: 605, score: 1694 },
zalcano: { rank: -1, score: -1 },
zulrah: { rank: 3867, score: 4583 }
}
};
getRSNFormat('lYnX tiTaN').then(callback);
expect(parseStats(csv)).toStrictEqual(expectedOutput);
});
test('Get attack top page', async done => {
const callback = (data: PlayerSkillRow[]) => {
expect(data).toStrictEqual([
{ rsn: 'Heur', rank: 1, level: 99, xp: 200000000, dead: false },
test('Parse CSV with unknown activity', () => {
const statsWithUnknownActivity = `${lynxTitanStats}
-1,-1`;
expect(() => parseStats(statsWithUnknownActivity)).toThrow(
INVALID_FORMAT_ERROR
);
});
test('Parse invalid CSV', () => {
expect(() => parseStats('invalid')).toThrow(INVALID_FORMAT_ERROR);
});
describe('Get name format', () => {
it('gets a name with a space', async () => {
const data = await getRSNFormat(LYNX_TITAN_SPACE_NAME);
expect(data).toBe(LYNX_TITAN_FORMATTED_NAME);
});
it('gets a name with an underscore', async () => {
const data = await getRSNFormat(LYNX_TITAN_UNDERSCORE_NAME);
expect(data).toBe(LYNX_TITAN_FORMATTED_NAME);
});
it('gets a name with a hyphen', async () => {
const data = await getRSNFormat(LYNX_TITAN_HYPHEN_NAME);
expect(data).toBe(LYNX_TITAN_FORMATTED_NAME);
});
it('gets a name with a number', async () => {
const data = await getRSNFormat(B0ATY_NAME);
expect(data).toBe(B0ATY_FORMATTED_NAME);
});
it('throws an error for a name with invalid characters', async () => {
await expect(getRSNFormat('b&aty')).rejects.toBeTruthy();
});
});
test('Get attack top page', async () => {
const data = await getSkillPage('attack');
expect(data).toMatchObject([
{
rsn: 'Unohdettu2',
name: expect.any(String),
rank: 1,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 2,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{ rsn: 'Drakon', rank: 3, level: 99, xp: 200000000, dead: false },
{
rsn: 'Ame Umehara',
name: expect.any(String),
rank: 3,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 4,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{ rsn: 'Jakee', rank: 5, level: 99, xp: 200000000, dead: false },
{ rsn: 'Hitsuji', rank: 6, level: 99, xp: 200000000, dead: false },
{ rsn: 'Howson', rank: 7, level: 99, xp: 200000000, dead: false },
{ rsn: 'Dr PFAFF', rank: 8, level: 99, xp: 200000000, dead: false },
{
rsn: 'Malt Lickeys',
name: expect.any(String),
rank: 5,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 6,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 7,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 8,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 9,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{ rsn: 'Burned', rank: 10, level: 99, xp: 200000000, dead: false },
{
rsn: 'Blue Limes',
name: expect.any(String),
rank: 10,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 11,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'Mini Finbarr',
name: expect.any(String),
rank: 12,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'Unohdettu3',
name: expect.any(String),
rank: 13,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'Eslihero',
name: expect.any(String),
rank: 14,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'Lynx Titan',
name: expect.any(String),
rank: 15,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'AndrewWigins',
name: expect.any(String),
rank: 16,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{ rsn: 'iMelee', rank: 17, level: 99, xp: 200000000, dead: false },
{
rsn: 'Portuguese',
name: expect.any(String),
rank: 17,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 18,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'MarkoOSRS',
name: expect.any(String),
rank: 19,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{ rsn: 'Cairo', rank: 20, level: 99, xp: 200000000, dead: false },
{
rsn: 'Hey Jase',
name: expect.any(String),
rank: 20,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 21,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'Sleighur',
name: expect.any(String),
rank: 22,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{
rsn: 'KMSat200mALL',
name: expect.any(String),
rank: 23,
level: 99,
xp: 200000000,
dead: false,
dead: false
},
{ rsn: 'Yumemi', rank: 24, level: 99, xp: 200000000, dead: false },
{ rsn: 'Fiiggy', rank: 25, level: 99, xp: 200000000, dead: false },
{
name: expect.any(String),
rank: 24,
level: 99,
xp: 200000000,
dead: false
},
{
name: expect.any(String),
rank: 25,
level: 99,
xp: 200000000,
dead: false
}
]);
done();
};
getSkillPage('attack').then(callback);
});
test('Get non-existant player', async done => {
const callback = (err: AxiosError) => {
test('Get non-existent player', async () => {
getStats('fishy').catch((err) => {
if (err.response) {
expect(err.response.status).toBe(404);
}
done();
};
getStats('fishy').catch(callback);
});
});
test('Get stats by gamemode', async () => {
const { skills, bosses } = await getStatsByGamemode(
LYNX_TITAN_FORMATTED_NAME
);
expect(skills).toMatchObject({
overall: { rank: expect.any(Number), level: 2277, xp: 4600000000 },
attack: { rank: expect.any(Number), level: 99, xp: 200000000 },
defence: { rank: expect.any(Number), level: 99, xp: 200000000 },
strength: { rank: expect.any(Number), level: 99, xp: 200000000 },
hitpoints: { rank: expect.any(Number), level: 99, xp: 200000000 },
ranged: { rank: expect.any(Number), level: 99, xp: 200000000 },
prayer: { rank: expect.any(Number), level: 99, xp: 200000000 },
magic: { rank: expect.any(Number), level: 99, xp: 200000000 },
cooking: { rank: expect.any(Number), level: 99, xp: 200000000 },
woodcutting: { rank: expect.any(Number), level: 99, xp: 200000000 },
fletching: { rank: expect.any(Number), level: 99, xp: 200000000 },
fishing: { rank: expect.any(Number), level: 99, xp: 200000000 },
firemaking: { rank: expect.any(Number), level: 99, xp: 200000000 },
crafting: { rank: expect.any(Number), level: 99, xp: 200000000 },
smithing: { rank: expect.any(Number), level: 99, xp: 200000000 },
mining: { rank: expect.any(Number), level: 99, xp: 200000000 },
herblore: { rank: expect.any(Number), level: 99, xp: 200000000 },
agility: { rank: expect.any(Number), level: 99, xp: 200000000 },
thieving: { rank: expect.any(Number), level: 99, xp: 200000000 },
slayer: { rank: expect.any(Number), level: 99, xp: 200000000 },
farming: { rank: expect.any(Number), level: 99, xp: 200000000 },
runecraft: { rank: expect.any(Number), level: 99, xp: 200000000 },
hunter: { rank: expect.any(Number), level: 99, xp: 200000000 },
construction: { rank: expect.any(Number), level: 99, xp: 200000000 }
});
const bossKeys = Object.keys(bosses);
expect(bossKeys).toStrictEqual(BOSSES);
expect.assertions(2);
});

952
__tests__/lynxTitanNamePage.html vendored Normal file
View File

@@ -0,0 +1,952 @@
<!DOCTYPE html>
<!-- saved from url=(0090)https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0&user=lynx%20titan -->
<html class="js svg websockets localstorage websocketsbinary sharedworkers webworkers classlist canvas video webgl csspointerevents progressbar meter fileinput inlinesvg supports datalistelem no-touchevents details indexeddb indexeddb-deletedatabase appearance backgroundcliptext borderimage boxsizing cssfilters flexbox flexboxlegacy no-flexboxtweener webp webp-alpha webp-animation webp-lossless dataworkers blobworkers no-videoautoplay" lang="en" data-whatinput="mouse" data-whatintent="mouse"><!--<![endif]--><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><script src="./lynxTitanNamePage_files/sdk.js" async="" crossorigin="anonymous"></script><script async="" src="./lynxTitanNamePage_files/gtm.js"></script><script src="./lynxTitanNamePage_files/Criciousand-meth-shake-Exit-be-till-in-ches-Shad" async=""></script>
<link href="./lynxTitanNamePage_files/rsp777_basic-101.css" rel="stylesheet" type="text/css" media="all">
<script src="./lynxTitanNamePage_files/vendor-1.js"></script>
<title>Old School Hiscores</title>
<meta name="keywords" content="MMORPG, free RPG games online, online multiplayer, role-playing, massively multiplayer games, mmo, RuneScape, Jagex">
<meta name="description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<link rel="icon" type="image/vnd.microsoft.icon" href="https://www.runescape.com/img/global/favicon.ico">
<link rel="SHORTCUT ICON" href="https://www.runescape.com/img/global/favicon.ico">
<link rel="apple-touch-icon" href="https://www.runescape.com/img/global/mobile.png">
<meta property="fb:app_id" content="174823375888281">
<meta property="og:title" content="Old School Hiscores">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Old School RuneScape">
<meta property="og:image" content="https://www.runescape.com/img/rsp777/social-share-fb.jpg?1">
<meta property="og:url" content="https://www.runescape.com">
<meta property="og:description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="google-site-verification" content="RFtGg-G07XweT7nQe032HocvnRPhJAsdZqrq4NX_Op8">
<meta itemprop="name" content="RuneScape">
<meta itemprop="description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="twitter:domain" content="Oldschool.RuneScape.com">
<meta name="twitter:url" content="https://www.runescape.com">
<meta name="twitter:title" content="Old School Hiscores">
<meta name="twitter:description" content="If you&#39;re a RuneScape veteran hungry for nostalgia, get stuck right in to Old School RuneScape. Sign up for membership and re-live the adventure.">
<meta name="twitter:image:src" content="https://www.runescape.com/img/rsp777/social-share.jpg?1">
<meta name="twitter:site" content="@OldSchoolRS">
<meta name="google-site-verification" content="pUwl5KYHKSZ6tbbgsR2wYNv1kbVmsYral3iFmijHTWM">
<link href="./lynxTitanNamePage_files/rsp777_hiscore-105.css" rel="stylesheet" type="text/css" media="all">
<style>
.leaguepoints:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_leaguepoints.png?2');
}
.bountyhunterhunter:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bountyhunterhunter.png?2');
}
.bountyhunterrogue:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bountyhunterrogue.png?2');
}
.cluescrollsall:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsall.png?2');
}
.cluescrollsbeginner:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsbeginner.png?2');
}
.cluescrollseasy:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollseasy.png?2');
}
.cluescrollsmedium:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsmedium.png?2');
}
.cluescrollshard:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollshard.png?2');
}
.cluescrollselite:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollselite.png?2');
}
.cluescrollsmaster:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cluescrollsmaster.png?2');
}
.lmsrank:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_lmsrank.png?2');
}
.soulwarszeal:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_soulwarszeal.png?2');
}
.abyssalsire:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_abyssalsire.png?2');
}
.alchemicalhydra:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_alchemicalhydra.png?2');
}
.barrowschests:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_barrowschests.png?2');
}
.bryophyta:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_bryophyta.png?2');
}
.callisto:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_callisto.png?2');
}
.cerberus:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_cerberus.png?2');
}
.chambersofxeric:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chambersofxeric.png?2');
}
.chambersofxericchallengemode:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chambersofxericchallengemode.png?2');
}
.chaoselemental:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chaoselemental.png?2');
}
.chaosfanatic:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_chaosfanatic.png?2');
}
.commanderzilyana:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_commanderzilyana.png?2');
}
.corporealbeast:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_corporealbeast.png?2');
}
.crazyarchaeologist:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_crazyarchaeologist.png?2');
}
.dagannothprime:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothprime.png?2');
}
.dagannothrex:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothrex.png?2');
}
.dagannothsupreme:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_dagannothsupreme.png?2');
}
.derangedarchaeologist:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_derangedarchaeologist.png?2');
}
.generalgraardor:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_generalgraardor.png?2');
}
.giantmole:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_giantmole.png?2');
}
.grotesqueguardians:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_grotesqueguardians.png?2');
}
.hespori:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_hespori.png?2');
}
.kalphitequeen:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kalphitequeen.png?2');
}
.kingblackdragon:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kingblackdragon.png?2');
}
.kraken:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kraken.png?2');
}
.kreearra:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kreearra.png?2');
}
.kriltsutsaroth:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_kriltsutsaroth.png?2');
}
.mimic:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_mimic.png?2');
}
.nightmare:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_nightmare.png?2');
}
.obor:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_obor.png?2');
}
.sarachnis:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_sarachnis.png?2');
}
.scorpia:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_scorpia.png?2');
}
.skotizo:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_skotizo.png?2');
}
.tempoross:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tempoross.png?2');
}
.thegauntlet:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thegauntlet.png?2');
}
.thecorruptedgauntlet:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thecorruptedgauntlet.png?2');
}
.theatreofblood:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_theatreofblood.png?2');
}
.thermonuclearsmokedevil:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_thermonuclearsmokedevil.png?2');
}
.tzkalzuk:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tzkalzuk.png?2');
}
.tztokjad:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_tztokjad.png?2');
}
.venenatis:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_venenatis.png?2');
}
.vetion:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_vetion.png?2');
}
.vorkath:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_vorkath.png?2');
}
.wintertodt:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_wintertodt.png?2');
}
.zalcano:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_zalcano.png?2');
}
.zulrah:before {
content: url('https://www.runescape.com/img/rsp777/game_icon_zulrah.png?2');
}
</style>
<style type="text/css" data-fbcssmodules="css:fb.css.base css:fb.css.dialog css:fb.css.iframewidget css:fb.css.customer_chat_plugin_iframe">.fb_hidden{position:absolute;top:-10000px;z-index:10001}.fb_reposition{overflow:hidden;position:relative}.fb_invisible{display:none}.fb_reset{background:none;border:0;border-spacing:0;color:#000;cursor:auto;direction:ltr;font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:1;margin:0;overflow:visible;padding:0;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;visibility:visible;white-space:normal;word-spacing:normal}.fb_reset>div{overflow:hidden}@keyframes fb_transform{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.fb_animate{animation:fb_transform .3s forwards}
.fb_dialog{background:rgba(82, 82, 82, .7);position:absolute;top:-10000px;z-index:10001}.fb_dialog_advanced{border-radius:8px;padding:10px}.fb_dialog_content{background:#fff;color:#373737}.fb_dialog_close_icon{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 0 transparent;cursor:pointer;display:block;height:15px;position:absolute;right:18px;top:17px;width:15px}.fb_dialog_mobile .fb_dialog_close_icon{left:5px;right:auto;top:5px}.fb_dialog_padding{background-color:transparent;position:absolute;width:1px;z-index:-1}.fb_dialog_close_icon:hover{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 -15px transparent}.fb_dialog_close_icon:active{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yq/r/IE9JII6Z1Ys.png) no-repeat scroll 0 -30px transparent}.fb_dialog_iframe{line-height:0}.fb_dialog_content .dialog_title{background:#6d84b4;border:1px solid #365899;color:#fff;font-size:14px;font-weight:bold;margin:0}.fb_dialog_content .dialog_title>span{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/yd/r/Cou7n-nqK52.gif) no-repeat 5px 50%;float:left;padding:5px 0 7px 26px}body.fb_hidden{height:100%;left:0;margin:0;overflow:visible;position:absolute;top:-10000px;transform:none;width:100%}.fb_dialog.fb_dialog_mobile.loading{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/ya/r/3rhSv5V8j3o.gif) white no-repeat 50% 50%;min-height:100%;min-width:100%;overflow:hidden;position:absolute;top:0;z-index:10001}.fb_dialog.fb_dialog_mobile.loading.centered{background:none;height:auto;min-height:initial;min-width:initial;width:auto}.fb_dialog.fb_dialog_mobile.loading.centered #fb_dialog_loader_spinner{width:100%}.fb_dialog.fb_dialog_mobile.loading.centered .fb_dialog_content{background:none}.loading.centered #fb_dialog_loader_close{clear:both;color:#fff;display:block;font-size:18px;padding-top:20px}#fb-root #fb_dialog_ipad_overlay{background:rgba(0, 0, 0, .4);bottom:0;left:0;min-height:100%;position:absolute;right:0;top:0;width:100%;z-index:10000}#fb-root #fb_dialog_ipad_overlay.hidden{display:none}.fb_dialog.fb_dialog_mobile.loading iframe{visibility:hidden}.fb_dialog_mobile .fb_dialog_iframe{position:sticky;top:0}.fb_dialog_content .dialog_header{background:linear-gradient(from(#738aba), to(#2c4987));border-bottom:1px solid;border-color:#043b87;box-shadow:white 0 1px 1px -1px inset;color:#fff;font:bold 14px Helvetica, sans-serif;text-overflow:ellipsis;text-shadow:rgba(0, 30, 84, .296875) 0 -1px 0;vertical-align:middle;white-space:nowrap}.fb_dialog_content .dialog_header table{height:43px;width:100%}.fb_dialog_content .dialog_header td.header_left{font-size:12px;padding-left:5px;vertical-align:middle;width:60px}.fb_dialog_content .dialog_header td.header_right{font-size:12px;padding-right:5px;vertical-align:middle;width:60px}.fb_dialog_content .touchable_button{background:linear-gradient(from(#4267B2), to(#2a4887));background-clip:padding-box;border:1px solid #29487d;border-radius:3px;display:inline-block;line-height:18px;margin-top:3px;max-width:85px;padding:4px 12px;position:relative}.fb_dialog_content .dialog_header .touchable_button input{background:none;border:none;color:#fff;font:bold 12px Helvetica, sans-serif;margin:2px -12px;padding:2px 6px 3px 6px;text-shadow:rgba(0, 30, 84, .296875) 0 -1px 0}.fb_dialog_content .dialog_header .header_center{color:#fff;font-size:16px;font-weight:bold;line-height:18px;text-align:center;vertical-align:middle}.fb_dialog_content .dialog_content{background:url(https://static.xx.fbcdn.net/rsrc.php/v3/y9/r/jKEcVPZFk-2.gif) no-repeat 50% 50%;border:1px solid #4a4a4a;border-bottom:0;border-top:0;height:150px}.fb_dialog_content .dialog_footer{background:#f5f6f7;border:1px solid #4a4a4a;border-top-color:#ccc;height:40px}#fb_dialog_loader_close{float:left}.fb_dialog.fb_dialog_mobile .fb_dialog_close_icon{visibility:hidden}#fb_dialog_loader_spinner{animation:rotateSpinner 1.2s linear infinite;background-color:transparent;background-image:url(https://static.xx.fbcdn.net/rsrc.php/v3/yD/r/t-wz8gw1xG1.png);background-position:50% 50%;background-repeat:no-repeat;height:24px;width:24px}@keyframes rotateSpinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
.fb_iframe_widget{display:inline-block;position:relative}.fb_iframe_widget span{display:inline-block;position:relative;text-align:justify}.fb_iframe_widget iframe{position:absolute}.fb_iframe_widget_fluid_desktop,.fb_iframe_widget_fluid_desktop span,.fb_iframe_widget_fluid_desktop iframe{max-width:100%}.fb_iframe_widget_fluid_desktop iframe{min-width:220px;position:relative}.fb_iframe_widget_lift{z-index:1}.fb_iframe_widget_fluid{display:inline}.fb_iframe_widget_fluid span{width:100%}
.fb_mpn_mobile_landing_page_slide_out{animation-duration:200ms;animation-name:fb_mpn_landing_page_slide_out;transition-timing-function:ease-in}.fb_mpn_mobile_landing_page_slide_out_from_left{animation-duration:200ms;animation-name:fb_mpn_landing_page_slide_out_from_left;transition-timing-function:ease-in}.fb_mpn_mobile_landing_page_slide_up{animation-duration:500ms;animation-name:fb_mpn_landing_page_slide_up;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_in{animation-duration:300ms;animation-name:fb_mpn_bounce_in;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_out{animation-duration:300ms;animation-name:fb_mpn_bounce_out;transition-timing-function:ease-in}.fb_mpn_mobile_bounce_out_v2{animation-duration:300ms;animation-name:fb_mpn_fade_out;transition-timing-function:ease-in}.fb_customer_chat_bounce_in_v2{animation-duration:300ms;animation-name:fb_bounce_in_v2;transition-timing-function:ease-in}.fb_customer_chat_bounce_in_from_left{animation-duration:300ms;animation-name:fb_bounce_in_from_left;transition-timing-function:ease-in}.fb_customer_chat_bounce_out_v2{animation-duration:300ms;animation-name:fb_bounce_out_v2;transition-timing-function:ease-in}.fb_customer_chat_bounce_out_from_left{animation-duration:300ms;animation-name:fb_bounce_out_from_left;transition-timing-function:ease-in}.fb_customer_chat_bubble_animated_no_badge{box-shadow:0 3px 12px rgba(0, 0, 0, .15);transition:box-shadow 150ms linear}.fb_customer_chat_bubble_animated_no_badge:hover{box-shadow:0 5px 24px rgba(0, 0, 0, .3)}.fb_customer_chat_bubble_animated_with_badge{box-shadow:-5px 4px 14px rgba(0, 0, 0, .15);transition:box-shadow 150ms linear}.fb_customer_chat_bubble_animated_with_badge:hover{box-shadow:-5px 8px 24px rgba(0, 0, 0, .2)}.fb_invisible_flow{display:inherit;height:0;overflow-x:hidden;width:0}.fb_new_ui_mobile_overlay_active{overflow:hidden}@keyframes fb_mpn_landing_page_slide_in{0%{border-radius:50%;margin:0 24px;width:60px}40%{border-radius:18px}100%{margin:0 12px;width:100% - 24px}}@keyframes fb_mpn_landing_page_slide_in_from_left{0%{border-radius:50%;left:12px;margin:0 24px;width:60px}40%{border-radius:18px}100%{left:12px;margin:0 12px;width:100% - 24px}}@keyframes fb_mpn_landing_page_slide_out{0%{margin:0 12px;width:100% - 24px}60%{border-radius:18px}100%{border-radius:50%;margin:0 24px;width:60px}}@keyframes fb_mpn_landing_page_slide_out_from_left{0%{left:12px;width:100% - 24px}60%{border-radius:18px}100%{border-radius:50%;left:12px;width:60px}}@keyframes fb_mpn_landing_page_slide_up{0%{bottom:0;opacity:0}100%{bottom:24px;opacity:1}}@keyframes fb_mpn_bounce_in{0%{opacity:.5;top:100%}100%{opacity:1;top:0}}@keyframes fb_mpn_fade_out{0%{bottom:30px;opacity:1}100%{bottom:0;opacity:0}}@keyframes fb_mpn_bounce_out{0%{opacity:1;top:0}100%{opacity:.5;top:100%}}@keyframes fb_bounce_in_v2{0%{opacity:0;transform:scale(0, 0);transform-origin:bottom right}50%{transform:scale(1.03, 1.03);transform-origin:bottom right}100%{opacity:1;transform:scale(1, 1);transform-origin:bottom right}}@keyframes fb_bounce_in_from_left{0%{opacity:0;transform:scale(0, 0);transform-origin:bottom left}50%{transform:scale(1.03, 1.03);transform-origin:bottom left}100%{opacity:1;transform:scale(1, 1);transform-origin:bottom left}}@keyframes fb_bounce_out_v2{0%{opacity:1;transform:scale(1, 1);transform-origin:bottom right}100%{opacity:0;transform:scale(0, 0);transform-origin:bottom right}}@keyframes fb_bounce_out_from_left{0%{opacity:1;transform:scale(1, 1);transform-origin:bottom left}100%{opacity:0;transform:scale(0, 0);transform-origin:bottom left}}@keyframes fb_bounce_out_v2_mobile_chat_started{0%{opacity:1;top:0}100%{opacity:0;top:20px}}@keyframes fb_customer_chat_bubble_bounce_in_animation{0%{bottom:6pt;opacity:0;transform:scale(0, 0);transform-origin:center}70%{bottom:18pt;opacity:1;transform:scale(1.2, 1.2)}100%{transform:scale(1, 1)}}@keyframes slideInFromBottom{0%{opacity:.1;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}@keyframes slideInFromBottomDelay{0%{opacity:0;transform:translateY(100%)}97%{opacity:0;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}</style></head>
<body id="body"><div id="fb-root" class="174823375888281 fb_reset"><script async="" src="./lynxTitanNamePage_files/sdk(1).js"></script><div style="position: absolute; top: -10000px; width: 0px; height: 0px;"><div></div></div></div>
<div class="centerDiv">
<div class="frame wide_e">
<span style="float:right;"><a id="loginLink" href="https://secure.runescape.com/m=weblogin/loginform?theme=oldschool&amp;mod=hiscore_oldschool&amp;ssl=1&amp;dest=overall?category_type=0&amp;user=lynx%20titan">Log in</a></span>
</div>
<br>
<div class="hiscoretitlebground">
<div class="hiscoretitleframe">
<strong>Old School Hiscores</strong><br>
<a href="https://oldschool.runescape.com/">Home</a>
</div>
</div>
<br>
<div align="center">
<div class="ironman-nav">
<span class="ironman-nav__option ironman-nav__option--current">Hiscores</span>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_ironman/">Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_ultimate/">Ultimate Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_hardcore_ironman/">Hardcore Ironman</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_deadman/">Deadman Mode</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_seasonal/">Leagues</a>
<a class="ironman-nav__option" href="https://secure.runescape.com/m=hiscore_oldschool_tournament/">Tournament</a>
</div>
<div class="personal-hiscores">
<nav class="personal-hiscores__side-banner">
<div id="col1">
<div id="headerCategory"></div>
<a class="personal-hiscores__scroll-arrow personal-hiscores__scroll-arrow--up personal-hiscores__scroll-arrow--disabled" href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0&amp;user=lynx%20titan#" data-js-scroll="up">Up</a>
<div id="contentCategory">
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&amp;user=lynx%20titan" class=" Overall ">
Overall
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=1&amp;user=lynx%20titan" class=" Attack ">
Attack
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=2&amp;user=lynx%20titan" class=" Defence ">
Defence
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=3&amp;user=lynx%20titan" class=" Strength ">
Strength
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=4&amp;user=lynx%20titan" class=" Hitpoints ">
Hitpoints
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=5&amp;user=lynx%20titan" class=" Ranged ">
Ranged
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=6&amp;user=lynx%20titan" class=" Prayer ">
Prayer
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=7&amp;user=lynx%20titan" class=" Magic ">
Magic
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=8&amp;user=lynx%20titan" class=" Cooking ">
Cooking
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=9&amp;user=lynx%20titan" class=" Woodcutting ">
Woodcutting
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=10&amp;user=lynx%20titan" class=" Fletching ">
Fletching
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=11&amp;user=lynx%20titan" class=" Fishing ">
Fishing
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=12&amp;user=lynx%20titan" class=" Firemaking ">
Firemaking
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=13&amp;user=lynx%20titan" class=" Crafting ">
Crafting
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=14&amp;user=lynx%20titan" class=" Smithing ">
Smithing
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=15&amp;user=lynx%20titan" class=" Mining ">
Mining
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=16&amp;user=lynx%20titan" class=" Herblore ">
Herblore
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=17&amp;user=lynx%20titan" class=" Agility ">
Agility
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=18&amp;user=lynx%20titan" class=" Thieving ">
Thieving
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=19&amp;user=lynx%20titan" class=" Slayer ">
Slayer
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=20&amp;user=lynx%20titan" class=" Farming ">
Farming
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=21&amp;user=lynx%20titan" class=" Runecraft ">
Runecraft
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=22&amp;user=lynx%20titan" class=" Hunter ">
Hunter
</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=23&amp;user=lynx%20titan" class=" Construction ">
Construction
</a>
<span style="color: #d9c27e;display: block;text-align: center;">----</span>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=1&amp;user=lynx%20titan" class="activity-link bountyhunterhunter">Bounty Hunter - Hunter</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=2&amp;user=lynx%20titan" class="activity-link bountyhunterrogue">Bounty Hunter - Rogue</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=3&amp;user=lynx%20titan" class="activity-link cluescrollsall">Clue Scrolls (all)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=4&amp;user=lynx%20titan" class="activity-link cluescrollsbeginner">Clue Scrolls (beginner)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=5&amp;user=lynx%20titan" class="activity-link cluescrollseasy">Clue Scrolls (easy)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=6&amp;user=lynx%20titan" class="activity-link cluescrollsmedium">Clue Scrolls (medium)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=7&amp;user=lynx%20titan" class="activity-link cluescrollshard">Clue Scrolls (hard)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=8&amp;user=lynx%20titan" class="activity-link cluescrollselite">Clue Scrolls (elite)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=9&amp;user=lynx%20titan" class="activity-link cluescrollsmaster">Clue Scrolls (master)</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=10&amp;user=lynx%20titan" class="activity-link lmsrank">LMS - Rank</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=11&amp;user=lynx%20titan" class="activity-link soulwarszeal">Soul Wars Zeal</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=12&amp;user=lynx%20titan" class="activity-link abyssalsire">Abyssal Sire</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=13&amp;user=lynx%20titan" class="activity-link alchemicalhydra">Alchemical Hydra</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=14&amp;user=lynx%20titan" class="activity-link barrowschests">Barrows Chests</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=15&amp;user=lynx%20titan" class="activity-link bryophyta">Bryophyta</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=16&amp;user=lynx%20titan" class="activity-link callisto">Callisto</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=17&amp;user=lynx%20titan" class="activity-link cerberus">Cerberus</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=18&amp;user=lynx%20titan" class="activity-link chambersofxeric">Chambers of Xeric</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=19&amp;user=lynx%20titan" class="activity-link chambersofxericchallengemode">Chambers of Xeric: Challenge Mode</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=20&amp;user=lynx%20titan" class="activity-link chaoselemental">Chaos Elemental</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=21&amp;user=lynx%20titan" class="activity-link chaosfanatic">Chaos Fanatic</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=22&amp;user=lynx%20titan" class="activity-link commanderzilyana">Commander Zilyana</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=23&amp;user=lynx%20titan" class="activity-link corporealbeast">Corporeal Beast</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=24&amp;user=lynx%20titan" class="activity-link crazyarchaeologist">Crazy Archaeologist</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=25&amp;user=lynx%20titan" class="activity-link dagannothprime">Dagannoth Prime</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=26&amp;user=lynx%20titan" class="activity-link dagannothrex">Dagannoth Rex</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=27&amp;user=lynx%20titan" class="activity-link dagannothsupreme">Dagannoth Supreme</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=28&amp;user=lynx%20titan" class="activity-link derangedarchaeologist">Deranged Archaeologist</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=29&amp;user=lynx%20titan" class="activity-link generalgraardor">General Graardor</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=30&amp;user=lynx%20titan" class="activity-link giantmole">Giant Mole</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=31&amp;user=lynx%20titan" class="activity-link grotesqueguardians">Grotesque Guardians</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=32&amp;user=lynx%20titan" class="activity-link hespori">Hespori</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=33&amp;user=lynx%20titan" class="activity-link kalphitequeen">Kalphite Queen</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=34&amp;user=lynx%20titan" class="activity-link kingblackdragon">King Black Dragon</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=35&amp;user=lynx%20titan" class="activity-link kraken">Kraken</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=36&amp;user=lynx%20titan" class="activity-link kreearra">Kree'Arra</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=37&amp;user=lynx%20titan" class="activity-link kriltsutsaroth">K'ril Tsutsaroth</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=38&amp;user=lynx%20titan" class="activity-link mimic">Mimic</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=39&amp;user=lynx%20titan" class="activity-link nightmare">Nightmare</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=40&amp;user=lynx%20titan" class="activity-link obor">Obor</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=41&amp;user=lynx%20titan" class="activity-link sarachnis">Sarachnis</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=42&amp;user=lynx%20titan" class="activity-link scorpia">Scorpia</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=43&amp;user=lynx%20titan" class="activity-link skotizo">Skotizo</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=44&amp;user=lynx%20titan" class="activity-link tempoross">Tempoross</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=45&amp;user=lynx%20titan" class="activity-link thegauntlet">The Gauntlet</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=46&amp;user=lynx%20titan" class="activity-link thecorruptedgauntlet">The Corrupted Gauntlet</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=47&amp;user=lynx%20titan" class="activity-link theatreofblood">Theatre of Blood</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=48&amp;user=lynx%20titan" class="activity-link thermonuclearsmokedevil">Thermonuclear Smoke Devil</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=49&amp;user=lynx%20titan" class="activity-link tzkalzuk">TzKal-Zuk</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=50&amp;user=lynx%20titan" class="activity-link tztokjad">TzTok-Jad</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=51&amp;user=lynx%20titan" class="activity-link venenatis">Venenatis</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=52&amp;user=lynx%20titan" class="activity-link vetion">Vet'ion</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=53&amp;user=lynx%20titan" class="activity-link vorkath">Vorkath</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=54&amp;user=lynx%20titan" class="activity-link wintertodt">Wintertodt</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=55&amp;user=lynx%20titan" class="activity-link zalcano">Zalcano</a>
<a href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=1&amp;table=56&amp;user=lynx%20titan" class="activity-link zulrah">Zulrah</a>
</div>
<a class="personal-hiscores__scroll-arrow personal-hiscores__scroll-arrow--down" href="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0&amp;user=lynx%20titan#" data-js-scroll="down">Down</a>
<div id="footerCategory"></div>
</div>
</nav>
<div class="personal-hiscores__table">
<div id="col2">
<div id="headerHiscores"></div>
<div class="hiscoresHiddenBG">
<div id="contentHiscores">
<table>
<caption>
<img class="miniimg" src="./lynxTitanNamePage_files/blank.gif">
&nbsp;
Overall
Hiscores
</caption>
<thead>
<tr>
<th class="right">Rank</th>
<th class="left">Name</th>
<th>Level</th><th class="right">XP</th>
</tr>
</thead>
<tbody>
<tr>
<td width="60"></td>
<td width="120"></td>
<td width="70"></td><td width="100"></td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
<span style="color:#AA0022;">1</span>
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Lynx%A0Titan"><span style="color:#AA0022;">Lynx Titan</span></a>
</td>
<td>
<span style="color:#AA0022;">2,277</span>
</td>
<td class="right">
<span color="#AA0022">4,600,000,000</span>
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
2
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Hey%A0Jase">Hey&nbsp;Jase</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
3
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=ShawnBay">ShawnBay</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
4
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=senZe">senZe</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
5
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Tomdabom">Tomdabom</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
6
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Karma">Karma</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
7
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Harmony">Harmony</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
8
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=DedWilson">DedWilson</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
9
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=GodTormentor">GodTormentor</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
10
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Vinny">Vinny</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
11
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=borsi">borsi</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
12
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Brundeen">Brundeen</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
13
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Aziz">Aziz</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
14
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Eeli">Eeli</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
15
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=baile%A0y">baile&nbsp;y</a>
</td>
<td>
2,277
</td>
<td class="right">
4,600,000,000
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
16
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Dumbfounded">Dumbfounded</a>
</td>
<td>
2,277
</td>
<td class="right">
4,578,922,635
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
17
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Dan%A0Gleesac">Dan&nbsp;Gleesac</a>
</td>
<td>
2,277
</td>
<td class="right">
4,533,050,279
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
18
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=blind%A0idiot">blind&nbsp;idiot</a>
</td>
<td>
2,277
</td>
<td class="right">
4,522,080,162
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
19
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=he%20box%20jonge">he box jonge</a>
</td>
<td>
2,277
</td>
<td class="right">
4,511,571,769
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
20
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Oskar">Oskar</a>
</td>
<td>
2,277
</td>
<td class="right">
4,488,710,108
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
21
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Randalicious">Randalicious</a>
</td>
<td>
2,277
</td>
<td class="right">
4,431,024,107
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
22
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Gustav">Gustav</a>
</td>
<td>
2,277
</td>
<td class="right">
4,414,384,551
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
23
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Capt%A0King">Capt&nbsp;King</a>
</td>
<td>
2,277
</td>
<td class="right">
4,366,733,065
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
24
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Joonas">Joonas</a>
</td>
<td>
2,277
</td>
<td class="right">
4,318,668,761
</td>
</tr>
<tr class="personal-hiscores__row">
<td class="right">
25
</td>
<td class="left">
<a href="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1=Killzone">Killzone</a>
</td>
<td>
2,277
</td>
<td class="right">
4,289,590,389
</td>
</tr>
</tbody>
</table>
<nav class="personal-hiscores__pagination">
<a class="personal-hiscores__pagination-arrow personal-hiscores__pagination-arrow--down" href="https://secure.runescape.com/m=hiscore_oldschool/overall?table=0&amp;page=2" title="Scroll down table">
<img src="./lynxTitanNamePage_files/arrow_down.gif" alt="Scroll Down">
</a>
</nav>
</div>
</div>
<div id="footerHiscores"></div>
</div>
</div>
<div class="personal-hiscores__side-input">
<form action="https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal" method="post">
<div class="smallBox">
<p>
<b>Search by name</b>
<input class="text" maxlength="12" type="text" name="user1" value="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input maxlength="12" type="submit" name="submit" value="Search">
</p>
</div>
</form>
<form action="https://secure.runescape.com/m=hiscore_oldschool/overall?category_type=0" method="post">
<div class="smallBox">
<p>
<b>Search by rank</b>
<input class="text" maxlength="12" type="text" name="rank" value="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input type="hidden" name="table" value="0">
<input type="submit" name="submit" value="Search">
</p>
</div>
</form>
<form action="https://secure.runescape.com/m=hiscore_oldschool/compare" method="post" class="compareForm">
<div class="largeBox">
<p>
<b>Compare Users</b>
<input class="text" maxlength="12" type="text" name="user1" value="" pattern="^[a-zA-Z0-9]+([ _-&amp;nbsp;]{0,10}[0-9a-zA-Z]+)*$" title="player name" required="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input class="text" maxlength="12" type="text" name="user2" value="" pattern="^[a-zA-Z0-9]+([ _-&amp;nbsp;]{0,10}[0-9a-zA-Z]+)*$" title="player name" required="" autocomplete="off" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAr1JREFUWAndVzuLIkEQrhmVVUHROwPvzkTWDRbF28BgjW7xVxwY+gfEYCNBA6PL/AsGx8UbLQayZqKJayIILshytyiogbIY+LiquelGx3F80INwDUNXV1V/9fWrukcCLIVC4ct8Pv+B4t1qtfpMOlFFkqQ/iPVktVrvs9nsby2upAZ/xsAftUaRbSQyRBJftSRkGrnZwWkgFEOd5Y1xydi629CY29iKJYtecyP+erFoBs5a/m8C19fXkMlkgOpdxdQZCIfD4Ha7gepdxVQCePaVuKzWI2EqAb2AWt0GgYuLC7i8vASv16v1g1NtW0AahZW1PR4PpFIpcLlcsFwu4eHhAZrNpmI+1cawjWo+A7e3t0pwcpZlGRKJBO93qo0DGAicgIGPqSZOoFarwWQyUYLRElQqFR74VBsHMBCkXC63YnbaaIFAAEajEYzHY6ZWaiPbhuOeBh7JN3Spqu+D1w0Ce/oKNSOREZK44UsgFP0AMLwZP9D74GwEVI7feB44gLShSz6fN7STsVQqwcvLC/fDWfh07hkAYTOgPTU0TLvdDg6HQxnxYrGAwWDAR88EYQSKxSLD5HUymYSrqyul3W63YTqdchsTZDwO9G4XXnw+H4RCIY7baDS4vC7QHnhaV4iS4/E4sHdAv9+HXq+nCy1TRkLHoa71RKXT6YRoNMp71+t1LmsFmf5U6I8FSfwUtRyxWAxsNpsSazabQavV0sbl7X9vJt7cL6zfHXreFosF0uk0v9rpInt8fNRzVXTC80AkEuHBMdHArs3HGAknQJuPlW63C8Oh8fYSSiAYDILf72fx946eHI9ORLhR3yiH8yhrAiUdlu3e39+h0+msWbdFwjqaAMJU8fu+DQdQLpeVT8+2Q1c9egnUvDHaAXiwGkdPD5L7owlg3njFjjcI8Ium8OCIqiP1ob6EQVh/AVA3+XEhdOWMAAAAAElFTkSuQmCC&quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;">
<input type="submit" name="submit" value="Compare">
</p>
</div>
</form>
<div class="largeBox">
<div class="loginPrompt">
<b>Friends Hiscores</b>
To view personal<br>
hiscores and compare<br>
yourself to your friends<br>
</div>
<a href="https://secure.runescape.com/m=weblogin/oldschool_login?mod=hiscore_oldschool&amp;ssl=0&amp;dest=hiscorefriends_all" class="linkToFriends">Click here</a>
</div>
</div>
</div>
</div>
<div class="tandc">
<a href="http://www.jagex.com/" target="_top"><img class="footer__jagex-img" src="./lynxTitanNamePage_files/jagex-logo-landscape.svg" alt="Jagex Software"></a>
<p class="tandc__copy">This website and its contents are copyright <20> 1999 - 2021 Jagex Ltd, 220 Science Park, Cambridge, CB4 0WA, United Kingdom.<br>Use of this website is subject to our <a href="https://www.jagex.com/terms/terms.ws" target="_blank">Terms &amp; Conditions</a> and <a href="https://www.jagex.com/privacy/privacy.ws" target="_blank">Privacy Policy</a>. <br><a href="https://www.jagex.com/terms/rules-of-old-school-runescape">Rules of Old School RuneScape</a> | <a href="https://www.jagex.com/terms/cookies.ws">Change Cookie Settings</a></p>
<a class="osrsRSS" target="_BLANK" href="https://secure.runescape.com/m=news/latest_news.rss?oldschool=true"><img src="./lynxTitanNamePage_files/rss.png" title="OSRS RSS Feed" alt="OSRS RSS Feed"></a>
</div> <script src="./lynxTitanNamePage_files/modernizr_3_0_0_min-100.js"></script>
<script src="./lynxTitanNamePage_files/rsp777_basic-105.js"></script>
<script src="./lynxTitanNamePage_files/rsp777_twitter-100.js"></script>
<script type="text/javascript">
if ($("#fb-root").length == 0){
$("body").prepend('<div id="fb-root" class="174823375888281"></div>');
window.fbAsyncInit = function() {
FB.init({
appId: '174823375888281',
status: false,
cookie: true,
xfbml: true,
oauth: true,
version: 'v2.8'
});
};
(function() {
var e = document.createElement('script');
e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/sdk.js';
document.getElementById('fb-root').appendChild(e);
}());
}
</script>
<a style="display:none" id="SNbuttonLink" class="thickbox"></a>
<script type="text/javascript">
function fbLoginRedirect(buttonName, loginUrl, destUrl, destStr, _target){
$.getJSON('https://secure.runescape.com/m=sn-integration/checkLogin.ws?json=?', {"tps":0, "token":FB.getAuthResponse().accessToken, "expiry":FB.getAuthResponse().expiresIn, "signed":FB.getAuthResponse().signedRequest}, function(data) {
if(typeof(_target) != 'undefined' && _target != '') $("#SNbuttonLink").attr('target',_target);
if (data['sso']<0) {
JAGEX.socialnetworks.SNNotification("There was a problem verifying your login. Please try again.");
} else if (data['sso'].length > 1){
if(data['sna']>-1) {
$("#SNbuttonLink").attr('href',loginUrl+'key='+data['sso']+'&tps=0&'+destStr+'&KeepThis=true&TB_iframe=true&height=500&width=560');
$("#SNbuttonLink").click();
$("#TB_iframeContent").attr("allowTransparency", "true");
$("#TB_iframeContent").css("padding-left", "50px");
} else {
var loc = destUrl+'?key='+data['sso']+'?'+destStr;
if(typeof(_target) != 'undefined' && _target != ''){
window.parent.location = loc;
}
else {
window.location = loc;
}
}
} else {
$("#SNbuttonLink").attr('href',loginUrl+destStr+'&KeepThis=true&TB_iframe=true&height=400&width=442');
$("#SNbuttonLink").click();
$("#TB_iframeContent").attr("allowTransparency", "true");
}
});
return false;
}
</script>
<script type="text/javascript" src="./lynxTitanNamePage_files/plugins-100.js"></script>
<script>
var RESPONSIVE = RESPONSIVE || {};
RESPONSIVE.constant = RESPONSIVE.constant || {};
RESPONSIVE.constant.user = {
language: 0,
isLoggedIn: 0
};
</script>
<script type="text/javascript" src="./lynxTitanNamePage_files/gtm-100.js"></script>
</div>
</body></html>

View File

@@ -0,0 +1,85 @@
1,2277,4600000000
15,99,200000000
28,99,200000000
18,99,200000000
7,99,200000000
8,99,200000000
11,99,200000000
32,99,200000000
159,99,200000000
15,99,200000000
12,99,200000000
9,99,200000000
48,99,200000000
4,99,200000000
3,99,200000000
25,99,200000000
5,99,200000000
23,99,200000000
12,99,200000000
2,99,200000000
19,99,200000000
7,99,200000000
4,99,200000000
4,99,200000000
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
347584,22
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
-1,-1
Can't render this file because it has a wrong number of fields in line 25.

View File

@@ -1,7 +0,0 @@
{
"transform": {
"^.+\\.(t|j)sx?$": "ts-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
"moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"]
}

View File

@@ -1,16 +1,18 @@
{
"name": "osrs-json-hiscores",
"version": "1.2.0",
"description": "The Oldschool Runescape API wrapper that does more!",
"version": "2.7.0",
"description": "The Old School Runescape API wrapper that does more!",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"files": [
"lib/**/*"
],
"scripts": {
"dev": "watch 'yarn run build' src",
"dev": "yarn build --watch",
"build": "tsc",
"test": "jest --config jestconfig.json",
"format": "prettier --write \"src/**/*.ts\"",
"lint": "eslint --fix \"src/**/*.ts\"",
"test": "jest",
"prepublish": "yarn run build",
"release": "np"
},
@@ -34,20 +36,79 @@
"url": "https://github.com/maxswa/osrs-json-hiscores/issues"
},
"homepage": "https://github.com/maxswa/osrs-json-hiscores#readme",
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{ts}": [
"eslint --fix",
"prettier --write",
"git add"
]
},
"eslintConfig": {
"root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.eslint.json"
},
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint-config-airbnb-typescript",
"prettier"
],
"ignorePatterns": [
"**/@types/*"
]
},
"prettier": {
"trailingComma": "none",
"tabWidth": 2,
"semi": true,
"singleQuote": true
},
"jest": {
"transform": {
"^.+\\.(t|j)sx?$": "ts-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
],
"testEnvironment": "node"
},
"dependencies": {
"axios": "^0.19.0",
"cheerio": "^1.0.0-rc.3"
"axios": "^0.21.1",
"jsdom": "^16.3.0",
"useragent-generator": "^1.1.0"
},
"devDependencies": {
"@types/cheerio": "^0.22.11",
"@types/jest": "^24.0.14",
"jest": "^24.8.0",
"np": "^5.0.3",
"ts-jest": "^24.0.2",
"tslint": "^5.17.0",
"tslint-config-airbnb": "^5.11.1",
"tslint-config-prettier": "^1.18.0",
"typescript": "^3.5.2",
"watch": "^1.0.2"
"@types/jest": "^26.0.21",
"@types/jsdom": "^16.2.3",
"@typescript-eslint/eslint-plugin": "^4.19.0",
"@typescript-eslint/parser": "^4.19.0",
"eslint": "^7.22.0",
"eslint-config-airbnb-typescript": "^12.3.1",
"eslint-config-prettier": "^8.1.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-react": "^7.23.1",
"eslint-plugin-react-hooks": "^4.2.0",
"husky": "^5.2.0",
"jest": "^26.6.3",
"lint-staged": "^10.5.4",
"np": "6.5.0",
"prettier": "^2.2.1",
"ts-jest": "^26.5.4",
"typescript": "^4.2.3"
}
}

109
src/@types/useragent-generator.d.ts vendored Normal file
View File

@@ -0,0 +1,109 @@
declare module 'useragent-generator' {
/** *****************
* Google Chrome *
/****************** */
export function chrome(
opt: number | string | { version: string; os?: string }
): string;
export namespace chrome {
function androidPhone(
opt:
| number
| string
| { version: string; androidVersion?: string; device?: string }
): string;
function androidTablet(
opt:
| number
| string
| { version: string; androidVersion?: string; device?: string }
): string;
function androidWebview(
opt:
| number
| string
| { androidVersion: string; chromeVersion?: string; device?: string }
): string;
function chromecast(opt: number | string | { version: string }): string;
function iOS(
opt:
| number
| string
| { iOSVersion: string; chromeVersion?: string; device?: string }
): string;
}
export function chromium(
opt: number | string | { version: string; os?: string }
): string;
/** ************
* Firefox *
/************* */
export function firefox(
opt: number | string | { version: string; os?: string }
): string;
export namespace firefox {
function androidPhone(
opt:
| number
| string
| { version: string; androidVersion?: string; device?: string }
): string;
function androidTablet(
opt:
| number
| string
| { version: string; androidVersion?: string; device?: string }
): string;
function iOS(
opt: number | string | { iOSVersion: string; device?: string }
): string;
}
/** ***********
* Safari *
/************ */
export function safari(
opt: number | string | { version: string; os?: string }
): string;
export namespace safari {
function iOS(
opt:
| number
| string
| { iOSVersion: string; safariVersion?: string; device?: string }
): string;
function iOSWebview(
opt:
| number
| string
| { iOSVersion: string; safariVersion?: string; device?: string }
): string;
}
/** ********************
* Internet Explorer *
/********************* */
export function ie(
opt: number | string | { version: string; os?: string }
): string;
export namespace ie {
function windowsPhone(
opt: number | string | { version: string; device?: string }
): string;
}
/** *******************
* Microsoft Edge *
/******************** */
export function edge(
opt:
| number
| string
| { version: string; chromeVersion?: string; os?: string }
): string;
/** *********************
* Search Engine Bots *
/********************** */
export function googleBot(
opt?: number | string | { version?: string }
): string;
export function bingBot(opt?: number | string | { version?: string }): string;
export function yahooBot(): string;
}

View File

@@ -1,26 +1,24 @@
import axios from 'axios';
import * as cheerio from 'cheerio';
import { JSDOM } from 'jsdom';
import {
Player,
Mode,
Activity,
Skill,
Stats,
Skills,
BH as BHStats,
BH,
Clues,
Gamemode,
SkillName,
PlayerSkillRow,
ActivityName,
PlayerActivityRow,
Bosses
} from './types';
import {
getStatsURL,
SKILLS,
BH_MODES,
CLUES,
MODES,
getPlayerTableURL,
getSkillPageURL,
GAMEMODES,
@@ -28,70 +26,212 @@ import {
numberFromElement,
rsnFromElement,
getActivityPageURL,
httpGet,
BOSSES,
INVALID_FORMAT_ERROR,
EXTRA_ACTIVITY_COUNT
} from './utils';
export async function getStats(
rsn: string,
mode: Mode = 'full'
): Promise<Player> {
/**
* Screen scrapes the hiscores to get the formatted rsn of a player.
*
* @param rsn Username of the player.
* @returns Formatted version of the rsn.
*/
export async function getRSNFormat(rsn: string): Promise<string> {
if (typeof rsn !== 'string') {
throw Error('RSN must be a string');
} else if (!/^[a-zA-Z0-9 _-]+$/.test(rsn)) {
throw Error('RSN contains invalid character');
} else if (rsn.length > 12 || rsn.length < 1) {
throw Error('RSN must be between 1 and 12 characters');
}
const url = getPlayerTableURL('main', rsn);
try {
const response = await httpGet(url);
const dom = new JSDOM(response.data);
const spans = dom.window.document.querySelectorAll(
'span[style="color:#AA0022;"]'
);
if (spans.length >= 2) {
const nameSpan = spans[1];
return rsnFromElement(nameSpan);
}
throw Error('Player not found');
} catch {
throw Error('Player not found');
}
}
/**
* Parses CSV string of raw stats and returns a stats object.
*
* @param csv Raw CSV from the official OSRS API.
* @returns Parsed stats object.
*/
export function parseStats(csv: string): Stats {
const splitCSV = csv
.split('\n')
.filter((entry) => !!entry)
.map((stat) => stat.split(','));
if (
splitCSV.length !==
SKILLS.length +
BH_MODES.length +
CLUES.length +
BOSSES.length +
EXTRA_ACTIVITY_COUNT
) {
throw Error(INVALID_FORMAT_ERROR);
}
const skillObjects: Skill[] = splitCSV
.filter((stat) => stat.length === 3)
.map((stat) => {
const [rank, level, xp] = stat;
const skill: Skill = {
rank: parseInt(rank, 10),
level: parseInt(level, 10),
xp: parseInt(xp, 10)
};
return skill;
});
const activityObjects: Activity[] = splitCSV
.filter((stat) => stat.length === 2)
.map((stat) => {
const [rank, score] = stat;
const activity: Activity = {
rank: parseInt(rank, 10),
score: parseInt(score, 10)
};
return activity;
});
const [leaguePoints] = activityObjects.splice(0, 1);
const bhObjects = activityObjects.splice(0, BH_MODES.length);
const clueObjects = activityObjects.splice(0, CLUES.length);
const [lastManStanding, soulWarsZeal, riftsClosed] = activityObjects.splice(
0,
3
);
const bossObjects = activityObjects.splice(0, BOSSES.length);
const skills: Skills = skillObjects.reduce<Skills>((prev, curr, index) => {
const newSkills = { ...prev };
newSkills[SKILLS[index]] = curr;
return newSkills;
}, {} as Skills);
const bountyHunter: BH = bhObjects.reduce<BH>((prev, curr, index) => {
const newBH = { ...prev };
newBH[BH_MODES[index]] = curr;
return newBH;
}, {} as BH);
const clues: Clues = clueObjects.reduce<Clues>((prev, curr, index) => {
const newClues = { ...prev };
newClues[CLUES[index]] = curr;
return newClues;
}, {} as Clues);
const bosses: Bosses = bossObjects.reduce<Bosses>((prev, curr, index) => {
const newBosses = { ...prev };
newBosses[BOSSES[index]] = curr;
return newBosses;
}, {} as Bosses);
const stats: Stats = {
skills,
leaguePoints,
bountyHunter,
lastManStanding,
soulWarsZeal,
riftsClosed,
clues,
bosses
};
return stats;
}
/**
* Fetches stats from the OSRS API and consolidates the info into a player object.
*
* **Note:** This function will make up to 5 separate network requests.
* As such, it is highly subject to the performance of the official OSRS API.
*
* @param rsn Username of the player.
* @returns Player object.
*/
export async function getStats(rsn: string): Promise<Player> {
if (typeof rsn !== 'string') {
throw Error('RSN must be a string');
} else if (!/^[a-zA-Z0-9 _]+$/.test(rsn)) {
throw Error('RSN contains invalid character');
} else if (rsn.length > 12 || rsn.length < 1) {
throw Error('RSN must be between 1 and 12 characters');
} else if (!MODES.includes(mode)) {
throw Error('Invalid game mode');
}
if (mode === 'full') {
const mainRes = await axios(getStatsURL('main', rsn));
const mainRes = await httpGet(getStatsURL('main', rsn));
if (mainRes.status === 200) {
const otherResponses = await Promise.all([
axios(getStatsURL('iron', rsn)).catch(err => err),
axios(getStatsURL('hc', rsn)).catch(err => err),
axios(getStatsURL('ult', rsn)).catch(err => err),
getRSNFormat(rsn),
httpGet(getStatsURL('ironman', rsn)).catch((err) => err),
httpGet(getStatsURL('hardcore', rsn)).catch((err) => err),
httpGet(getStatsURL('ultimate', rsn)).catch((err) => err),
getRSNFormat(rsn).catch(() => undefined)
]);
const [ironRes, hcRes, ultRes, formattedName] = otherResponses;
const player: Player = {
rsn: formattedName,
name: formattedName ?? rsn,
mode: 'main',
dead: false,
deulted: false,
deironed: false,
deironed: false
};
player.main = parseStats(mainRes.data);
if (ironRes.status === 200) {
player.iron = parseStats(ironRes.data);
player.ironman = parseStats(ironRes.data);
if (hcRes.status === 200) {
player.mode = 'hc';
player.hc = parseStats(hcRes.data);
if (player.iron.skills.overall.xp !== player.hc.skills.overall.xp) {
player.mode = 'hardcore';
player.hardcore = parseStats(hcRes.data);
if (
player.ironman.skills.overall.xp !== player.hardcore.skills.overall.xp
) {
player.dead = true;
player.mode = 'iron';
player.mode = 'ironman';
}
if (player.main.skills.overall.xp !== player.iron.skills.overall.xp) {
if (
player.main.skills.overall.xp !== player.ironman.skills.overall.xp
) {
player.deironed = true;
player.mode = 'main';
}
} else if (ultRes.status === 200) {
player.mode = 'ult';
player.ult = parseStats(ultRes.data);
if (player.iron.skills.overall.xp !== player.ult.skills.overall.xp) {
player.mode = 'ultimate';
player.ultimate = parseStats(ultRes.data);
if (
player.ironman.skills.overall.xp !== player.ultimate.skills.overall.xp
) {
player.deulted = true;
player.mode = 'iron';
player.mode = 'ironman';
}
if (player.main.skills.overall.xp !== player.iron.skills.overall.xp) {
if (
player.main.skills.overall.xp !== player.ironman.skills.overall.xp
) {
player.deironed = true;
player.mode = 'main';
}
} else {
player.mode = 'iron';
if (player.main.skills.overall.xp !== player.iron.skills.overall.xp) {
player.mode = 'ironman';
if (
player.main.skills.overall.xp !== player.ironman.skills.overall.xp
) {
player.deironed = true;
player.mode = 'main';
}
@@ -101,21 +241,35 @@ export async function getStats(
return player;
}
throw Error('Player not found');
} else {
const response = await axios(getStatsURL(mode, rsn));
}
/**
* Fetches stats from the OSRS API and returns them as an object.
*
* @param rsn Username of the player.
* @param mode Gamemode to fetch ranks for.
* @returns Stats object.
*/
export async function getStatsByGamemode(
rsn: string,
mode: Gamemode = 'main'
): Promise<Stats> {
if (typeof rsn !== 'string') {
throw Error('RSN must be a string');
} else if (!/^[a-zA-Z0-9 _]+$/.test(rsn)) {
throw Error('RSN contains invalid character');
} else if (rsn.length > 12 || rsn.length < 1) {
throw Error('RSN must be between 1 and 12 characters');
} else if (!GAMEMODES.includes(mode)) {
throw Error('Invalid game mode');
}
const response = await httpGet(getStatsURL(mode, rsn));
if (response.status !== 200) {
throw Error('Player not found');
}
const player: Player = {
rsn,
mode,
dead: false,
deulted: false,
deironed: false,
[mode]: parseStats(response.data),
};
return player;
}
const stats = parseStats(response.data);
return stats;
}
export async function getSkillPage(
@@ -132,27 +286,40 @@ export async function getSkillPage(
}
const url = getSkillPageURL(mode, skill, page);
const response = await axios(url);
const $ = cheerio.load(response.data);
const playersHTML = $('.personal-hiscores__row').toArray();
const response = await httpGet(url);
const dom = new JSDOM(response.data);
const playersHTML = dom.window.document.querySelectorAll(
'.personal-hiscores__row'
);
const players: PlayerSkillRow[] = playersHTML.map(row => {
const cells = row.children.filter(el => el.name === 'td');
const [rankEl, nameCell, levelEl, xpEl] = cells;
const [nameEl] = nameCell.children.filter(el => el.name === 'a');
const players: PlayerSkillRow[] = [];
playersHTML.forEach((row) => {
const rankEl = row.querySelector('td');
const nameEl = row.querySelector('td a');
const levelEl = row.querySelector('td.left + td');
const xpEl = row.querySelector('td.left + td + td');
const isDead = !!row.querySelector('td img');
return {
rsn: rsnFromElement(nameEl),
players.push({
name: rsnFromElement(nameEl),
rank: numberFromElement(rankEl),
level: numberFromElement(levelEl),
xp: numberFromElement(xpEl),
dead: nameCell.children.length === 4,
};
dead: isDead
});
});
return players;
}
/**
* Screen scrapes a hiscores page of an activity or boss and returns an array of up to 25 players.
*
* @param activity Name of the activity or boss to fetch hiscores for.
* @param mode Gamemode to fetch ranks for.
* @param page Page number.
* @returns Array of `PlayerActivityRow` objects.
*/
export async function getActivityPage(
activity: ActivityName,
mode: Gamemode = 'main',
@@ -167,113 +334,26 @@ export async function getActivityPage(
}
const url = getActivityPageURL(mode, activity, page);
const response = await axios(url);
const $ = cheerio.load(response.data);
const playersHTML = $('.personal-hiscores__row').toArray();
const response = await httpGet(url);
const dom = new JSDOM(response.data);
const playersHTML = dom.window.document.querySelectorAll(
'.personal-hiscores__row'
);
const players: PlayerActivityRow[] = playersHTML.map(row => {
const cells = row.children.filter(el => el.name === 'td');
const [rankEl, nameCell, scoreEl] = cells;
const [nameEl] = nameCell.children.filter(el => el.name === 'a');
const players: PlayerActivityRow[] = [];
playersHTML.forEach((row) => {
const rankEl = row.querySelector('td');
const nameEl = row.querySelector('td a');
const scoreEl = row.querySelector('td.left + td');
const isDead = !!row.querySelector('td img');
return {
rsn: rsnFromElement(nameEl),
players.push({
name: rsnFromElement(nameEl),
rank: numberFromElement(rankEl),
score: numberFromElement(scoreEl),
dead: nameCell.children.length === 4,
};
dead: isDead
});
});
return players;
}
export async function getRSNFormat(rsn: string): Promise<string> {
if (typeof rsn !== 'string') {
throw Error('RSN must be a string');
} else if (!/^[a-zA-Z0-9 _]+$/.test(rsn)) {
throw Error('RSN contains invalid character');
} else if (rsn.length > 12 || rsn.length < 1) {
throw Error('RSN must be between 1 and 12 characters');
}
const url = getPlayerTableURL('main', rsn);
try {
const response = await axios(url);
const $ = cheerio.load(response.data);
const rawName = $('[style="color:#AA0022;"]')[1].children[0].data;
if (rawName) {
return rawName.replace(/\uFFFD/g, ' ');
}
throw Error('Player not found');
} catch {
throw Error('Player not found');
}
}
export function parseStats(csv: string): Stats {
const splitCSV = csv
.split('\n')
.filter(entry => !!entry)
.map(stat => stat.split(','));
const skillObjects: Skill[] = splitCSV
.filter(stat => stat.length === 3)
.map(stat => {
const skill: Skill = {
rank: parseInt(stat[0], 10),
level: parseInt(stat[1], 10),
xp: parseInt(stat[2], 10),
};
return skill;
});
const activityObjects: Activity[] = splitCSV
.filter(stat => stat.length === 2)
.map(stat => {
const activity: Activity = {
rank: parseInt(stat[0], 10),
score: parseInt(stat[1], 10),
};
return activity;
});
const bhObjects = activityObjects.splice(0, BH_MODES.length);
const [lms] = activityObjects.splice(0, 1);
const clueObjects = activityObjects.splice(0, CLUES.length);
const skills: Skills = skillObjects.reduce<Skills>(
(prev, curr, index) => {
const newSkills = { ...prev };
newSkills[SKILLS[index]] = curr;
return newSkills;
},
{} as Skills
);
const bh: BHStats = bhObjects.reduce<BHStats>(
(prev, curr, index) => {
const newBH = { ...prev };
newBH[BH_MODES[index]] = curr;
return newBH;
},
{} as BHStats
);
const clues: Clues = clueObjects.reduce<Clues>(
(prev, curr, index) => {
const newClues = { ...prev };
newClues[CLUES[index]] = curr;
return newClues;
},
{} as Clues
);
const stats: Stats = {
skills,
bh,
lms,
clues,
};
return stats;
}

View File

@@ -2,5 +2,6 @@ import * as hiscores from './hiscores';
export * from './hiscores';
export * from './types';
export * from './utils';
export default hiscores;

View File

@@ -1,6 +1,11 @@
export type Gamemode = 'main' | 'iron' | 'hc' | 'ult' | 'dmm' | 'sdmm' | 'dmmt';
export type Mode = Gamemode | 'full';
export type Gamemode =
| 'main'
| 'ironman'
| 'ultimate'
| 'hardcore'
| 'deadman'
| 'seasonal'
| 'tournament';
export interface Skill {
rank: number;
@@ -56,29 +61,88 @@ export type BHType = 'rogue' | 'hunter';
export type BH = { [Type in BHType]: Activity };
export type Boss =
| 'abyssalSire'
| 'alchemicalHydra'
| 'barrows'
| 'bryophyta'
| 'callisto'
| 'cerberus'
| 'chambersOfXeric'
| 'chambersOfXericChallengeMode'
| 'chaosElemental'
| 'chaosFanatic'
| 'commanderZilyana'
| 'corporealBeast'
| 'crazyArchaeologist'
| 'dagannothPrime'
| 'dagannothRex'
| 'dagannothSupreme'
| 'derangedArchaeologist'
| 'generalGraardor'
| 'giantMole'
| 'grotesqueGuardians'
| 'hespori'
| 'kalphiteQueen'
| 'kingBlackDragon'
| 'kraken'
| 'kreeArra'
| 'krilTsutsaroth'
| 'mimic'
| 'nex'
| 'nightmare'
| 'phosanisNightmare'
| 'obor'
| 'sarachnis'
| 'scorpia'
| 'skotizo'
| 'tempoross'
| 'gauntlet'
| 'corruptedGauntlet'
| 'theatreOfBlood'
| 'theatreOfBloodHardMode'
| 'thermonuclearSmokeDevil'
| 'tzKalZuk'
| 'tzTokJad'
| 'venenatis'
| 'vetion'
| 'vorkath'
| 'wintertodt'
| 'zalcano'
| 'zulrah';
export type Bosses = { [Type in Boss]: Activity };
export type ActivityName =
| 'hunterbh'
| 'roguebh'
| 'lms'
| 'allclues'
| 'beginnerclues'
| 'easyclues'
| 'mediumclues'
| 'hardclues'
| 'eliteclues'
| 'masterclues';
| 'leaguePoints'
| 'hunterBH'
| 'rogueBH'
| 'lastManStanding'
| 'soulWarsZeal'
| 'riftsClosed'
| 'allClues'
| 'beginnerClues'
| 'easyClues'
| 'mediumClues'
| 'hardClues'
| 'eliteClues'
| 'masterClues'
| Boss;
export interface Stats {
skills: Skills;
clues: Clues;
bh: BH;
lms: Activity;
leaguePoints: Activity;
bountyHunter: BH;
lastManStanding: Activity;
soulWarsZeal: Activity;
riftsClosed: Activity;
bosses: Bosses;
}
export type Modes = { [M in Gamemode]?: Stats };
export interface Player extends Modes {
rsn: string;
name: string;
mode: Gamemode;
dead: boolean;
deulted: boolean;
@@ -86,11 +150,11 @@ export interface Player extends Modes {
}
export interface PlayerSkillRow extends Skill {
rsn: string;
name: string;
dead: boolean;
}
export interface PlayerActivityRow extends Activity {
rsn: string;
name: string;
dead: boolean;
}

View File

@@ -1,16 +1,28 @@
import { SkillName, ClueType, BHType, Gamemode, Mode } from '../types';
import {
BHType,
Boss,
ClueType,
Gamemode,
SkillName,
ActivityName
} from '../types';
export const BASE_URL = 'http://services.runescape.com/m=hiscore_oldschool';
export const BASE_URL = 'https://secure.runescape.com/m=hiscore_oldschool';
export const STATS_URL = 'index_lite.ws?player=';
export const SCORES_URL = 'overall.ws?';
export const GAMEMODE_URL = {
dmm: '_deadman/',
dmmt: '_tournament/',
hc: '_hardcore_ironman/',
iron: '_ironman/',
main: '/',
sdmm: '_seasonal/',
ult: '_ultimate/',
export type GamemodeUrl = {
[key in Gamemode]: string;
};
export const GAMEMODE_URL: GamemodeUrl = {
main: `${BASE_URL}/`,
ironman: `${BASE_URL}_ironman/`,
hardcore: `${BASE_URL}_hardcore_ironman/`,
ultimate: `${BASE_URL}_ultimate/`,
deadman: `${BASE_URL}_deadman/`,
seasonal: `${BASE_URL}_seasonal/`,
tournament: `${BASE_URL}_tournament/`
};
export const SKILLS: SkillName[] = [
'overall',
@@ -36,7 +48,7 @@ export const SKILLS: SkillName[] = [
'farming',
'runecraft',
'hunter',
'construction',
'construction'
];
export const CLUES: ClueType[] = [
'all',
@@ -45,28 +57,202 @@ export const CLUES: ClueType[] = [
'medium',
'hard',
'elite',
'master',
];
export const BH_MODES: BHType[] = ['rogue', 'hunter'];
export const ACTIVITIES = [
'hunterbh',
'roguebh',
'lms',
'allclues',
'beginnerclues',
'easyclues',
'mediumclues',
'hardclues',
'eliteclues',
'masterclues',
'master'
];
export const BH_MODES: BHType[] = ['hunter', 'rogue'];
export const GAMEMODES: Gamemode[] = [
'main',
'iron',
'hc',
'ult',
'dmm',
'sdmm',
'dmmt',
'ironman',
'hardcore',
'ultimate',
'deadman',
'seasonal',
'tournament'
];
export const MODES: Mode[] = [...GAMEMODES, 'full'];
export const BOSSES: Boss[] = [
'abyssalSire',
'alchemicalHydra',
'barrows',
'bryophyta',
'callisto',
'cerberus',
'chambersOfXeric',
'chambersOfXericChallengeMode',
'chaosElemental',
'chaosFanatic',
'commanderZilyana',
'corporealBeast',
'crazyArchaeologist',
'dagannothPrime',
'dagannothRex',
'dagannothSupreme',
'derangedArchaeologist',
'generalGraardor',
'giantMole',
'grotesqueGuardians',
'hespori',
'kalphiteQueen',
'kingBlackDragon',
'kraken',
'kreeArra',
'krilTsutsaroth',
'mimic',
'nex',
'nightmare',
'phosanisNightmare',
'obor',
'sarachnis',
'scorpia',
'skotizo',
'tempoross',
'gauntlet',
'corruptedGauntlet',
'theatreOfBlood',
'theatreOfBloodHardMode',
'thermonuclearSmokeDevil',
'tzKalZuk',
'tzTokJad',
'venenatis',
'vetion',
'vorkath',
'wintertodt',
'zalcano',
'zulrah'
];
export const ACTIVITIES: ActivityName[] = [
'leaguePoints',
'hunterBH',
'rogueBH',
'allClues',
'beginnerClues',
'easyClues',
'mediumClues',
'hardClues',
'eliteClues',
'masterClues',
'lastManStanding',
'soulWarsZeal',
'riftsClosed',
...BOSSES
];
export type FormattedBossNames = {
[key in Boss]: string;
};
export const FORMATTED_BOSS_NAMES: FormattedBossNames = {
abyssalSire: 'Abyssal Sire',
alchemicalHydra: 'Alchemical Hydra',
barrows: 'Barrows Chests',
bryophyta: 'Bryophyta',
callisto: 'Callisto',
cerberus: 'Cerberus',
chambersOfXeric: 'Chambers of Xeric',
chambersOfXericChallengeMode: 'Chambers of Xeric: Challenge Mode',
chaosElemental: 'Chaos Elemental',
chaosFanatic: 'Chaos Fanatic',
commanderZilyana: 'Commander Zilyana',
corporealBeast: 'Corporeal Beast',
crazyArchaeologist: 'Crazy Archaeologist',
dagannothPrime: 'Dagannoth Prime',
dagannothRex: 'Dagannoth Rex',
dagannothSupreme: 'Dagannoth Supreme',
derangedArchaeologist: 'Deranged Archaeologist',
generalGraardor: 'General Graardor',
giantMole: 'Giant Mole',
grotesqueGuardians: 'Grotesque Guardians',
hespori: 'Hespori',
kalphiteQueen: 'Kalphite Queen',
kingBlackDragon: 'King Black Dragon',
kraken: 'Kraken',
kreeArra: "Kree'Arra",
krilTsutsaroth: "K'ril Tsutsaroth",
mimic: 'Mimic',
nex: 'Nex',
nightmare: 'The Nightmare of Ashihama',
phosanisNightmare: "Phosani's Nightmare",
obor: 'Obor',
sarachnis: 'Sarachnis',
scorpia: 'Scorpia',
skotizo: 'Skotizo',
tempoross: 'Tempoross',
gauntlet: 'The Gauntlet',
corruptedGauntlet: 'The Corrupted Gauntlet',
theatreOfBlood: 'Theatre of Blood',
theatreOfBloodHardMode: 'Theatre of Blood: Hard Mode',
thermonuclearSmokeDevil: 'Thermonuclear Smoke Devil',
tzKalZuk: 'TzKal-Zuk',
tzTokJad: 'TzTok-Jad',
venenatis: 'Venenatis',
vetion: "Vet'ion",
vorkath: 'Vorkath',
wintertodt: 'Wintertodt',
zalcano: 'Zalcano',
zulrah: 'Zulrah'
};
export type FormattedSkillNames = {
[key in SkillName]: string;
};
export const FORMATTED_SKILL_NAMES: FormattedSkillNames = {
overall: 'Overall',
attack: 'Attack',
defence: 'Defence',
strength: 'Strength',
hitpoints: 'Hitpoints',
ranged: 'Ranged',
prayer: 'Prayer',
magic: 'Magic',
cooking: 'Cooking',
woodcutting: 'Woodcutting',
fletching: 'Fletching',
fishing: 'Fishing',
firemaking: 'Firemaking',
crafting: 'Crafting',
smithing: 'Smithing',
mining: 'Mining',
herblore: 'Herblore',
agility: 'Agility',
thieving: 'Thieving',
slayer: 'Slayer',
farming: 'Farming',
runecraft: 'Runecraft',
hunter: 'Hunter',
construction: 'Construction'
};
export type FormattedClueNames = {
[key in ClueType]: string;
};
export const FORMATTED_CLUE_NAMES: FormattedClueNames = {
all: 'Clue Scrolls (all)',
beginner: 'Clue Scrolls (beginner)',
easy: 'Clue Scrolls (easy)',
medium: 'Clue Scrolls (medium)',
hard: 'Clue Scrolls (hard)',
elite: 'Clue Scrolls (elite)',
master: 'Clue Scrolls (master)'
};
export type FormattedBHNames = {
[key in BHType]: string;
};
export const FORMATTED_BH_NAMES: FormattedBHNames = {
rogue: 'Bounty Hunter - Rogue',
hunter: 'Bounty Hunter - Hunter'
};
export const FORMATTED_LMS = 'Last Man Standing';
export const FORMATTED_SOUL_WARS = 'Soul Wars Zeal';
export const FORMATTED_LEAGUE_POINTS = 'League Points';
export const FORMATTED_RIFTS_CLOSED = 'Rifts Closed';
/**
* Count of activities not including bosses, bounty hunter, or clues.
*/
export const EXTRA_ACTIVITY_COUNT = 4;
export const INVALID_FORMAT_ERROR = 'Invalid hiscores format';

View File

@@ -1,48 +1,105 @@
import axios from 'axios';
import * as ua from 'useragent-generator';
import { Gamemode, SkillName, ActivityName } from '../types';
import {
BASE_URL,
GAMEMODE_URL,
STATS_URL,
SCORES_URL,
SKILLS,
ACTIVITIES,
ACTIVITIES
} from './constants';
/**
* Will generate a stats URL for the official OSRS API.
*
* @param gamemode Gamemode to fetch ranks for.
* @param rsn Username of the player.
* @returns Encoded stats URL.
*/
export const getStatsURL = (gamemode: Gamemode, rsn: string) =>
`${BASE_URL}${GAMEMODE_URL[gamemode]}${STATS_URL}${encodeURIComponent(rsn)}`;
`${GAMEMODE_URL[gamemode]}${STATS_URL}${encodeURIComponent(rsn)}`;
/**
* Will generate a player table URL for the official OSRS hiscores website.
*
* @param gamemode Gamemode to fetch ranks for.
* @param rsn Username of the player.
* @returns Encoded player table URL.
*/
export const getPlayerTableURL = (gamemode: Gamemode, rsn: string) =>
`${BASE_URL}${
GAMEMODE_URL[gamemode]
}${SCORES_URL}table=0&user=${encodeURIComponent(rsn)}`;
`${GAMEMODE_URL[gamemode]}${SCORES_URL}table=0&user=${encodeURIComponent(
rsn
)}`;
/**
* Will generate a skill table URL for the official OSRS hiscores website.
*
* @param gamemode Gamemode to fetch ranks for.
* @param skill Skill to fetch ranks for.
* @param page Page number.
* @returns
*/
export const getSkillPageURL = (
gamemode: Gamemode,
skill: SkillName,
page: number
) =>
`${BASE_URL}${GAMEMODE_URL[gamemode]}${SCORES_URL}table=${SKILLS.indexOf(
`${GAMEMODE_URL[gamemode]}${SCORES_URL}table=${SKILLS.indexOf(
skill
)}&page=${page}`;
/**
* Will generate an activity table URL for the official OSRS hiscores website.
*
* @param gamemode Gamemode to fetch ranks for.
* @param activity Activity or boss to fetch ranks for.
* @param page Page number.
* @returns
*/
export const getActivityPageURL = (
gamemode: Gamemode,
activity: ActivityName,
page: number
) =>
`${BASE_URL}${
`${
GAMEMODE_URL[gamemode]
}${SCORES_URL}category_type=1&table=${ACTIVITIES.indexOf(
activity
)}&page=${page}`;
export const numberFromElement = (el: CheerioElement) => {
const innerText = el.firstChild.data;
const number = innerText ? innerText.replace(/[\n|,]/g, '') : '-1';
/**
* Extracts a number from an OSRS hiscores table cell element.
*
* @param el OSRS hiscores table cell element.
* @returns Number parsed from cell text.
*/
export const numberFromElement = (el: Element | null) => {
const { innerHTML } = el ?? {};
const number = innerHTML?.replace(/[\n|,]/g, '') ?? '-1';
return parseInt(number, 10);
};
export const rsnFromElement = (el: CheerioElement) => {
const innerText = el.firstChild.data;
return innerText ? innerText.replace(/\uFFFD/g, ' ') : '';
/**
* Extracts a RSN from an OSRS hiscores table cell element.
*
* @param el OSRS hiscores table cell element.
* @returns RSN parsed from cell text.
*/
export const rsnFromElement = (el: Element | null) => {
const { innerHTML } = el ?? {};
return innerHTML?.replace(/\uFFFD/g, ' ') ?? '';
};
/**
* Will run an Axios `GET` request against a given URL after injecting a `User-Agent` header.
*
* @param url URL to run a `GET` request against.
* @returns Axios response.
*/
export const httpGet = (url: string) =>
axios.get(url, {
headers: {
// without User-Agent header requests may be rejected by DDoS protection mechanism
'User-Agent': ua.firefox(80)
}
});

11
tsconfig.eslint.json Normal file
View File

@@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"declaration": true,
"outDir": "./lib",
"strict": true
},
"include": ["src", "**/__tests__/*"],
"exclude": ["node_modules"]
}

View File

@@ -4,7 +4,12 @@
"module": "commonjs",
"declaration": true,
"outDir": "./lib",
"strict": true
"strict": true,
"lib": ["ES2015", "DOM", "DOM.Iterable"],
"typeRoots": [
"./node_modules/@types",
"./src/@types"
]
},
"include": ["src"],
"exclude": ["node_modules", "**/__tests__/*"]

View File

@@ -1,20 +0,0 @@
{
"extends": ["tslint-config-airbnb", "tslint-config-prettier"],
"rules": {
"import-name": false,
"indent": [true, "spaces", 2],
"max-line-length": [true, 120],
"ter-arrow-parens": [false],
"strict-boolean-expressions": [false],
"variable-name": [false],
"semicolon": [true, "always", "ignore-bound-class-methods"],
"prefer-array-literal": [false],
"quotemark": [
true,
"single",
"jsx-double",
"avoid-escape",
"avoid-template"
]
}
}

6143
yarn.lock

File diff suppressed because it is too large Load Diff