CF-Predictor

This extension predicts rating changes for Codeforces. It shows approximate deltas during and after the contest.

目前为 2018-04-10 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name CF-Predictor
  3. // @version 1.2.2
  4. // @description This extension predicts rating changes for Codeforces. It shows approximate deltas during and after the contest.
  5. // @author Originally by WslF, Edited by ZZYSonny
  6. // @match http://codeforces.com/contest/*/standings*
  7. // @connect cf-predictor-frontend.herokuapp.com
  8. // @grant GM_xmlhttpRequest
  9. // @namespace https://greasyfork.org/users/169007
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. var partyNum = 0;
  15. var results = [];
  16. showDeltas();
  17.  
  18. function modifyPartyHtml(index, elem) {
  19. var delta = '?';
  20. var rank = ' ';
  21. var seed = ' ';
  22.  
  23. if (partyNum > 0) {
  24. var handle = $(elem).find("td:eq(1)").find("a").last().html();
  25. if (handle) {
  26. //next 2 lines - fix for legendary grandmaster
  27. handle = handle.replace('<span class="legendary-user-first-letter">','');
  28. handle = handle.replace('</span>','');
  29. if (handle in results) {
  30. delta = results[handle].delta;
  31. rank = results[handle].rank;
  32. seed = results[handle].seed;
  33. }
  34. }
  35. }
  36.  
  37. var darkClass = "";
  38. if (partyNum % 2 == 1) {
  39. darkClass = "dark ";
  40. }
  41. var text;
  42. if (partyNum == 0) {
  43. text = "<th class='top right' style='width: 4em;'><span title='Rating change''>&Delta;</span></th>";
  44. } else {
  45. if (delta > 0) {
  46. text = "<td class='" + darkClass + "right'><span style='color:green;font-weight:bold;'>+" + delta + "</span></td>";
  47. } else {
  48. text = "<td class='" + darkClass + "right'><span style='color:gray;font-weight:bold;'>" + delta + "</span></td>";
  49. }
  50. }
  51.  
  52. partyNum++;
  53. $(elem).append(text);
  54. /*
  55. text = "<td class='" + darkClass + "right'><span style='color:green;'>" + rank + "</span></td>";
  56. $(elem).append(text);
  57. text = "<td class='" + darkClass + "right'><span style='color:green;'>" + seed + "</span></td>";
  58. $(elem).append(text);
  59. */
  60. }
  61.  
  62. function showDeltas() {
  63. var count = $(".standings").find("tr").length;
  64. if (count > 2) {
  65. var contestId = document.location.href.replace(/\D+/ig, ',').substr(1).split(',')[0];
  66. getDeltas(contestId, function() {
  67. $(".standings").find("tr").first().find("th").last().removeClass("right");
  68. $(".standings").find("tr").find("td").removeClass("right");
  69. $(".standings").find("tr").each(modifyPartyHtml);
  70. if (count % 2 == 0) {
  71. $(".standings").find("tr").last().find("td").last().replaceWith("<td class='smaller bottom right dark'>&Delta;</td>");
  72. } else {
  73. $(".standings").find("tr").last().find("td").last().replaceWith("<td class='smaller bottom right'>&Delta;</td>");
  74. }
  75. });
  76. }
  77. }
  78.  
  79. function getDeltas(contestId, callback) {
  80. //var localServer = "http://localhost:8084/CF-PredictorFrontEnd/"
  81. var herokuServer = "https://cf-predictor-frontend.herokuapp.com/";
  82. var page = "GetNextRatingServlet?contestId=" + contestId;
  83.  
  84. var server = herokuServer + page;
  85. GM_xmlhttpRequest({
  86. method: "GET",
  87. url: server,
  88. onload: function(res) {
  89. var text = res.responseText;
  90. var data = JSON.parse(text);
  91. for (var i = 0; i < data.result.length; i++) {
  92. var handle = data.result[i].handle;
  93. var delta = data.result[i].newRating - data.result[i].oldRating;
  94. var rank = data.result[i].rank;
  95. var seed = data.result[i].seed;
  96. var ret = {
  97. delta : delta,
  98. seed : seed,
  99. rank : rank
  100. };
  101. results[handle] = ret;
  102. }
  103. callback();
  104. }
  105. });
  106. }
  107. })();