AtCoder Fav Rating

You can check your fav's rating for AtCoder!

  1. // ==UserScript==
  2. // @name AtCoder Fav Rating
  3. // @name:ja AtCoder Fav Rating
  4. // @namespace https://github.com/Coki628/ac-fav-rating
  5. // @version 1.1.6
  6. // @description You can check your fav's rating for AtCoder!
  7. // @description:ja AtCoderのお気に入り管理ページでレート等の情報を確認できます。※非推奨
  8. // @author Coki628
  9. // @license MIT
  10. // @match https://atcoder.jp/settings/fav*
  11. // @grant GM_addStyle
  12. // @grant GM_getResourceText
  13. // @resource CSS1 https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/css/dataTables.bootstrap.min.css
  14. // @require https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/js/jquery.dataTables.min.js
  15. // @require https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.12/js/dataTables.bootstrap.min.js
  16. // ==/UserScript==
  17.  
  18. GM_addStyle(GM_getResourceText('CSS1'));
  19.  
  20. (function() {
  21. 'use strict';
  22.  
  23. // 色のクラス名を取得
  24. const getColorType = function(x) {
  25. if (x >= 2800) {
  26. return 'user-red';
  27. } else if (2800 > x && x >= 2400) {
  28. return 'user-orange';
  29. } else if (2400 > x && x >= 2000) {
  30. return 'user-yellow';
  31. } else if (2000 > x && x >= 1600) {
  32. return 'user-blue';
  33. } else if (1600 > x && x >= 1200) {
  34. return 'user-cyan';
  35. } else if (1200 > x && x >= 800) {
  36. return 'user-green';
  37. } else if (800 > x && x >= 400) {
  38. return 'user-brown';
  39. } else {
  40. return 'user-gray';
  41. }
  42. }
  43.  
  44. let total = 0;
  45. const getInfo = function(userName, $tr) {
  46. $.ajax({
  47. // url: 'https://atcoder.jp/users/' + userName + '/history/json',
  48. url: 'https://atcoder.jp/users/' + userName,
  49. type: 'GET',
  50. // dataType: 'json',
  51. dataType: 'html',
  52. })
  53. .done(function(data) {
  54. // ユーザーページから必要な項目を取得
  55. let rank = 9999999;
  56. let rating = 0;
  57. let highest = 0;
  58. let count = 0;
  59. let lastCompeted = '';
  60. $($($.parseHTML(data)).find('table.dl-table')[1]).find('tbody>tr').each(function() {
  61. if ($(this).find('th').text() === '順位') {
  62. rank = Number($(this).find('td').text().slice(0, -2));
  63. } else if ($(this).find('th').text() === 'Rating') {
  64. rating = Number($($(this).find('td>span')[0]).text());
  65. } else if ($(this).find('th').text() === 'Rating最高値') {
  66. highest = Number($($(this).find('td>span')[0]).text());
  67. } else if ($(this).find('th').text() === 'コンテスト参加回数 ') {
  68. count = Number($(this).find('td').text());
  69. } else if ($(this).find('th').text() === '最後に参加した日') {
  70. lastCompeted = $(this).find('td').text();
  71. }
  72. });
  73. // 列追加
  74. $tr.prepend('<td></td>');
  75. $tr.append('<td>' + rank + '</td>');
  76. $tr.append('<td>' + rating + '</td>');
  77. $tr.append('<td>' + highest + '</td>');
  78. $tr.append('<td>' + count + '</td>');
  79. $tr.append('<td>' + lastCompeted + '</td>');
  80.  
  81. if (rank === 1) {
  82. // tourist
  83. $tr.find('img').after('<img src="//img.atcoder.jp/assets/icon/crown_champion.png">')
  84. } else if (rank <= 10) {
  85. // 金冠
  86. $tr.find('img').after('<img src="//img.atcoder.jp/assets/icon/crown_gold.png">')
  87. } else if (rank <= 30) {
  88. // 銀冠
  89. $tr.find('img').after('<img src="//img.atcoder.jp/assets/icon/crown_silver.png">')
  90. } else if (rank <= 100) {
  91. // 銅冠
  92. $tr.find('img').after('<img src="//img.atcoder.jp/assets/icon/crown_bronze.png">')
  93. }
  94.  
  95. // 名前とレートに色付け
  96. let color = getColorType(rating);
  97. $($tr.find('td')[1]).find('a').removeClass('black').addClass(color);
  98. $($tr.find('td')[3]).addClass(color);
  99. color = getColorType(highest);
  100. $($tr.find('td')[4]).addClass(color);
  101. })
  102. .fail(function(data) {
  103. // 削除済ユーザー等への対応
  104. $tr.prepend('<td></td>');
  105. $tr.append('<td>9999999</td>');
  106. $tr.append('<td>0</td>');
  107. $tr.append('<td>0</td>');
  108. $tr.append('<td>0</td>');
  109. $tr.append('<td></td>');
  110. })
  111. .always(function(data) {
  112. total--;
  113. if (total === 0) {
  114. // 全部終わったらDataTablesを構築
  115. let dataTable = $table.DataTable({
  116. paging: false,
  117. lengthChange: false,
  118. info: false,
  119. // index列
  120. columnDefs: [{
  121. searchable: false,
  122. orderable: false,
  123. targets: 0,
  124. }],
  125. order: [[1, 'asc']],
  126. });
  127. // index列の制御
  128. dataTable.on('order.dt search.dt', function() {
  129. dataTable.column(0, {search:'applied', order:'applied'}).nodes().each(function(cell, i) {
  130. cell.innerHTML = i + 1;
  131. });
  132. }).draw();
  133. }
  134. });
  135. }
  136.  
  137. // テーブルサイズの調整
  138. $($('#vue-fav>div.row>div')[0]).removeClass('col-xs-6').addClass('col-xs-9');
  139. $($('#vue-fav>div.row>div')[1]).removeClass('col-xs-6').addClass('col-xs-3');
  140.  
  141. const $table = $($('#vue-fav').find('table')[0]);
  142. // ヘッダ行の挿入
  143. $table.prepend('<thead><tr><th></th><th>Name</th><th>Rank</th><th>Rating</th><th>Highest Rating</th><th>Rated Matches</th><th>Last Competed</th>');
  144. // 表が見やすくなるスタイルを追加
  145. $table.addClass('table-striped table-hover table-bordered');
  146.  
  147. const myName = $('div.header-mypage_btn').text().trim();
  148. const rows = $table.find('tbody>tr');
  149. total = rows.length;
  150.  
  151. // 各行を取得してユーザー情報を追加していく
  152. for (let i = 0; i < rows.length; i++) {
  153. const userName = $(rows[i]).find('td>a').text();
  154. getInfo(userName, $(rows[i]));
  155. // 自分の行を色付け
  156. if (myName && myName === userName) {
  157. $(rows[i]).css('background-color', '#BAE4F4');
  158. }
  159. }
  160. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址