Github - Hide bots and github-actions from dashboards

Minimizes pushs and commits from github actions and bots from github.com dashboard

安裝腳本?
作者推薦腳本

您可能也會喜歡 Github Old Feed

安裝腳本
  1. // ==UserScript==
  2. // @name Github - Hide bots and github-actions from dashboards
  3. // @description Minimizes pushs and commits from github actions and bots from github.com dashboard
  4. // @namespace cuzi
  5. // @author cuzi
  6. // @version 1.8
  7. // @copyright 2020, cuzi (https://openuserjs.org/users/cuzi)
  8. // @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
  9. // @icon https://raw.githubusercontent.com/hfg-gmuend/openmoji/master/color/72x72/E045.png
  10. // @match https://github.com/
  11. // @match https://github.com/dashboard-feed
  12. // @grant none
  13. // ==/UserScript==
  14.  
  15. /* jshint asi: true, esversion: 8 */
  16.  
  17. (function () {
  18. 'use strict'
  19.  
  20. document.head.appendChild(document.createElement('style')).innerHTML = `
  21. .Details:hover .newexpanderbutton .Link--secondary {
  22. color: var(--color-accent-fg) !important;
  23. }
  24. `
  25.  
  26. function unhideBot (ev) {
  27. const div = this
  28. div.classList.add('shotBot')
  29. div.removeEventListener('click', unhideBot)
  30. div.style.fontSize = ''
  31. if (div.querySelector('.no-border-bottom')) {
  32. div.querySelector('.no-border-bottom').classList.replace('no-border-bottom', 'border-bottom')
  33. }
  34. div.querySelector('.Box').style.display = ''
  35. if (div.querySelector('.body')) {
  36. div.querySelector('.body').style.height = ''
  37. div.querySelector('.body .d-flex').style.padding = ''
  38. } else {
  39. div.querySelector('.d-flex').style.padding = ''
  40. }
  41. div.querySelector('img.avatar').height = '32'
  42. div.querySelector('img.avatar').width = '32'
  43. div.style.cursor = ''
  44. if (div.querySelector('.newexpanderbutton')) {
  45. div.querySelector('.newexpanderbutton').remove()
  46. }
  47. }
  48.  
  49. function hideDiv (div, summary) {
  50. const expandButton = document.querySelector('button.js-details-target:not(.Header-link)[aria-expanded="false"]')
  51. div.style.fontSize = '10px'
  52. if (div.querySelector('.border-bottom')) {
  53. div.querySelector('.border-bottom').classList.replace('border-bottom', 'no-border-bottom')
  54. }
  55. div.querySelector('.Box').style.display = 'none'
  56. if (div.querySelector('.body')) {
  57. div.querySelector('.body').style.height = '22px'
  58. div.querySelector('.body .d-flex').style = 'padding: 0px !important;'
  59. } else {
  60. div.querySelector('.d-flex').style = 'padding: 0px !important;'
  61. }
  62. div.querySelector('img.avatar').height = '20'
  63. div.querySelector('img.avatar').width = '20'
  64. div.style.cursor = 'row-resize'
  65. div.addEventListener('click', unhideBot)
  66. const line = div.querySelector('.Details .flex-column .flex-justify-between.flex-items-baseline')
  67. if (line && expandButton && !line.querySelector('button.js-details-target')) {
  68. const newExpandButton = document.createElement('button')
  69. line.appendChild(newExpandButton)
  70. newExpandButton.outerHTML = expandButton.outerHTML.replace('js-details-target', 'js-details-target newexpanderbutton')
  71. }
  72. const aLinkPrimary = div.querySelector('.no-underline a.Link--primary')
  73. if (summary && aLinkPrimary && !div.querySelector('.summaryspan')) {
  74. const summarySpan = document.createElement('span')
  75. summarySpan.classList.add('summaryspan')
  76. summarySpan.appendChild(document.createTextNode(summary.replace(/\s+to\s*$/, '')))
  77. aLinkPrimary.parentNode.appendChild(summarySpan)
  78. }
  79. }
  80.  
  81. function hideBots () {
  82. // Hide single push events
  83. document.querySelectorAll(`
  84. #dashboard div.push:not(.shotBot),
  85. #dashboard div[classes*=push]:not(.shotBot),
  86. #dashboard div.body:not(.shotBot),
  87.  
  88. [data-repository-hovercards-enabled] div.push:not(.shotBot),
  89. [data-repository-hovercards-enabled] div[classes*=push]:not(.shotBot),
  90. [data-repository-hovercards-enabled] div.body:not(.shotBot)
  91. `).forEach(function (div) {
  92. const label = div.querySelector('.body .d-flex .d-flex .Label')
  93. const isAppUrl = div.querySelector('.body .d-flex .d-flex a.Link--primary[href^="/apps/"]')
  94. if (isAppUrl || (label && label.textContent === 'bot')) {
  95. hideDiv(div)
  96. }
  97. })
  98. // Hide grouped items
  99. document.querySelectorAll(`
  100. #dashboard div.body:not(.shotBot),
  101. [data-repository-hovercards-enabled] div.body:not(.shotBot)
  102. `
  103. ).forEach(function (div) {
  104. const isAppUrl = div.querySelector('.js-news-feed-event-group .d-inline-block[href^="/apps"] .avatar')
  105. if (isAppUrl) {
  106. const summary = div.querySelector('.dashboard-rollup-item>span') ? div.querySelector('.dashboard-rollup-item>span').textContent : null
  107. hideDiv(div, summary)
  108. }
  109. })
  110. }
  111.  
  112. hideBots()
  113. const iv = window.setInterval(hideBots, 200)
  114. window.setTimeout(() => window.clearInterval(iv), 5000)
  115. window.setInterval(hideBots, 5000)
  116. })()