您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Marks all merged and closed notifications as "done" on GitHub (client-side) and only shows UI when needed. Includes console logging and error handling.
当前为
- // ==UserScript==
- // @name Mark All Merged/Closed Notifications Done
- // @namespace typpi.online
- // @version 1.8
- // @description Marks all merged and closed notifications as "done" on GitHub (client-side) and only shows UI when needed. Includes console logging and error handling.
- // @author Nick2bad4u
- // @match https://github.com/notifications
- // @grant GM_addStyle
- // @grant GM_xmlhttpRequest
- // @connect api.github.com
- // @license Unlicense
- // @tag github
- // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
- // @homepageURL https://github.com/Nick2bad4u/UserStyles
- // @supportURL https://github.com/Nick2bad4u/UserStyles/issues
- //
- // ==/UserScript==
- (function() {
- 'use strict';
- const DONE_BUTTON_SELECTOR = 'button[aria-label="Done"]';
- const NOTIFICATION_SELECTOR = '.notifications-list-item';
- const MERGED_ICON_SELECTOR = 'svg.octicon-git-merge';
- const CLOSED_ICON_SELECTOR = 'svg.octicon-git-pull-request-closed';
- const DELAY_MS = 500; // Delay after each action (adjust as needed)
- let markAsDoneButton; // Declare the button outside the function
- function addButton() {
- try {
- markAsDoneButton = document.createElement('button');
- markAsDoneButton.textContent = 'Mark All Merged/Closed Done';
- markAsDoneButton.classList.add('mark-merged-done-button');
- markAsDoneButton.addEventListener('click', markAllMergedAndClosedAsDone);
- markAsDoneButton.style.display = 'none'; // Initially hide the button
- const notificationsToolbar = document.querySelector('.js-socket-channel.js-updatable-content');
- if (notificationsToolbar) {
- notificationsToolbar.appendChild(markAsDoneButton);
- console.log('Mark All Merged/Closed Done button added to notifications toolbar.');
- } else {
- console.warn('Could not find notifications toolbar. Button may not be visible.');
- document.body.appendChild(markAsDoneButton); // Fallback
- console.log('Mark All Merged/Closed Done button added to document body as fallback.');
- }
- // Check for relevant notifications and show the button if needed
- checkForMergedAndClosedNotifications();
- } catch (error) {
- console.error('Error in addButton function:', error);
- }
- }
- function checkForMergedAndClosedNotifications() {
- try {
- const notifications = document.querySelectorAll(NOTIFICATION_SELECTOR);
- let hasRelevantNotifications = false;
- for (const notification of notifications) {
- if (notification.querySelector(MERGED_ICON_SELECTOR) || notification.querySelector(CLOSED_ICON_SELECTOR)) {
- hasRelevantNotifications = true;
- break; // No need to continue checking
- }
- }
- if (hasRelevantNotifications) {
- markAsDoneButton.style.display = 'block'; // Show the button
- console.log('Relevant notifications found. Showing Mark All Merged/Closed Done button.');
- } else {
- markAsDoneButton.style.display = 'none'; // Hide the button
- console.log('No relevant notifications found. Hiding Mark All Merged/Closed Done button.');
- }
- } catch (error) {
- console.error('Error in checkForMergedAndClosedNotifications function:', error);
- }
- }
- async function markAllMergedAndClosedAsDone() {
- try {
- const notifications = document.querySelectorAll(NOTIFICATION_SELECTOR);
- console.log(`Found ${notifications.length} notifications.`);
- for (const notification of notifications) {
- const isMerged = notification.querySelector(MERGED_ICON_SELECTOR);
- const isClosed = notification.querySelector(CLOSED_ICON_SELECTOR);
- if (isMerged || isClosed) {
- console.log(`Marking ${isMerged ? 'merged' : 'closed'} notification as done`);
- const doneButton = notification.querySelector(DONE_BUTTON_SELECTOR);
- if (doneButton) {
- doneButton.click();
- await delay(DELAY_MS); // Wait for the UI to update
- } else {
- console.warn('Could not find "Done" button for notification.');
- }
- }
- }
- console.log('Finished processing notifications.');
- checkForMergedAndClosedNotifications(); // Recheck after marking
- } catch (error) {
- console.error('Error in markAllMergedAndClosedAsDone function:', error);
- }
- }
- // Helper function to introduce a delay
- function delay(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
- }
- const style = document.createElement('style');
- document.head.appendChild(style);
- style.textContent = `
- .mark-merged-done-button {
- position: fixed;
- bottom: 50px; /* Adjusted bottom position */
- right: 10px;
- z-index: 999; /* Ensure it's below the other button if necessary */
- background-color: #2ea44f; /* Same color as the other script */
- color: #ffffff;
- border: none;
- padding: 10px;
- border-radius: 5px;
- cursor: pointer;
- }
- .mark-merged-done-button:hover {
- background-color: #79e4f2; /* Same hover color as the other script */
- }
- `;
- window.addEventListener('load', addButton);
- })();