您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Displays a windows notification whenever a user mentions specific textual word(s) in a channel. The script must be manually edited to configure the keywords.
// ==UserScript== // @name Discord Keyword Notification -updated // @namespace http://tampermonkey.net/ // @version 1.0.0 // @license GNU AGPLv3 // @author noxtrip (original by jcunews) // @description Displays a windows notification whenever a user mentions specific textual word(s) in a channel. The script must be manually edited to configure the keywords. // @match *://discordapp.com/* // @match *://discord.com/* // @grant GM_notification // @require http://code.jquery.com/jquery-1.12.4.min.js // ==/UserScript== (function() { //=== CONFIGURATION BEGIN === //maximum duration to display notification var notificationDuration = 50000; //in milliseconds. 1000ms = 1 second. 0 or less = disable auto-dismiss notification. //keywords are specified as regular expression. note: the "g" flag is required. //quick tutorial: https://www.codeproject.com/Articles/199382/Simple-and-Useful-JavaScript-Regular-Expression-Tu //full tutorial: https://www.regular-expressions.info/tutorial.html var keywordsRegexp = /leech|snip/gi; //=== CONFIGURATION END === var observer, observing, selector = '[class^="scrollerInner-"]', matches = []; function notify(keywords, nt) { Notification.requestPermission().then(function (permission) { // If the user accepts, let's create a notification if (permission === "granted") { GM_notification ( {title: 'Discord match found', text: keywords[0] } ); } }); } function getMatches(s, r, m) { r = []; while (m = keywordsRegexp.exec(s)){ r.push(m[0]); break; } return r; } function check(records) { records.forEach(function(record) { record.addedNodes.forEach(function(node, m, s) { if ( node && (!node.previousElementSibling || !(/hasMore/).test(node.previousElementSibling.className)) && !node.querySelector('[class*="isSending-"]') && (node = node.querySelector('[class^="markup-"]')) && ((m = getMatches(node.textContent)).length) ) { notify(m); } }); }); } function init(observerInit) { observerInit = {childList: true, subtree: true}; setInterval(function(ele) { if (location.pathname.substr(0, 10) === "/channels/") { if (!observing && (ele = document.querySelector(selector))) { observing = true; if (!observer) observer = new MutationObserver(check); observer.observe(ele, observerInit); } } else if (observing) { observer.disconnect(); observing = false; } }, 500); } if (window.Notification) { Notification.requestPermission().then(function() { if (Notification.permission === "granted") { init(); } else alert("Access to Browser Notification feature is not granted by user.\nKeyword notification can not be displayed."); }); } else alert("Browser Notification feature is disabled or not supported."); })();