您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Enable desktop notifications for GitHub Actions updates
当前为
// ==UserScript== // @match https://github.com/*/*/actions // @name GitHub Actions notifications // @grant GM_notification // @description Enable desktop notifications for GitHub Actions updates // @version 1.0.0 // @author KaKi87 // @license GPL-3.0-or-later // @namespace https://git.kaki87.net/KaKi87/userscripts/src/branch/master/GitHubActionsNotifications // ==/UserScript== const _username = document.querySelector('img[alt^="@"]').alt.slice(1), _lastActionStatus = {}, getActions = () => [...document.querySelectorAll('[id^="check_suite"]')].map(el => { let status; const svgClassList = el.querySelector('svg').classList, titleLink = el.querySelector('a'); if(svgClassList.contains('octicon-check')) status = 'success'; if(svgClassList.contains('octicon-x')) status = 'failure'; if(svgClassList.contains('octicon-stop')) status = 'aborted'; if(svgClassList.contains('anim-rotate')) status = 'in progress'; if(svgClassList.contains('octicon-dot-fill')) status = 'idle'; return { id: parseInt(titleLink.href.split('/').slice(-1)[0]), title: titleLink.textContent, status, author: el.querySelector('a[data-hovercard-type]').textContent }; }); getActions().forEach(action => _lastActionStatus[action.id] = action.status); (new MutationObserver(() => getActions().forEach(action => { if(_lastActionStatus[action.id] !== action.status && action.author === _username) GM_notification({ title: `GitHub Actions update (${action.id})`, text: `${action.title}\nStatus : ${action.status}`, image: 'https://cdn.icon-icons.com/icons2/2429/PNG/512/github_logo_icon_147285.png' }); _lastActionStatus[action.id] = action.status; }))).observe(document.querySelector('#partial-actions-workflow-runs'), { childList: true });