您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Marks all merged notifications as "done" on GitHub (client-side) and only shows UI when needed. Includes console logging and error handling.
当前为
- // ==UserScript==
- // @name Mark All Merged Notifications Done
- // @namespace typpi.online
- // @version 1.6
- // @description Marks all merged 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 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 Done';
- markAsDoneButton.classList.add('mark-merged-done-button');
- markAsDoneButton.addEventListener('click', markAllMergedAsDone);
- 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 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 Done button added to document body as fallback.');
- }
- // Check for merged notifications and show the button if needed
- checkForMergedNotifications();
- } catch (error) {
- console.error('Error in addButton function:', error);
- }
- }
- function checkForMergedNotifications() {
- try {
- const notifications = document.querySelectorAll(NOTIFICATION_SELECTOR);
- let hasMergedNotifications = false;
- for (const notification of notifications) {
- if (notification.querySelector(MERGED_ICON_SELECTOR)) {
- hasMergedNotifications = true;
- break; // No need to continue checking
- }
- }
- if (hasMergedNotifications) {
- markAsDoneButton.style.display = 'block'; // Show the button
- console.log('Merged notifications found. Showing Mark All Merged Done button.');
- } else {
- markAsDoneButton.style.display = 'none'; // Hide the button
- console.log('No merged notifications found. Hiding Mark All Merged Done button.');
- }
- } catch (error) {
- console.error('Error in checkForMergedNotifications function:', error);
- }
- }
- async function markAllMergedAsDone() {
- try {
- const notifications = document.querySelectorAll(NOTIFICATION_SELECTOR);
- console.log(`Found ${notifications.length} notifications.`);
- for (const notification of notifications) {
- if (notification.querySelector(MERGED_ICON_SELECTOR)) {
- console.log('Marking merged notification as done');
- const doneButton = notification.querySelector(DONE_BUTTON_SELECTOR);
- if (doneButton) {
- doneButton.click();
- await delay(DELAY_MS); // Wait for the UI to update
- // notification.remove(); // Remove the notification after clicking "Done"
- } else {
- console.warn('Could not find "Done" button for merged notification.');
- }
- }
- }
- console.log('Finished processing notifications.');
- checkForMergedNotifications(); // Recheck after marking
- } catch (error) {
- console.error('Error in markAllMergedAsDone 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);
- })();