NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name WhatsApp Web Notification Sound Changer // @description Adds a settings menu to change WhatsApp Web notification sound/volume // @version 1.2 // @license GPL-3.0-or-later // @require https://openuserjs.org/src/libs/sizzle/GM_config.js // @grant GM_getValue // @grant GM_setValue // @match *://web.whatsapp.com/* // @run-at document-start // @namespace https://greasyfork.org/users/751814 // ==/UserScript== var config_image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAE4ElEQVR4nO2cL1BcSRCHP7ECgUAgIhAIxIqIiBUnUxWBiDixAoGIiEBEIBAIBOLEiRMREREIRAQCgYhAnFhxAoFAIBARiBOICARixYp3otkUUI/lbU/3zLx381V1oZb69fzt6el5UCgUCoVCoVAoFAqFwgOWgQ3gg9KGwGJ01R3hDTABqkC7A1bjSu8Gh4Q3/tT+iqy9E5xj1wHfI2vvBLfYdcBVZO2tZxm7xq+QvaQwB79h2wEVsBbVg5aziX0HrEf1oOX8gX0HfIrqQcv5hn0HfI7qQcs5w74DSig6Bz+x74DOh6I9YA85wX4AFpT/Y4h941dIKPq7yjPJJ20hvm0r/4c7X3ns8C3wBXjd4Lc9pNN+4NP4T2fCsKFPg3u/7p78j72Gv4/GS4mzM56fFQNs0w5N7Qzo1+iZjvZZmsZkluAb0czp6azoI6P+T2wyniHL0u69D8+N9ufsOLzZbNCu2TfK33mYVsvb8OYLY4E463audoHM5GTs1Yj6v9lWcCsqeUXz9bLL9hNYCmxLFYcKsV216GmOgZHwrtiE+pDWDY9cTdvtNKhF58AjV98Vex/Qro1YAP7NwNEbJAQ8Bf4GLvFJ4M1rP3AOS/cTOneGJMJWZ+jrI6HxZUKd05O1OUtIDiS2QxfoTpxD0hwSb3GqxnsX2ZGHeRotPSREjN0Jg0DdtSwSb/2/w3ZD+0i8pN8VjvvAGrIkeI98jwqGj866KySFveqg/RGL+J6CPW+cPJejA3S3gGq2sJ/WI2fNPew35jFy2ZSEAbb7gsvm9QTLO+dr5DYwKcvIYSjUmZhlIxbnhFMSZUHr6BFezbYZUW/IPcYEOZBmyRf0TsV8StRX6qzI/LHHMTqnzhNo1eaOvibQ2pgR+a//U7T7QDbVEHVoQ7yDBFq1gcMogdbGXNOeaX2q1Jp1B2jTFCct0pp1lbV2Wp8l0KotxjpMoLUx2ocVY+LmUVaVOiuknDJLdgnLDWlLxzVsB+gcI5nVbFhE1nCtQ1M7iqjZoqojevazjtfYZRcnxHlK+tZIb4UcIFciaK5lE/vSxBjRkPWF0g1yXRuNHvqcTxPbcNS+66R5Auw46v7FCv5VcXf43Au8x/9e+BjHpOIC+pOuZlpbdsI68Sq5R4a6H+H1enHWTLBYjraJ/wzK5ZYsJIceYifooqMB+uxs6MBxW4aOEjhUISP4CDmszYq9F5Ho7HsinRXOT1hXSFOe+NDGSCBwgmRRD5AGPyfti8sK2SPdD2f7iZ3M2TxD6F/EjIbaZKOQRp2XDScn2moTEtQH/WMgvCuW5KLe6sOqbbdbpDgtCQcNBHbdkn6+Zhnb73u2zVzfAjRlB534nJYvrZYsvsQ4T8n3BMkYriOFrRY3aaH2GTlBD5kvdZFVdcQ6s8VeI7n4VzW/3SDNE9Mr6h//9ZH6z1maYt3ezcXT/MvD0f4SS0h1dYw0xw2ycb6UMlhABkfdrMiyQHf6dGnE86P9JZaQsg+Phr9DPt6qydVMZ8Xo/m/yjdcbjw36IqoHLecK+w7Iuqo5Nzzy+dlWtOWIx3PSZJ8WayOfsO+AqLU7beelc4XGklWwtZE1bBt/HFd+N7AMRS8ja+8ElqFoihc4rccyFC0hqAKrD0RlmThrC2+QvNK+0nYojV8oFAqFQqFQKBQKhYf8B5iWbh8TtODQAAAAAElFTkSuQmCC"; const sleep = ms => new Promise(res => setTimeout(res, ms)); function doStore() { let c = ` window.notificationAudio.volume = ${GM_config.get('volume')/100} if(${GM_config.get('useSound')}){ window.notificationAudio.src = "${GM_config.get('sound')}" } else { window.notificationAudio.src = window.defaultNotificationAudioPath }`; unsafeWindow.eval(c); } GM_config.init( { 'id': 'wa_web_cfg', 'title': 'Notification Settings', 'fields': { 'volume': { 'label': 'Notification Volume Percent', 'type': 'int', 'min': 0, 'max': 100, 'default': 100 }, 'sound': { 'label': 'Notification Sound File', 'type': 'fileupload' }, 'useSound': { 'label': 'Use custom sound', 'type': 'checkbox', 'default': false }, 'playButton': { 'label': 'Play notification sound', 'type': 'button', 'click': function() { unsafeWindow.notificationAudio.play(); } } }, 'events': { 'save': doStore }, 'types': { 'fileupload': { 'default': null, toNode: function(configId) { var field = this.settings, id = this.id, create = this.create, retNode = create('div', { className: 'config_var', id: configId + '_' + id + '_var', title: field.title || '' }); retNode.appendChild(create('label', { innerHTML: field.label, id: configId + '_' + id + '_field_label', for: configId + '_field_' + id, className: 'field_label' })); var props = { id: configId + '_field_' + id, type: 'file' }; let input = create('input', props); input.onchange = function() { let reader = new FileReader(); reader.readAsDataURL(input.files[0]); reader.onload = function() { input.setAttribute('datauri', reader.result); }; }; retNode.appendChild(input); return retNode; }, toValue: function() { var rval = null; if (this.wrapper) { var input = this.wrapper.getElementsByTagName('input')[0]; rval = input.getAttribute('datauri'); } return rval; }, reset: function() { if (this.wrapper) { var input = this.wrapper.getElementsByTagName('input')[0]; input.value = ''; } } } } }); document.addEventListener('readystatechange', async (event) => { if(document.readyState === 'interactive') { unsafeWindow.eval(` window.Audio = class extends Audio { constructor(x){ super(x); if(x != undefined && x.includes('notification')) { window.notificationAudio = this; window.defaultNotificationAudioPath = x; } } }; ` ); } if(document.readyState === 'complete') { var headers = []; while (headers.length < 1) { headers = document.querySelectorAll('header'); await sleep(200); } var config = document.createElement('img'); config.src = config_image; config.style.height = "75%"; config.style.cursor = "pointer"; config.onclick = ()=>GM_config.open(); headers[0].appendChild(config); doStore(); } });