NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name GitHub Notifications // @namespace https://github.com // @version 1.0 // @description Send web notifications on GitHub notifications page // @author KockaAdmiralac // @match https://github.com/notifications // @license MIT // @grant none // @run-at document-end // ==/UserScript== (function() { 'use strict'; var element = document.querySelector('.notification-indicator .mail-status'), hadClass = isUnread(); function reload() { location.reload(); } function isUnread() { return element.classList.contains('unread'); } function observationCallback(d) { if (!d[0] || d[0].attributeName !== 'class') { return; } var hasClass = isUnread(); if (hasClass && !hadClass) { new Notification('New GitHub notifications!', { icon: 'https://camo.githubusercontent.com/7710b43d0476b6f6d4b4b2865e35c108f69991f3/68747470733a2f2f7777772e69636f6e66696e6465722e636f6d2f646174612f69636f6e732f6f637469636f6e732f313032342f6d61726b2d6769746875622d3235362e706e67' }); setTimeout(reload, 3000); } hadClass = hasClass; } function permissionCallback(response) { if (response === 'granted') { var observer = new MutationObserver(observationCallback); observer.observe(element, { attributes: true }); } else { console.error('GitHub Notifications script will not work without a permission to send notifications!'); } } Notification.requestPermission().then(permissionCallback); })();