BZOJ Helper

BZOJ助手

当前为 2018-09-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name BZOJ Helper
  3. // @namespace bzoj
  4. // @version 1.1
  5. // @description BZOJ助手
  6. // @author ranwen
  7. // @match https://lydsy.com/*
  8. // @match https://www.lydsy.com/*
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. (function () {
  13. function savedata(name, val) {
  14. localStorage.setItem(name, JSON.stringify(val));
  15. }
  16. function readdata(name) {
  17. return JSON.parse(localStorage.getItem(name))
  18. }
  19. var logined = 0
  20. var username = "";
  21. var mydb = Array();
  22. var markedp = Array();
  23. var fixurl = location.href;
  24. if (fixurl.indexOf("www.lydsy.com") != -1) {
  25. fixurl = fixurl.replace("www.lydsy.com", "lydsy.com");
  26. location.href = fixurl;
  27. }
  28. function getmyusername() {
  29. var sb = document.getElementsByTagName("table")[0].childNodes[1].childNodes[0].childNodes[17].innerText;
  30. if (sb.indexOf("ModifyUser") == -1) {
  31. logined = -1;
  32. return;
  33. }
  34. username = sb.substr(13);
  35. }
  36. function isprob() {
  37. if (fixurl.indexOf("https://lydsy.com/JudgeOnline/problem.php?id=") == -1) {
  38. return -1;
  39. }
  40. return fixurl.substr(45);
  41. }
  42. function isstatus() {
  43. if (fixurl.indexOf("https://lydsy.com/JudgeOnline/status.php") == -1) {
  44. return -1;
  45. }
  46. return 0;
  47. }
  48. function islist() {
  49. if (fixurl.indexOf("https://lydsy.com/JudgeOnline/problemset.php") == -1) {
  50. return -1;
  51. }
  52. return 0;
  53. }
  54. function updateprobinfobypage(pid) {
  55. sb = {};
  56. for (i of document.getElementsByTagName("h2")[0].childNodes)
  57. if (i.nodeName == "#text") {
  58. sb["title"] = i.data.substr(6)
  59. break
  60. }
  61. sb["submit"] = document.getElementsByTagName("center")[2].getElementsByClassName("green")[2].nextSibling.data;
  62. sb["submit"] = sb["submit"].slice(0, -2);
  63. sb["solved"] = document.getElementsByTagName("center")[2].getElementsByClassName("green")[3].nextSibling.data;
  64. sb["source"] = document.getElementsByTagName("h2")[7].nextElementSibling.childNodes[0].innerText;
  65. savedata("problem_" + pid, sb)
  66. }
  67. function updateprobinfobylist() {
  68. for(i of document.getElementById("problemset").getElementsByTagName("tbody")[0].childNodes)
  69. {
  70. sb={}
  71. prob=i.childNodes[1].innerText;
  72. sb["title"]=i.childNodes[2].innerText;
  73. sb["source"]=i.childNodes[3].innerText;
  74. sb["solved"]=i.childNodes[4].innerText;
  75. sb["submit"]=i.childNodes[5].innerText;
  76. savedata("problem_" + prob, sb)
  77. }
  78. }
  79. getmyusername()
  80. markedp = readdata("marked");
  81. if (markedp == null) {
  82. savedata("marked", Array());
  83. markedp = Array();
  84. }
  85. if (logined == -1) {
  86. return;
  87. }
  88. function updateuserdb() {
  89. var nm = fixurl.substr(48);
  90. var list = document.getElementsByTagName("script")[2].innerHTML.match(/p\([1-9][0-9]{3}\)/g);
  91. var rl = Array();
  92. for (var i of list) {
  93. rl.push(i.substr(2, 4))
  94. }
  95. savedata("userlist_" + nm, rl)
  96. }
  97. if (fixurl.indexOf("https://lydsy.com/JudgeOnline/userinfo.php?user=") != -1) {
  98. updateuserdb();
  99. }
  100. mydb = readdata("userlist_" + username);
  101. if (islist() != -1) {
  102. updateprobinfobylist();
  103. for(i of document.getElementById("problemset").getElementsByTagName("tbody")[0].childNodes)
  104. {
  105. prob=i.childNodes[1].innerText;
  106. if(markedp.indexOf(prob)!=-1) i.childNodes[2].innerHTML=i.childNodes[2].innerHTML+"<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 20px;height: 20px;\">\
  107. <polygon points=\"19.510565162951536,6.9098300562505255 12.351141009169893,6.76393202250021 10,0 7.648858990830108,6.76393202250021 0.48943483704846535,6.9098300562505255 6.195773934819385,11.236067977499792 4.122147477075267,18.090169943749473 10,14 15.87785252292473,18.090169943749476 13.804226065180615,11.23606797749979\" style=\"fill:#FFFF00;\"></polygon>\
  108. </svg>";
  109. }
  110. document.getElementById("problemset").getElementsByTagName("thead")[0].childNodes[1].childNodes[0].childNodes[0].innerHTML=document.getElementById("problemset").getElementsByTagName("thead")[0].childNodes[1].childNodes[0].childNodes[0].innerHTML+
  111. "<a href=\"javascript:;\" id=\"showmarkedlist\">Marked Problem</a>";
  112. document.getElementById("showmarkedlist").onclick = function () {
  113. txt=""
  114. for(i=0;i<markedp.length;i++)
  115. {
  116. o=markedp[i]
  117. info=readdata("problem_"+o);
  118. nr=""
  119. nr+="<tr class=\""+((i&1)==0?"evenrow":"oddrow")+"\">";
  120. nr+="<td>";
  121. if(mydb.indexOf(o)!=-1) nr+="<span class=\"yes\">Y</span>";
  122. nr+="</td>";
  123. nr+="<td align=\"center\">";
  124. nr+=o;
  125. nr+="</td>";
  126. nr+="<td align=\"left\">";
  127. nr+="<a href=\"problem.php?id="+o+"\">"+info['title']+"</a>"+"<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 20px;height: 20px;\">\
  128. <polygon points=\"19.510565162951536,6.9098300562505255 12.351141009169893,6.76393202250021 10,0 7.648858990830108,6.76393202250021 0.48943483704846535,6.9098300562505255 6.195773934819385,11.236067977499792 4.122147477075267,18.090169943749473 10,14 15.87785252292473,18.090169943749476 13.804226065180615,11.23606797749979\" style=\"fill:#FFFF00;\"></polygon>\
  129. </svg>";
  130. nr+="</td>"
  131. nr+="<td align=\"center\">";
  132. nr+=info['source']
  133. nr+="</td>";
  134. nr+="<td align=\"center\">";
  135. nr+="<a href=\"status.php?problem_id="+o+"&amp;jresult=4\">"+info['solved']+"</a>";
  136. nr+="</td>";
  137. nr+="<td align=\"center\">";
  138. nr+="<a href=\"status.php?problem_id="+o+"\">"+info['submit']+"</a>";
  139. nr+="</td>";
  140. nr+="</tr>";
  141. txt+=nr;
  142. }
  143. document.getElementById("problemset").getElementsByTagName("tbody")[0].innerHTML=txt;
  144. }
  145. }
  146. var prob = isprob();
  147. if (prob != -1) {
  148. updateprobinfobypage(prob)
  149. if (mydb.indexOf(prob) != -1) {
  150. var rdt = document.getElementsByTagName("center")[2].getElementsByTagName("h2")[0].innerHTML;
  151. var tdb = "<span style=\"color:#00FF00\">Y</span>" + rdt;
  152. document.getElementsByTagName("center")[2].getElementsByTagName("h2")[0].innerHTML = tdb;
  153. }
  154. var ttt = document.getElementsByTagName("center")[2].innerHTML;
  155. var fff = ttt + "[<a href=\"https://lydsy.com/JudgeOnline/status.php?problem_id=" + prob + "&user_id=" + username + "\">My Status</a>]";
  156. document.getElementsByTagName("center")[2].innerHTML = fff;
  157. var rdt = document.getElementsByTagName("center")[2].getElementsByTagName("h2")[0].innerHTML;
  158. col = "#cccccc"
  159. if (markedp.indexOf(prob) != -1) col = "#FFFF00";
  160. var tdb = rdt +
  161. "<a href=\"javascript:;\" id=\"chmr\"><svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 20px;height: 20px;\">\
  162. <polygon points=\"19.510565162951536,6.9098300562505255 12.351141009169893,6.76393202250021 10,0 7.648858990830108,6.76393202250021 0.48943483704846535,6.9098300562505255 6.195773934819385,11.236067977499792 4.122147477075267,18.090169943749473 10,14 15.87785252292473,18.090169943749476 13.804226065180615,11.23606797749979\" style=\"fill:"+ col + ";\"></polygon>\
  163. </svg></a>";
  164. document.getElementsByTagName("center")[2].getElementsByTagName("h2")[0].innerHTML = tdb;
  165.  
  166. document.getElementById("chmr").onclick = function () {
  167. if (markedp.indexOf(prob) != -1) {
  168. //if (!window.confirm("确定鸽掉它?")) return; //取消标记提示
  169. markedp.splice(markedp.indexOf(prob), 1)
  170. document.getElementsByTagName("center")[2].getElementsByTagName("h2")[0].getElementsByTagName("a")[0].childNodes[0].childNodes[1].style.fill = "#cccccc"
  171. }
  172. else {
  173. markedp.push(prob)
  174. document.getElementsByTagName("center")[2].getElementsByTagName("h2")[0].getElementsByTagName("a")[0].childNodes[0].childNodes[1].style.fill = "#FFFF00"
  175. }
  176. markedp.sort()
  177. savedata("marked", markedp)
  178. }
  179. }
  180. if (isstatus() != -1) {
  181. for (var i of document.getElementsByTagName("center")[0].getElementsByTagName("table")[2].getElementsByTagName("tbody")[0].childNodes) {
  182. if (i.className != "evenrow" && i.className != "oddrow") continue;
  183. prob = i.childNodes[2].childNodes[0].innerText;
  184. mkd = ""
  185. if (markedp.indexOf(prob) != -1)
  186. mkd = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 20px;height: 20px;\">\
  187. <polygon points=\"19.510565162951536,6.9098300562505255 12.351141009169893,6.76393202250021 10,0 7.648858990830108,6.76393202250021 0.48943483704846535,6.9098300562505255 6.195773934819385,11.236067977499792 4.122147477075267,18.090169943749473 10,14 15.87785252292473,18.090169943749476 13.804226065180615,11.23606797749979\" style=\"fill:#FFFF00;\"></polygon>\
  188. </svg>"
  189. if (mydb.indexOf(prob) != -1) {
  190. i.childNodes[2].childNodes[0].innerHTML = "<span style=\"color:#00FF00\">Y</span>" + i.childNodes[2].childNodes[0].innerHTML + mkd;
  191. }
  192. else {
  193. i.childNodes[2].childNodes[0].innerHTML = "<span style=\"color:#FF0000\">N</span>" + i.childNodes[2].childNodes[0].innerHTML + mkd;
  194. }
  195. }
  196. }
  197. document.getElementsByTagName("center")[0].childNodes[1].innerHTML += "<div class=\"tmp\" style=\"height:0px;width:0px;\"><img id=\"autofre\" src=\"data:image/png;base64,\" style=\"width:0px;height:0px;\"/></div>";
  198. setInterval(function () { document.getElementById("autofre").src = "https://lydsy.com/JudgeOnline/" }, 600000);//自动续命
  199. })();