atcoder friend problemset

Show friend's accepted submissions.

  1. // ==UserScript==
  2. // @name atcoder friend problemset
  3. // @namespace https://atcoder.jp
  4. // @version 0.1
  5. // @description Show friend's accepted submissions.
  6. // @author Enucai
  7. // @match https://atcoder.jp/*
  8. // @connect kenkoooo.com
  9. // @connect atcoder.jp
  10. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  11. // @grant GM_xmlhttpRequest
  12. // @license MIT
  13. // ==/UserScript==
  14.  
  15. let user_list = localStorage.fav;
  16.  
  17. let mp = {};
  18.  
  19. async function getrate(uid) {
  20. if (mp[uid] != undefined) return mp[uid];
  21. let tmp = await fetch("https://atcoder.jp/users/" + uid);
  22. let lim = 0;
  23. while (tmp.status != 200 && lim <= 5) {
  24. tmp = await fetch("https://atcoder.jp/users/" + uid);
  25. lim += 1;
  26. }
  27. let content = await tmp.text();
  28. let pos = content.indexOf('<tr><th class="no-break">Rating</th><td><span');
  29. let rating = "", f = 0;
  30. let len = content.length;
  31. for (let i = pos; i < len; ++i) {
  32. if (f) {
  33. if (content[i] >= '0' && content[i] <= '9') rating = rating + content[i];
  34. else break;
  35. } else {
  36. if (content[i] >= '0' && content[i] <= '9') {
  37. rating = rating + content[i];
  38. f = 1;
  39. }
  40. }
  41. }
  42. // console.log("getting", uid);
  43. mp[uid] = parseInt(rating);
  44. return parseInt(rating);
  45. }
  46.  
  47. async function GetColorByUser(uid) {
  48. // let x = Math.floor(Math.random() * 8);
  49. // if (x == 0) return "user-gray";
  50. // if (x == 1) return "user-brown";
  51. // if (x == 2) return "user-green";
  52. // if (x == 3) return "user-cyan";
  53. // if (x == 4) return "user-blue";
  54. // if (x == 5) return "user-yellow";
  55. // if (x == 6) return "user-orange";
  56. // if (x == 7) return "user-red";
  57. let rating = await getrate(uid);
  58. if ( rating < 400 ) return 'user-gray';
  59. if ( 400 <= rating && rating < 800 ) return 'user-brown';
  60. if ( 800 <= rating && rating < 1200 ) return 'user-green';
  61. if ( 1200 <= rating && rating < 1600 ) return 'user-cyan';
  62. if ( 1600 <= rating && rating < 2000 ) return 'user-blue';
  63. if ( 2000 <= rating && rating < 2400 ) return 'user-yellow';
  64. if ( 2400 <= rating && rating < 2800 ) return 'user-orange';
  65. if ( 2800 <= rating ) return 'user-red';
  66. }
  67.  
  68. var solved_list = new Array();
  69. var bef;
  70.  
  71. let res_str;
  72. let call = 0, rest;
  73.  
  74. async function upd(type) {
  75. let str = "";
  76. let str2 = "";
  77. str += "<span style = \"font-size: 16px; color: grey;\">Solved by ";
  78. console.log(solved_list, solved_list.length);
  79. str2 += " friend";
  80. if (solved_list.length == 0) {
  81. if (type == 1) str2 += " (finished)";
  82. } else {
  83. str2 += "s";
  84. if (type == 1) str2 += " (finished)";
  85. str2 += ": ";
  86. for (let i = 0; i < solved_list.length; ++i) {
  87. str2 += "<span class="
  88. str2 += "\"";
  89. str2 += (await GetColorByUser(solved_list[i]));
  90. str2 += "\"";
  91. str2 += ">";
  92. str2 += solved_list[i];
  93. str2 += "</span>";
  94. if (i != solved_list.length - 1) str2 += ", ";
  95. }
  96. }
  97. str = str + solved_list.length + str2 + ".</span>";
  98. document.querySelector(`#main-div > div.container > div.row > div:nth-child\(2\) > span`).innerHTML = bef + str;
  99. }
  100.  
  101. async function check(uid, pid, bt) {
  102. console.log(uid);
  103. GM_xmlhttpRequest({
  104. method: 'GET',
  105. url: 'https://kenkoooo.com/atcoder/atcoder-api/v3/user/submissions?user=' + uid + '&from_second=' + bt,
  106. onload: async res => {
  107. const data = JSON.parse(res.responseText);
  108. if (data.length == 0) {
  109. rest -= 1;
  110. console.log(rest);
  111. if (rest == 0) await upd(1);
  112. return;
  113. }
  114. let lstt = 0;
  115. for (let val of data) {
  116. lstt = val.epoch_second;
  117. if (val.problem_id == pid && val.result == 'AC') {
  118. solved_list.push(uid);
  119. await upd(0);
  120. // console.log("ok");
  121. rest -= 1;
  122. console.log(rest);
  123. if (rest == 0) await upd(1);
  124. return;
  125. }
  126. }
  127. await check(uid, pid, lstt + 1);
  128. },
  129. onerror: () => {
  130. return;
  131. }
  132. });
  133. }
  134.  
  135. (async function() {
  136. 'use strict';
  137. user_list = JSON.parse(user_list);
  138. console.log(user_list);
  139. const url = location.href;
  140. let pid = "", cnt = 0;
  141. for (let i = 0; i < url.length; ++i) {
  142. if (url[i] == '/') cnt++;
  143. else if (cnt >= 6) pid += url[i];
  144. }
  145. // console.log(pid);
  146. let problem_info = document.querySelector(`#main-div > div.container > div.row > div:nth-child\(2\) > span`).innerHTML;
  147. bef = document.querySelector(`#main-div > div.container > div.row > div:nth-child\(2\) > span`).innerHTML + "</br>";
  148. res_str = bef;
  149. rest = user_list.length;
  150. // console.log(bef);
  151. for (let i = 0; i < user_list.length; ++i) {
  152. let uid = user_list[i];
  153. await check(uid, pid, 0);
  154. }
  155. })();