Better atcoder friend problemset

Show friend's accepted submissions.

当前为 2023-09-05 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Better atcoder friend problemset
  3. // @namespace https://atcoder.jp
  4. // @version 0.3
  5. // @description Show friend's accepted submissions.
  6. // @author Ftt2333
  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. var userList
  16. var contestId, problemId
  17.  
  18. let GetColorByRating = (rating) => {
  19. if (rating < 400) return 'user-gray';
  20. if (400 <= rating && rating < 800) return 'user-brown'
  21. if (800 <= rating && rating < 1200) return 'user-green'
  22. if (1200 <= rating && rating < 1600) return 'user-cyan'
  23. if (1600 <= rating && rating < 2000) return 'user-blue'
  24. if (2000 <= rating && rating < 2400) return 'user-yellow'
  25. if (2400 <= rating && rating < 2800) return 'user-orange'
  26. if (2800 <= rating) return 'user-red'
  27. }
  28.  
  29. var availableUsers = [], counter = 0
  30. var result = []
  31.  
  32. let Display = () => {
  33. console.log(availableUsers)
  34. let str1 = "Solved by " + result.length.toString() + " friend" + (result.length > 1 ? "s. " : ". ")
  35. let str2 = ""
  36. for (let i = 0; i < result.length; i++) {
  37. str2 += `<span class = "` + result[i].color + `">` + result[i].userId + "</span>"
  38. if (i + 1 != result.length) str2 += ", "
  39. }
  40. let str = `<br><span style = "font-size: 16px; color: grey;">` + str1 + str2 + "</span>"
  41. let node = document.querySelector(`#main-div > div.container > div.row > div:nth-child\(2\) > span`)
  42. node.innerHTML += str
  43. }
  44.  
  45. let GetUserColor = async (userId) => {
  46. let tmp = {}, cnt = 10
  47. let url = "https://atcoder.jp/users/" + userId
  48. while (cnt >= 0 && tmp.status != 200) tmp = await fetch(url), cnt--
  49. tmp.text().then((data) => {
  50. let tmp = /<tr><th class="no-break">Rating<\/th><td><span class='user-(\w*)'>(\d*)<\/span>/
  51. let arr = tmp.exec(data)
  52. if (arr != null) result.push({userId : userId, color : GetColorByRating(parseInt(arr[2]))})
  53. else result.push({userId : userId, color : "user-unrated"})
  54. counter--
  55. if (counter == 0) Display()
  56. })
  57. }
  58.  
  59. let GetColors = () => {
  60. counter = availableUsers.length
  61. availableUsers.forEach((data) => { GetUserColor(data) })
  62. if (availableUsers.length == 0) Display()
  63. }
  64.  
  65. let CheckIfAvailable = async (userId) => {
  66. let tmp = {}, cnt = 10
  67. let url = "https://atcoder.jp/contests/" + contestId + "/submissions?f.Task=" + problemId + "&f.LanguageName=&f.Status=AC&f.User=" + userId
  68. while (cnt >= 0 && tmp.status != 200) tmp = await fetch(url), cnt--
  69. tmp.text().then((data) => {
  70. let tmp = /<span class='label label-success' data-toggle='tooltip' data-placement='top' title="Accepted">AC<\/span>/
  71. let arr = tmp.exec(data)
  72. if (arr != null) availableUsers.push(userId)
  73. counter--
  74. if (counter == 0) GetColors()
  75. })
  76. }
  77. let GetAvailableUsers = () => {
  78. counter = userList.length
  79. userList.forEach((data) => { CheckIfAvailable(data) })
  80. if (userList.length == 0) GetColors()
  81. }
  82.  
  83. let Init = () => {
  84. let tmp1 = /atcoder.jp\/contests\/([\w-]*)\/tasks\/([\w-]*)/
  85. let tmp2 = tmp1.exec(location.href)
  86. if (tmp2 == null) return
  87. contestId = tmp2[1], problemId = tmp2[2]
  88. userList = JSON.parse(localStorage.fav)
  89. GetAvailableUsers()
  90. }
  91.  
  92. Init()