Greasy Fork 还支持 简体中文。

CF-Predictor

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

目前為 2021-06-11 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name CF-Predictor
  3. // @version 1.3.0
  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 *://codeforces.com/contest/*/standings*
  7. // @connect cf-predictor-frontend.herokuapp.com
  8. // @connect cf-predictor.herokuapp.com
  9. // @grant GM_xmlhttpRequest
  10. // @namespace https://greasyfork.org/users/169007
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15. var partyNum = 0;
  16. var results = [];
  17. showDeltas();
  18.  
  19. function modifyPartyHtml(index, elem) {
  20. var delta = '?';
  21. var rank = ' ';
  22. var seed = ' ';
  23.  
  24. if (partyNum > 0) {
  25. var handle = $(elem).find("td:eq(1)").find("a").last().html();
  26. if (handle) {
  27. //next 2 lines - fix for legendary grandmaster
  28. handle = handle.replace('<span class="legendary-user-first-letter">','');
  29. handle = handle.replace('</span>','');
  30. if (handle in results) {
  31. delta = results[handle].delta;
  32. rank = results[handle].rank;
  33. seed = results[handle].seed;
  34. }
  35. }
  36. }
  37.  
  38. var darkClass = "";
  39. if (partyNum % 2 == 1) {
  40. darkClass = "dark ";
  41. }
  42. var text;
  43. if (partyNum == 0) {
  44. text = "<th class='top right' style='width: 4em;'><span title='Rating change''>&Delta;</span></th>";
  45. } else {
  46. if (delta > 0) {
  47. text = "<td class='" + darkClass + "right'><span style='color:green;font-weight:bold;'>+" + delta + "</span></td>";
  48. } else {
  49. text = "<td class='" + darkClass + "right'><span style='color:gray;font-weight:bold;'>" + delta + "</span></td>";
  50. }
  51. }
  52.  
  53. partyNum++;
  54. $(elem).append(text);
  55. /*
  56. text = "<td class='" + darkClass + "right'><span style='color:green;'>" + rank + "</span></td>";
  57. $(elem).append(text);
  58. text = "<td class='" + darkClass + "right'><span style='color:green;'>" + seed + "</span></td>";
  59. $(elem).append(text);
  60. */
  61. }
  62.  
  63. function showDeltas() {
  64. var count = $(".standings").find("tr").length;
  65. if (count > 2) {
  66. var contestId = document.location.href.replace(/\D+/ig, ',').substr(1).split(',')[0];
  67. var contestants = document.getElementsByClassName("contestant-cell");
  68. var contestantsHandles = Array.from(contestants).map(x => x.innerText.trim());
  69.  
  70. getDeltas(contestId, contestantsHandles, function() {
  71. $(".standings").find("tr").first().find("th").last().removeClass("right");
  72. $(".standings").find("tr").find("td").removeClass("right");
  73. $(".standings").find("tr").each(modifyPartyHtml);
  74. if (count % 2 == 0) {
  75. $(".standings").find("tr").last().find("td").last().replaceWith("<td class='smaller bottom right dark'>&Delta;</td>");
  76. } else {
  77. $(".standings").find("tr").last().find("td").last().replaceWith("<td class='smaller bottom right'>&Delta;</td>");
  78. }
  79. });
  80. }
  81. }
  82.  
  83. function parseDeltas(data, callback) {
  84. for (var i = 0; i < data.result.length; i++) {
  85. var handle = data.result[i].handle;
  86. var delta = data.result[i].newRating - data.result[i].oldRating;
  87. var rank = data.result[i].rank;
  88. var seed = data.result[i].seed;
  89.  
  90. var res = {
  91. delta : parseInt(delta),
  92. seed : parseInt(seed),
  93. rank : parseInt(rank)
  94. };
  95.  
  96. results[handle] = res;
  97. }
  98.  
  99. callback();
  100. }
  101.  
  102. function getDeltas(contestId, contestantsHandles, callback) {
  103. // var localServer = "http://localhost:8080/"
  104. var herokuServerOld = "https://cf-predictor-frontend.herokuapp.com/";
  105. var pageOld = "GetNextRatingServlet?contestId=" + contestId;
  106. var serverOld = herokuServerOld + pageOld;
  107.  
  108. var herokuServerNew = "https://cf-predictor.herokuapp.com/";
  109. var pageNew = "GetPartialRatingChangesServlet?contestId=" + contestId + "&handles="+contestantsHandles.join(",");
  110. var serverNew = herokuServerNew + pageNew;
  111.  
  112. try{
  113. GM_xmlhttpRequest({
  114. method: "GET",
  115. url: serverNew,
  116. onload: function(res) {
  117. var text = res.responseText;
  118. var data = JSON.parse(text);
  119. parseDeltas(data, callback);
  120. }
  121. });
  122. }catch(err){
  123. console.log(err);
  124. try{
  125. GM_xmlhttpRequest({
  126. method: "GET",
  127. url: serverOld,
  128. onload: function(res) {
  129. var text = res.responseText;
  130. var data = JSON.parse(text);
  131. parseDeltas(data, callback);
  132. }
  133. });
  134. }catch(err){
  135. console.log(err);
  136. }
  137. }
  138. }
  139. })();