Greasy Fork镜像: Mark script discussions as read

Mark feedback on your scripts as read

目前为 2023-01-12 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Greasy Fork镜像: Mark script discussions as read
  3. // @namespace xbenpm8g5fr72kx7s3w4
  4. // @match https://gf.qytechs.cn/*/users/*
  5. // @grant GM.getValue
  6. // @grant GM.setValue
  7. // @grant GM.deleteValue
  8. // @version 1.1
  9. // @description Mark feedback on your scripts as read
  10. // @run-at document-end
  11. // @inject-into content
  12. // @license MIT
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. "use strict";
  17.  
  18. // Get list of discussions
  19. const context = document.getElementById("user-discussions-on-scripts-written");
  20. if (!context) {
  21. return;
  22. }
  23.  
  24. // Get user ID
  25. const uid = location.pathname.match(/\/users\/(\d+)/);
  26. if (!uid) {
  27. return;
  28. }
  29.  
  30.  
  31. const discussions = context.getElementsByClassName("discussion-list-container");
  32. const prefKey = "markedReadTime" + uid[1];
  33.  
  34.  
  35. function markDiscussions(seenTime) {
  36. seenTime = new Date(seenTime);
  37.  
  38. checkDiscussions:
  39. for (const discussion of discussions) {
  40. const times = discussion.getElementsByTagName("relative-time");
  41.  
  42. for (let time of times) {
  43. time = new Date(time.getAttribute("datetime"));
  44. if (time > seenTime) {
  45. // newer datetime found, skip marking this discussion
  46. continue checkDiscussions;
  47. }
  48. }
  49.  
  50. // no newer datetime found, mark it
  51. discussion.style.opacity = "0.3";
  52. }
  53. }
  54.  
  55.  
  56. function unmarkDiscussions() {
  57. for (const discussion of discussions) {
  58. discussion.style.opacity = "";
  59. }
  60. }
  61.  
  62.  
  63. GM.getValue(prefKey).then(seenTime => {
  64. if (seenTime !== undefined) {
  65. markDiscussions(seenTime);
  66. }
  67. });
  68.  
  69.  
  70. const BTN_MARK = "mark as read";
  71. const TITLE_MARK = "mark all script discussions as read up to the current point in time";
  72. const BTN_UNMARK = "clear read status";
  73. const TITLE_UNMARK = "remove the read indicator on all discussions";
  74.  
  75.  
  76. function setButtonText(btn, marked) {
  77. if (marked) {
  78. btn.textContent = BTN_UNMARK;
  79. btn.title = TITLE_UNMARK;
  80. } else {
  81. btn.textContent = BTN_MARK;
  82. btn.title = TITLE_MARK;
  83. }
  84. }
  85.  
  86. const markButton = document.createElement("button");
  87. markButton.type = "button";
  88.  
  89. const pageLoad = Math.floor(performance.timeOrigin);
  90. let marked = false;
  91.  
  92. setButtonText(markButton, false);
  93.  
  94. markButton.addEventListener("click", function () {
  95. if (!marked) {
  96. markDiscussions(pageLoad);
  97. GM.setValue(prefKey, pageLoad);
  98. } else {
  99. unmarkDiscussions();
  100. GM.deleteValue(prefKey);
  101. }
  102.  
  103. marked = !marked;
  104. setButtonText(this, marked);
  105. });
  106.  
  107. context.getElementsByTagName("h3")[0].append(" ", markButton);
  108. })();

QingJ © 2025

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