Greasy Fork 还支持 简体中文。

osu! Show Modding Activity Score

Show modding activity score on user's profile page

  1. // ==UserScript==
  2. // @name osu! Show Modding Activity Score
  3. // @description Show modding activity score on user's profile page
  4. // @namespace https://osu.ppy.sh/u/376831
  5. // @include *osu.ppy.sh/u/*
  6. // @version 1.0
  7. // @grant none
  8. // ==/UserScript==
  9. var scoreFontSize = 14;
  10. var isScoreBold = true;
  11. addLoadEvent(loadEvent);
  12. function loadEvent() {
  13. expandProfile('kudos', true);
  14. addActivityElement();
  15. var id = window.setInterval(function () {
  16. seeIfKdLoaded(id);
  17. }, 1000);
  18. }
  19. function seeIfKdLoaded(id) {
  20. var kds = document.getElementById('kudos');
  21. if (kds.lastChild) {
  22. doAfterKdLoaded(id);
  23. }
  24. }
  25. function doAfterKdLoaded(id) {
  26. expandProfile('general', true);
  27. scrollToStart();
  28. var kdList = getKdHistoryWithoutDenied();
  29. var averageActivity = getAverageActivity(kdList) / (1000 * 60 * 60 * 24);
  30. addActivityScore(averageActivity);
  31. var score = document.getElementById('moddingActivityScores');
  32. if (score) {
  33. window.clearInterval(id);
  34. }
  35. }
  36. function getDateByString(dateString) {
  37. return new Date(Date.parse(dateString.replace(/-/g, '/')));
  38. }
  39. function getDates(kudosElement) {
  40. var dates = kudosElement.getElementsByTagName('time');
  41. var date = new Array();
  42. for (var i = 0; i < dates.length; i++) {
  43. date[i] = getDateByString(dates[i].title);
  44. }
  45. return date;
  46. }
  47. function getIsDenieds(kudosElement) {
  48. var denieds = kudosElement.getElementsByTagName('time');
  49. var isDenied = Array();
  50. for (var i = 0; i < denieds.length; i++) {
  51. isDenied[i] = denieds[i].nextSibling.textContent.indexOf('Denied') != - 1 ? true : false;
  52. }
  53. return isDenied;
  54. }
  55. function getLinks(kudosElement) {
  56. var links = kudosElement.getElementsByTagName('a');
  57. var link = new Array();
  58. var linkIndex = 0;
  59. for (var i = 0; i < links.length; i++) {
  60. if (links[i].href.indexOf('forum/p') != - 1) {
  61. link[linkIndex] = links[i].href;
  62. linkIndex += 1;
  63. }
  64. }
  65. return link;
  66. }
  67. function getKdHistory() {
  68. var kds = document.getElementById('kudos');
  69. if (!kds) {
  70. return new Array();
  71. } else {
  72. var date = getDates(kds);
  73. var isDeny = getIsDenieds(kds);
  74. var links = getLinks(kds);
  75. var kd = new Array();
  76. for (var i = 0; i < date.length; i++) {
  77. kd[i] = new Array(i, date[i], isDeny[i], links[i]);
  78. }
  79. return kd;
  80. }
  81. }
  82. function getDeniedList(allKdList) {
  83. var deniedList = new Array();
  84. var index = 0;
  85. for (var i = 1; i < allKdList.length; i++) {
  86. if (allKdList[i][2]) {
  87. deniedList[index] = allKdList[i];
  88. index += 1;
  89. }
  90. }
  91. return deniedList;
  92. }
  93. function isThisKdHistoryDenied(kdHistory, allDeniedList) {
  94. for (var i = 0; i < allDeniedList.length; i++) {
  95. if (kdHistory[3] == allDeniedList[i][3]) {
  96. return true;
  97. }
  98. }
  99. return false;
  100. }
  101. function getKdHistoryWithoutDenied() {
  102. var kds = getKdHistory();
  103. var deniedList = getDeniedList(kds);
  104. var kd = new Array();
  105. var index = 0;
  106. for (var i = 0; i < kds.length; i++) {
  107. if (kds[i][2]) {
  108. continue;
  109. }
  110. if (!isThisKdHistoryDenied(kds[i], deniedList)) {
  111. kd[index] = kds[i];
  112. index += 1;
  113. }
  114. }
  115. return kd;
  116. }
  117. function scrollToStart() {
  118. location.hash = '';
  119. }
  120. function addLoadEvent(func) {
  121. var oldonload = window.onload;
  122. if (typeof window.onload != 'function') {
  123. window.onload = func;
  124. } else {
  125. window.onload = function () {
  126. oldonload();
  127. func();
  128. }
  129. }
  130. }
  131. function getDateOffset(nowDate, date) {
  132. return nowDate.getTime() - date.getTime();
  133. }
  134. function getAverageActivity(kdList) {
  135. var nowDate = new Date();
  136. var sum = 0;
  137. for (var i = 0; i < kdList.length; i++) {
  138. sum += getDateOffset(nowDate, kdList[i][1]);
  139. }
  140. return sum / kdList.length;
  141. }
  142. function addActivityElement() {
  143. var div = document.createElement('div');
  144. div.style['font-size'] = scoreFontSize + 'px';
  145. var center = document.createElement('center');
  146. div.appendChild(center);
  147. center.innerHTML = 'Modding Activity: ';
  148. var b = document.createElement('b');
  149. b.id = 'moddingActivityScores';
  150. b.innerHTML = '∞';
  151. if (!isScoreBold) {
  152. b.style.fontWeight = 'normal';
  153. }
  154. center.appendChild(b);
  155. var p = document.createElement('p');
  156. center.appendChild(p);
  157. var head = document.getElementsByClassName('centrep userbox') [0];
  158. insertAfter(div, head);
  159. }
  160. function addActivityScore(number) {
  161. var score = document.getElementById('moddingActivityScores');
  162. score.innerHTML = roundNumber(number, 2);
  163. }
  164. function insertAfter(newElement, targetElement) {
  165. var parent = targetElement.parentNode;
  166. if (parent.lastChild == targetElement) {
  167. parent.appendChild(newElement);
  168. }
  169. else {
  170. parent.insertBefore(newElement, targetElement.nextSibling);
  171. }
  172. }
  173. function roundNumber(number, decimals) {
  174. var newString;
  175. decimals = Number(decimals);
  176. if (decimals < 1) {
  177. newString = (Math.round(number)).toString();
  178. } else {
  179. var numString = number.toString();
  180. if (numString.lastIndexOf('.') == - 1) {
  181. numString += '.';
  182. }
  183. var cutoff = numString.lastIndexOf('.') + decimals;
  184. var d1 = Number(numString.substring(cutoff, cutoff + 1));
  185. var d2 = Number(numString.substring(cutoff + 1, cutoff + 2));
  186. if (d2 >= 5) {
  187. if (d1 == 9 && cutoff > 0) {
  188. while (cutoff > 0 && (d1 == 9 || isNaN(d1))) {
  189. if (d1 != '.') {
  190. cutoff -= 1;
  191. d1 = Number(numString.substring(cutoff, cutoff + 1));
  192. } else {
  193. cutoff -= 1;
  194. }
  195. }
  196. }
  197. d1 += 1;
  198. }
  199. if (d1 == 10) {
  200. numString = numString.substring(0, numString.lastIndexOf('.'));
  201. var roundedNum = Number(numString) + 1;
  202. newString = roundedNum.toString() + '.';
  203. } else {
  204. newString = numString.substring(0, cutoff) + d1.toString();
  205. }
  206. }
  207. if (newString.lastIndexOf('.') == - 1) {
  208. newString += '.';
  209. }
  210. var decs = (newString.substring(newString.lastIndexOf('.') + 1)).length;
  211. for (var i = 0; i < decimals - decs; i++)
  212. newString += '0';
  213. var newNumber = Number(newString);
  214. return newString;
  215. }