pp for osu score pages

shows pp data from osustats.ppy.sh on osu score pages.

当前为 2015-08-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name pp for osu score pages
  3. // @namespace http://osustats.ppy.sh
  4. // @description shows pp data from osustats.ppy.sh on osu score pages.
  5. // @include http*://osu.ppy.sh/b/*
  6. // @include http*://osu.ppy.sh/s/*
  7. // @include http*://osu.ppy.sh/p/beatmap?b=*
  8. // @include http*://osu.ppy.sh/p/beatmap?s=*
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @grant GM_deleteValue
  12. // @grant GM_xmlhttpRequest
  13. // @version 6.02
  14. // ==/UserScript==
  15. if (!this.GM_getValue() || (this.GM_getValue.toString() && this.GM_getValue.toString().indexOf("not supported") > -1)) {
  16. this.GM_getValue = function(key, def) {
  17. return localStorage[key] || def;
  18. };
  19. this.GM_setValue = function(key, value) {
  20. return localStorage[key] = value;
  21. };
  22. this.GM_deleteValue = function(key) {
  23. return delete localStorage[key];
  24. };
  25. }
  26.  
  27.  
  28. var result = null,
  29. mapID = null,
  30. mapsetID = null,
  31. mapMode = null,
  32. scoresMissing = false,
  33. time = 10,
  34. interval,
  35. requestedUpdate = false,
  36. updateInProgress = true,
  37. isNoModOnly = false,
  38. InfoBoxRef = null,
  39. scoresTableRef = null,
  40. scoresTableBodyRef = null,
  41. DlButtonRef = null,
  42. DlLink = null,
  43. row = null;
  44. var DlButtonImage = "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/GMzLdsAAEC2aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTAxLTI4VDE5OjIxOjQ5KzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNS0wMS0yOFQxOToyNjo0NyswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDEtMjhUMTk6MjY6NDcrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjU3NDM2ZjVkLTEzMWUtNTg0Ny05NDJhLTRmMzY5ZGJjMWZmYjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpkZjE2NTc0ZC1kNjEzLTk5NGQtOTdhYS0yNjEzNWU5YjRmZmM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDpkZjE2NTc0ZC1kNjEzLTk5NGQtOTdhYS0yNjEzNWU5YjRmZmM8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6ZGYxNjU3NGQtZDYxMy05OTRkLTk3YWEtMjYxMzVlOWI0ZmZjPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTAxLTI4VDE5OjIxOjQ5KzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3ZjA1MzI3Yy1jZDM5LTEzNGQtOTkwMC00OWRhOTY2NjVlYzM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMDEtMjhUMTk6MjY6NDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjU3NDM2ZjVkLTEzMWUtNTg0Ny05NDJhLTRmMzY5ZGJjMWZmYjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0wMS0yOFQxOToyNjo0NyswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjdmMDUzMjdjLWNkMzktMTM0ZC05OTAwLTQ5ZGE5NjY2NWVjMzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpkZjE2NTc0ZC1kNjEzLTk5NGQtOTdhYS0yNjEzNWU5YjRmZmM8L3N0UmVmOmRvY3VtZW50SUQ+CiAgICAgICAgICAgIDxzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDpkZjE2NTc0ZC1kNjEzLTk5NGQtOTdhYS0yNjEzNWU5YjRmZmM8L3N0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPgogICAgICAgICAgICA8cmRmOkJhZz4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxwaG90b3Nob3A6TGF5ZXJOYW1lPm1pcnJvciFkbDwvcGhvdG9zaG9wOkxheWVyTmFtZT4KICAgICAgICAgICAgICAgICAgPHBob3Rvc2hvcDpMYXllclRleHQ+bWlycm9yIWRsPC9waG90b3Nob3A6TGF5ZXJUZXh0PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgICA8L3Bob3Rvc2hvcDpUZXh0TGF5ZXJzPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOklDQ1Byb2ZpbGU+c1JHQiBJRUM2MTk2Ni0yLjE8L3Bob3Rvc2hvcDpJQ0NQcm9maWxlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4zMTwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMzk8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PptagiIAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAE+VJREFUeNrsnHuUVfV1xz/7d+48mIHhMQyMwIwIEgQDigSfgxpfUamJupIYTROTJs3KayVN62qTLBOXtkmbpGk12rjaPLpqGzUlCVFMNCwfoOADQYkgT0UEBoZhBub9vOe3+8fvd84998Uc4lrNH+1h3TXn3nvO2b/Hfnz3d++LqCqA8r9/iOGPePxRhWfGumAktEz52mP0j9jSuyPiPxdQBUlcJv4z/6HefcPJzbzCGO7/0NksnlFHbUWQLzfSFktOiBZ8V3Ced//JKNzL+4/zw/V7eWJnO209Q6D5kxMFlZzAwocWzFzkD9H2rFUe2nyAHz3/Fhv3dzEc2sRSqxsEkhuQH4y9J1945g9RlP6RLMuaJ3N8YJRth3sZztp46zWehuYJdhecpMIBjIaWrsFRdrX38dDmA/x2extvHxso3nvEnSOIX4pYpOrJC3+9rYevr36d1VsPlRx9wa7mBEn+x6VuHVP41kPdrN56OGdK8bwisxJENDcxcUssiYmqqNOBk3Uyx/tHEaOIv91bbJ75qMK8hvFMr6uKP1DUX+A2fs6UmrGFf+Ox1yk0ZrX55iAFSy3AzEnj+N4HFrNg2oQ8PVDgkrlT+eY1C8YW/u01O/h9a3f8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";
  45.  
  46.  
  47. function Start() {
  48. scoresMissing = false;
  49. if (mapID != null && mapMode != null) {
  50. GetScores(mapID, mapMode, function(res) {
  51. result = JSON.parse(res);
  52. UpdateOsuScoresTable();
  53. if (scoresMissing) {
  54. if (requestedUpdate) {
  55. updateInProgress = false;
  56. SetInfoText("Please refresh page");
  57. if (GM_getValue("Sort_by_pp"))
  58. SortOsuScoresTable(true);
  59. } else {
  60. if (!isNoModOnly) {
  61. RequestBeatmapUpdate(mapID, mapMode, function(accepted) {
  62. if (accepted) {
  63. interval = setInterval(Countdown, 1000);
  64. }
  65. });
  66. }
  67. }
  68. } else {
  69. updateInProgress = false;
  70. if (requestedUpdate) {
  71. updateInProgress = false;
  72. SetInfoText("Updated successfully");
  73.  
  74. if (GM_getValue("Sort_by_pp"))
  75. SortOsuScoresTable(true);
  76. }
  77. if (GM_getValue("Sort_by_pp"))
  78. SortOsuScoresTable(true);
  79. }
  80. });
  81.  
  82.  
  83. }
  84. }
  85.  
  86. function Init() {
  87. InfoBoxRef = document.getElementsByClassName("content-with-bg")[0].getElementsByTagName("h2")[document.getElementsByClassName("content-with-bg")[0].getElementsByTagName("h2").length - 1];
  88. DlButtonRef = document.getElementsByClassName("paddingboth")[0];
  89. if (InfoBoxRef != null) {
  90. mapID = InfoBoxRef.nextElementSibling.children[0].children[0].value;
  91. tempVal = DlButtonRef.children[0].children[0].href.split("/");
  92. mapsetID = tempVal[tempVal.length - 1];
  93. mapMode = InfoBoxRef.nextElementSibling.children[0].children[1].value;
  94. if (mapID != null) {
  95. RefreshTableReferences();
  96. isNoModOnly = InfoBoxRef.nextElementSibling.children[0].children[2].checked;
  97. AddppSortCheckbox();
  98. AddTop100Checkbox();
  99. AddMirriorButton();
  100. return true;
  101. }
  102. }
  103. return false;
  104. }
  105.  
  106. function AddMirriorButton() {
  107. GetMirriorDownloadLink(mapID, function(DownloadLink) {
  108. DlLink = DownloadLink
  109. var DlButton = document.createElement('img');
  110. DlButton.style.width = "31px";
  111. DlButton.style.height = "139px";
  112. DlButton.src = "data:image/png;base64," + DlButtonImage;
  113.  
  114. var DlButtonLink = document.createElement('a');
  115. DlButtonLink.addEventListener('click', startDownload, true);
  116.  
  117. DlButtonRef.children[0].appendChild(DlButtonLink);
  118. DlButtonRef.children[0].children[1].appendChild(DlButton);
  119. });
  120. }
  121.  
  122. function startDownload() {
  123. window.location.href = DlLink;
  124. }
  125.  
  126. function RefreshTableReferences() {
  127. scoresTableRef = document.getElementsByClassName("beatmapListing")[0].children[0];
  128. scoresTableBodyRef = scoresTableRef.getElementsByTagName('tbody')[0];
  129. }
  130.  
  131. function numberWithCommas(x) {
  132. return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  133. }
  134.  
  135. function UpdateRowData(cellNumber) {
  136. row = scoresTableBodyRef.children[cellNumber];
  137.  
  138. row.cells[0].innerHTML = "#" + cellNumber;
  139.  
  140. idx = cellNumber - 1;
  141. row.cells[1].innerHTML = "<img src=\"/images/" + result[idx].rank + "_small.png\">";
  142. row.cells[2].innerHTML = numberWithCommas(result[idx].score);
  143. row.cells[3].innerHTML = result[idx].combo;
  144. row.cells[4].innerHTML = result[idx].acc.toFixed(2) + "%";
  145. var flag = "<img class=\"flag\" src=\"//s.ppy.sh/images/flags/";
  146. if (result[idx].hasOwnProperty("f"))
  147. flag += result[idx].f;
  148. else
  149. flag += "a1";
  150. flag += ".gif\">";
  151.  
  152. row.cells[5].innerHTML = flag + "<a href=\"/u/" + result[idx].Id + "\">" + result[idx].name + "</a>";
  153. row.cells[6].innerHTML = result[idx].combo;
  154. row.cells[7].innerHTML = result[idx].c3 + " / " + result[idx].c1 + " / " + result[idx].c5;
  155. row.cells[8].innerHTML = result[idx].cG;
  156. row.cells[9].innerHTML = result[idx].cK;
  157. row.cells[10].innerHTML = result[idx].miss;
  158. row.cells[11].innerHTML = result[idx].hasOwnProperty("mods") ? result[idx].mods : "---";
  159. row.cells[12].innerHTML = "---";
  160.  
  161. return [result[idx].name, result[idx].score];
  162. }
  163.  
  164. function AddRow(rowNum) {
  165. if (row === null) {
  166. row = scoresTableBodyRef.getElementsByTagName('tr')[1].cloneNode(true);
  167. }
  168. row.className = "row" + ((rowNum % 2) + 1) + "p";
  169. scoresTableBodyRef.appendChild(row.cloneNode(true));
  170. }
  171.  
  172. function UpdateOsuScoresTable() {
  173. numOfRows = scoresTableBodyRef.getElementsByTagName("tr").length;
  174.  
  175. if (!requestedUpdate) {
  176. th = document.createElement('th');
  177. th.innerHTML = "pp";
  178. scoresTableBodyRef.children[0].insertBefore(th, scoresTableBodyRef.children[0].childNodes[3]);
  179. for (var i = 1; i < numOfRows; i++)
  180. scoresTableBodyRef.getElementsByTagName("tr")[i].insertCell(3);
  181. if (GM_getValue("Show_top_100") && result.length > 50 && numOfRows==51) {
  182. for (var i = 50; i < result.length; i++) {
  183. AddRow(i);
  184. }
  185. numOfRows = scoresTableBodyRef.getElementsByTagName("tr").length;
  186. }
  187. }
  188. for (var i = 1; i < numOfRows; i++) {
  189. var pp, username, score;
  190. if (i > 50) {
  191. data = UpdateRowData(i);
  192. username = data[0];
  193. score = data[1];
  194. } else {
  195. row = scoresTableBodyRef.children[i];
  196. username = row.children[5].children[1].innerHTML;
  197. score = row.children[2].innerHTML.replace(/,/g, '').replace(/<b>/g, '').replace(/<\/b>/g, '');
  198. }
  199.  
  200. pp = GetPpFromUsername(username, score);
  201. scoresTableBodyRef.getElementsByTagName("tr")[i].children[3].innerHTML = pp;
  202. }
  203. }
  204.  
  205. function GetUserIndex(username) {
  206. for (var i = 0; i < result.length; i++) {
  207. if (username == result[i].name) {
  208. return i;
  209. }
  210. }
  211. return -1;
  212. }
  213.  
  214. function GetPpFromUsername(username, score) {
  215. idx = GetUserIndex(username);
  216. if (idx != -1) {
  217. if (score == result[idx].score) {
  218. return (Math.round(result[idx].pp * 100) / 100);
  219. }
  220. scoresMissing = true;
  221. return "N/U";
  222. }
  223.  
  224. scoresMissing = true;
  225. return "N/D";
  226. }
  227.  
  228. function GetMirriorDownloadLink(mapID, callback) {
  229. GetPage("https://osu.yas-online.net/json.mapdata.php?mapId=" + mapsetID, function(res) {
  230. res = JSON.parse(res);
  231. if (res.result == "success") {
  232. yasID = Object.keys(res.success)[0];
  233. callback("https://osu.yas-online.net" + res.success[yasID].downloadLink)
  234. }
  235.  
  236. });
  237. }
  238.  
  239. function GetScores(mapID, mapMode, callback) {
  240. GetPage("http://osustats.ppy.sh/api/beatmap/getScores/" + mapID + "/" + mapMode + "?nick=" + getCookie("last_login"), function(res) {
  241. callback(res);
  242. });
  243.  
  244. }
  245.  
  246. function RequestBeatmapUpdate(mapID, mapMode, callback) {
  247. GetPage("http://osustats.ppy.sh/api/beatmap/updateRequest/" + mapID + "/" + mapMode + "?nick=" + getCookie("last_login"), function(res) {
  248. requestedUpdate = true;
  249. res = JSON.parse(res);
  250.  
  251. if (res.status == "OK") {
  252. callback(true);
  253. } else {
  254. callback(false);
  255. SetInfoText("Request failed- try again later.");
  256. }
  257. });
  258. }
  259.  
  260. function GetPage(url, callback) {
  261. GM_xmlhttpRequest({
  262. method: "GET",
  263. url: url,
  264. synchronous: true,
  265. timeout: 4000,
  266. headers: {
  267. Referer: location.href
  268. },
  269. onload: function(resp) {
  270. callback(resp.responseText);
  271. },
  272. ontimeout: function() {
  273. callback(null);
  274. }
  275. });
  276. }
  277.  
  278. function Countdown() {
  279. time--;
  280. SetInfoText("Missing scores detected- Update requested</br>Updating in " + time + " seconds");
  281.  
  282. if (time == 0) {
  283. clearInterval(interval);
  284. SetInfoText("Updating...");
  285. Start();
  286. }
  287. }
  288.  
  289. function SetInfoText(text) {
  290. InfoBoxRef.innerHTML = "<div style=\"font: 30px; text-align: center;\">" + text + "</div>"
  291. }
  292.  
  293. function AddppSortCheckbox() {
  294.  
  295. var checkbox = document.createElement('input');
  296. checkbox.type = "checkbox";
  297. checkbox.name = "name";
  298. checkbox.value = "value";
  299. checkbox.id = "id";
  300. checkbox.onchange = function x() {
  301. GM_setValue("Sort_by_pp", InfoBoxRef.nextElementSibling.children[0].children[4].checked);
  302. SortOsuScoresTable(GM_getValue("Sort_by_pp"));
  303. };
  304.  
  305. if (GM_getValue("Sort_by_pp"))
  306. checkbox.checked = GM_getValue("Sort_by_pp");
  307.  
  308. var label = document.createElement('label')
  309. label.htmlFor = "id";
  310. label.appendChild(document.createTextNode('Sort score table by pp'));
  311.  
  312. InfoBoxRef.nextElementSibling.children[0].appendChild(checkbox);
  313. InfoBoxRef.nextElementSibling.children[0].appendChild(label);
  314. }
  315.  
  316. function AddTop100Checkbox() {
  317.  
  318. var checkbox = document.createElement('input');
  319. checkbox.type = "checkbox";
  320. checkbox.name = "t100";
  321. checkbox.value = "";
  322. checkbox.id = "t100i";
  323. checkbox.onchange = function y() {
  324. GM_setValue("Show_top_100", InfoBoxRef.nextElementSibling.children[0].children[6].checked);
  325. location.reload();
  326. };
  327.  
  328. if (GM_getValue("Show_top_100", true))
  329. checkbox.checked = GM_getValue("Show_top_100");
  330.  
  331. var label = document.createElement('label')
  332. label.htmlFor = "t100i";
  333. label.appendChild(document.createTextNode('show top 100'));
  334.  
  335. InfoBoxRef.nextElementSibling.children[0].appendChild(checkbox);
  336. InfoBoxRef.nextElementSibling.children[0].appendChild(label);
  337. }
  338.  
  339. function SortOsuScoresTable(sortByPp) {
  340. if (updateInProgress) return;
  341. if (sortByPp)
  342. column = 3;
  343. else
  344. column = 2;
  345.  
  346. function isNumeric(num) {
  347. return !isNaN(num)
  348. }
  349.  
  350. function RowCompareNumbers(a, b) {
  351. var aVal = parseInt(a.value);
  352. var bVal = parseInt(b.value);
  353. return (bVal - aVal);
  354. }
  355.  
  356. var rows = scoresTableBodyRef.getElementsByTagName('tr');
  357. var rowArray = new Array();
  358. var tempValue;
  359. for (var i = 1, length = rows.length; i < length; i++) {
  360. rowArray[i] = new Object;
  361. rowArray[i].oldIndex = i;
  362. tempValue = rows[i].getElementsByTagName('td')[column].firstChild.textContent.replace(/\,/g, '');;
  363.  
  364. if (isNumeric(tempValue))
  365. rowArray[i].value = tempValue;
  366. else
  367. rowArray[i].value = "0";
  368. }
  369.  
  370. rowArray.sort(RowCompareNumbers);
  371. var newTbody = document.createElement('tbody');
  372. newTbody.appendChild(rows[0].cloneNode(true));
  373. for (var i = 0, length = rowArray.length - 1; i < length; i++) {
  374. newTbody.appendChild(rows[rowArray[i].oldIndex].cloneNode(true));
  375. }
  376. scoresTableRef.replaceChild(newTbody, scoresTableBodyRef);
  377. RefreshTableReferences();
  378. }
  379.  
  380. function getCookie(cname) {
  381. var name = cname + "=";
  382. var ca = document.cookie.split(';');
  383. for (var i = 0; i < ca.length; i++) {
  384. var c = ca[i];
  385. while (c.charAt(0) == ' ') c = c.substring(1);
  386. if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
  387. }
  388. return "";
  389. }
  390.  
  391. window.addEventListener('load', function() {
  392. if (Init()) {
  393. Start();
  394. }
  395. }, false);