Atcoder Nickname

给 Atcoder 用户添加备注

  1. // ==UserScript==
  2. // @name Atcoder Nickname
  3. // @namespace https://greasyfork.org/zh-CN/users/1223216-znpdco
  4. // @license MIT
  5. // @version 1.3
  6. // @description 给 Atcoder 用户添加备注
  7. // @author ZnPdCo
  8. // @match https://atcoder.jp/*
  9. // @icon https://aowuucdn.oss-accelerate.aliyuncs.com/atcoder.png
  10. // @grant unsafeWindow
  11. // @grant GM_log
  12. // @grant GM_openInTab
  13. // @grant GM_deleteValue
  14. // @grant GM_xmlhttpRequest
  15. // @grant GM_registerMenuCommand
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant GM_setClipboard
  19. // @require https://unpkg.com/jquery@3.4.1/dist/jquery.js
  20. // ==/UserScript==
  21.  
  22. (function() {
  23. // 引入sweet alert
  24. const script = document.createElement('script');
  25. script.src = 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-sweetalert/1.0.1/sweetalert.min.js';
  26. document.head.appendChild(script);
  27. const css = document.createElement('link');
  28. css.href = 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-sweetalert/1.0.1/sweetalert.min.css';
  29. css.rel="stylesheet";
  30. document.head.appendChild(css);
  31.  
  32. if(GM_getValue("namedata") == undefined) {
  33. GM_setValue("namedata", "{}");
  34. }
  35. var namedata = JSON.parse(GM_getValue("namedata"));
  36. $(`<li style="cursor: pointer;"><a id="nickname_set"><span class="glyphicon glyphicon-tags" aria-hidden="true"></span> 管理备注</a></li>`).insertBefore('#navbar-collapse .divider:eq(1)');
  37. $('#nickname_set').click(function(e) {
  38. e.preventDefault();
  39. swal({
  40. title: "批量设置备注",
  41. text: "备注 JSON(格式如 <code>{\"atcoder\": \"at\"}</code>):",
  42. type: "input",
  43. html: true,
  44. confirmButtonText: "确定",
  45. cancelButtonText: "取消",
  46. showCancelButton: true,
  47. closeOnConfirm: false,
  48. animation: "slide-from-top",
  49. inputPlaceholder: "{\"atcoder\": \"at\"}"
  50. }, function(json){
  51. if (json === false) return false;
  52.  
  53. var is_json = true;
  54. try {
  55. var object = JSON.parse(json);
  56. } catch (error) {
  57. is_json = false;
  58. swal.showInputError("这好像不是一个合法的 JSON!");
  59. }
  60. if(!is_json) {
  61. return false;
  62. }
  63.  
  64. GM_setValue("namedata", json);
  65. location.reload();
  66. });
  67. $(".form-control").val(GM_getValue("namedata"));
  68. });
  69. setInterval(function() {
  70. var ele = $('.username');
  71. for(let i = 0; i < ele.length; i ++) {
  72. if($('.username').eq(i).has('.nickname').length == 0) {
  73. var name = $('.username').eq(i).text().replaceAll(' ', '');
  74. if(name in namedata) {
  75. $('.username').eq(i).append(`<span class="nickname">(${namedata[name]})</span>`);
  76. $(`.nickname`).css({'color': 'black',
  77. 'opacity': '.15',
  78. 'transition': 'all .5s'});
  79. $(`.nickname`).unbind('hover').hover(function(e) { // 鼠标悬浮时触发
  80. $(e.target).css('opacity', '1')
  81. }, function(e) { // 鼠标离开时触发
  82. $(e.target).css('opacity', '.15')
  83. })
  84. }
  85. }
  86. if($('.username').eq(i).has('.nickname-edit').length == 0) {
  87. $('.username').eq(i).append(`<span> </span><span class="nickname-edit glyphicon glyphicon-edit" href=""></span>`);
  88. $(`.nickname-edit`).css({'color': 'black',
  89. 'opacity': '.15',
  90. 'transition': 'all .5s',
  91. 'cursor': 'pointer'});
  92. $(`.nickname-edit`).unbind('hover').hover(function(e) { // 鼠标悬浮时触发
  93. $(e.target).css('opacity', '1')
  94. }, function(e) { // 鼠标离开时触发
  95. $(e.target).css('opacity', '.15')
  96. })
  97. $(`.nickname-edit`).unbind('click').click(function(e) { // 鼠标点击时触发
  98. e.preventDefault();
  99. var username = $(e.target).parent().find('span:eq(0)').text().replace(' ', '');
  100. swal({
  101. title: "设置 " + username + " 的备注",
  102. text: "备注:",
  103. type: "input",
  104. confirmButtonText: "确定",
  105. cancelButtonText: "取消",
  106. html: true,
  107. showCancelButton: true,
  108. closeOnConfirm: false,
  109. animation: "slide-from-top",
  110. inputPlaceholder: username + " 的备注",
  111. }, function(nickname){
  112. if (nickname === false) return false;
  113. namedata[username] = nickname;
  114. if(nickname == '') {
  115. delete namedata[username]
  116. }
  117. GM_setValue("namedata", JSON.stringify(namedata));
  118. location.reload();
  119. });
  120. if(username in namedata)
  121. $(".form-control").val(namedata[username]);
  122. })
  123. }
  124. }
  125. }, 200);
  126. })();