diff --git a/README.md b/README.md index dc7c387..2498847 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # vk-mute Заглушить собеседника в беседе в ВК. 🔇 -На данный момент ВКонтакте не позволяет заглушать людей в беседах. Это расширение для Google Chrome берется это исправить. +На данный момент ВКонтакте не позволяет заглушать людей в беседах. Это расширение для Chrome берется это исправить. Если нажать на кнопку 🔇 напротив сообщения в беседе, то все сообщения во всех беседах от этого отправителя будут скрыты. @@ -11,4 +11,10 @@ 3. Хром > Настройки > Расширения 1. Включить режим разработчика 2. Загрузить распакованное, выбрать каталог с расширением - \ No newline at end of file + +Расширение должно работать во всех браузерах на движке Chromium. + +Проверено на: +- Google Chrome +- Opera +- Brave diff --git a/background.js b/background.js index f921157..8881b6b 100644 --- a/background.js +++ b/background.js @@ -1,15 +1,14 @@ -chrome.runtime.onInstalled.addListener(function() { - chrome.storage.sync.set({isExtensionOn: true}, function() { - console.log('isExtensionOn: '+true); - }); +chrome.runtime.onInstalled.addListener(function () { + chrome.storage.sync.set({ isExtensionOn: true }, function () { + console.log('isExtensionOn: ' + true); + }); - chrome.declarativeContent.onPageChanged.removeRules(undefined, function() { - chrome.declarativeContent.onPageChanged.addRules([{ - conditions: [new chrome.declarativeContent.PageStateMatcher({ - pageUrl: {hostEquals: 'vk.com'}, - }) - ], - actions: [new chrome.declarativeContent.ShowPageAction()] - }]); - }); + chrome.declarativeContent.onPageChanged.removeRules(undefined, function () { + chrome.declarativeContent.onPageChanged.addRules([{ + conditions: [new chrome.declarativeContent.PageStateMatcher({ + pageUrl: { hostEquals: 'vk.com' }, + })], + actions: [new chrome.declarativeContent.ShowPageAction()] + }]); + }); }); \ No newline at end of file diff --git a/controls.js b/controls.js index 2f2f433..4f454db 100644 --- a/controls.js +++ b/controls.js @@ -1,34 +1,3 @@ -var showMembersBtn = document.getElementsByClassName("_im_chat_members im-page--members")[0]; -var controlsArea; - -/* -function isInt(value) { - return !isNaN(value) && (function(x) { return (x | 0) === x; })(parseFloat(value)) -} - - -showMembersBtn.addEventListener('click', function() { - var checkExist = setInterval(function() { - controlsArea = document.getElementsByClassName("ListItem__aside"); - - if (controlsArea.length > 0) { - for (var item of controlsArea) { - // Narrowing the list to onle people - if (item.parentElement.firstElementChild.firstElementChild.classList.contains('Entity')) { - var link = item.parentElement.firstElementChild.firstElementChild.children[1].firstElementChild.firstElementChild.href; - var id = link.substr(link.length - 9); - if (isInt(id)) { - item.innerHTML += ''; - } - } - } - - clearInterval(checkExist); - } - }, 100); -}); -*/ - function muteBtnHTML(id) { return ` 🔇 @@ -36,51 +5,7 @@ function muteBtnHTML(id) { ` } -/* function addControls() { - var messages = document.getElementsByClassName("im-mess im_in _im_mess"); - - for (var item of messages) { - var actionsArea = item.getElementsByClassName("im-mess--actions")[0]; - if (actionsArea && actionsArea.lastChild.className != "mute_message") { - var sender_id = item.parentElement.parentElement.parentElement["dataset"].peer - - actionsArea.innerHTML += muteBtnHTML(sender_id); - var muteBtn = actionsArea.getElementsByClassName("mute_message")[0]; - muteBtn.style.display = "none"; - - actionsArea.parentElement.addEventListener("mouseenter", function( event ) { - event.target.getElementsByClassName("mute_message")[0].style.display = "inline-block"; - }); - - actionsArea.parentElement.addEventListener("mouseleave", function( event ) { - event.target.getElementsByClassName("mute_message")[0].style.display = "none"; - }); - - muteBtn.addEventListener("click", function(event) { - var clicked_id = event.target.id.substr(event.target.id.length - 9); - - chrome.storage.sync.set({idToHide: clicked_id}, function() { - hidePeer(clicked_id); - console.log('idToHide: ' + clicked_id); - }); - }); - } - } -} - -var chatBody = document.getElementsByClassName("_im_peer_history im-page-chat-contain")[0]; - -chatBody.addEventListener('DOMNodeInserted', function(event) { - if (event.target.className == 'im-mess--check fl_l') { - addControls(); - } -}); -*/ - -var chatBody = document.getElementsByClassName("_im_peer_history im-page-chat-contain")[0]; - -chatBody.addEventListener('DOMNodeInserted', function(event) { if (event.target.className == 'im-mess--check fl_l') { var message = event.target.parentElement; @@ -101,13 +26,68 @@ chatBody.addEventListener('DOMNodeInserted', function(event) { }); muteBtn.addEventListener("click", function(event) { - var clicked_id = event.target.id.substr(4); + var clicked_id = event.target.id.substr(4); // get id of sender from element id chrome.storage.sync.set({idToHide: clicked_id}, function() { - hidePeer(clicked_id); + for (var item of chatBody.children) { + if (item.dataset.peer == clicked_id) { + item.style.display = "none"; + } + } + console.log('idToHide: ' + clicked_id); }); }); } } -}); +} + +var chatBody = document.getElementsByClassName("_im_peer_history im-page-chat-contain")[0]; + +chatBody.addEventListener('DOMNodeInserted', addControls); + +// Try to add controls until successful. Needed for page refresh. +var controlsInterval = setInterval(function () { + var chatBody = document.getElementsByClassName("_im_peer_history im-page-chat-contain")[0]; + + for (var item of chatBody.children) { + if (item.className.includes('im-mess-stack _im_mess_stack')) { + var messages = item.children[1].children[1].getElementsByClassName('im-mess im_in _im_mess'); + for (var message of messages) { + var actionsArea = message.getElementsByClassName("im-mess--actions")[0]; + + if (actionsArea && actionsArea.lastChild.className != "mute_message") { + var sender_id = message.parentElement.parentElement.parentElement.dataset.peer; + + actionsArea.innerHTML += muteBtnHTML(sender_id); + var muteBtn = actionsArea.getElementsByClassName("mute_message")[0]; + muteBtn.style.display = "none"; + + actionsArea.parentElement.addEventListener("mouseenter", function( event ) { + event.target.getElementsByClassName("mute_message")[0].style.display = "inline-block"; + }); + + actionsArea.parentElement.addEventListener("mouseleave", function( event ) { + event.target.getElementsByClassName("mute_message")[0].style.display = "none"; + }); + + muteBtn.addEventListener("click", function(event) { + var clicked_id = event.target.id.substr(4); // get id of sender from element id + + chrome.storage.sync.set({idToHide: clicked_id}, function() { + for (var item of chatBody.children) { + if (item.dataset.peer == clicked_id) { + item.style.display = "none"; + } + } + + console.log('idToHide: ' + clicked_id); + }); + }); + } else if (actionsArea.lastChild.className == "mute_message") { + clearInterval(controlsInterval); + } + } + } + } +}, 200); diff --git a/hide_element.js b/hide_element.js index 9ba35d2..43f8dd6 100644 --- a/hide_element.js +++ b/hide_element.js @@ -1,27 +1,37 @@ var idToHide; -function hidePeer(peer) { - chrome.storage.sync.get('idToHide', function(data) { - idToHide = data.idToHide - }); - - chrome.storage.sync.get('isExtensionOn', function(data) { - if (data.isExtensionOn) { - var x = document.querySelectorAll('[data-peer="'+peer+'"]'); - - x.forEach( - function(val) { - val.style.display = "none"; - } - ) - } - }); -} - -//var interval = window.setInterval(function(){ hidePeer(idToHide) }, 500); - var chatBody = document.getElementsByClassName("_im_peer_history im-page-chat-contain")[0]; -chatBody.addEventListener('DOMNodeInserted', function() { - hidePeer(idToHide); +chatBody.addEventListener('DOMNodeInserted', function(event) { + if (event.target.className == 'im-mess-stack _im_mess_stack ') { + chrome.storage.sync.get('idToHide', function(data) { + idToHide = data.idToHide; + }); + + chrome.storage.sync.get('isExtensionOn', function(data) { + if (data.isExtensionOn) { + if (event.target.dataset.peer == idToHide) { + event.target.style.display = "none"; + } + } + }); + } }); + +chrome.storage.sync.get('idToHide', function(data) { + idToHide = data.idToHide; +}); + +// Try to hide until successful. Needed for page refresh. +var hideInterval = setInterval(function () { + var chatBody = document.getElementsByClassName("_im_peer_history im-page-chat-contain")[0]; + for (var item of chatBody.children) { + if (item.dataset.peer == idToHide) { + if (item.style.display != "none") { + item.style.display = "none"; + } else { + clearInterval(hideInterval); + } + } + } +}, 200); diff --git a/manifest.json b/manifest.json index 36940b3..0f65ee1 100644 --- a/manifest.json +++ b/manifest.json @@ -1,32 +1,34 @@ { - "name": "VK Mute", - "icons": { - "140": "icons/icon140.png", - "128": "icons/icon128.png", - "48": "icons/icon48.png" - }, - "version": "1.0", - "description": "Позволяет заглушить нежелаемых собеседников", - "permissions": ["activeTab", "declarativeContent", "storage"], - "background": { - "scripts": [ - "background.js" - ], - "persistent": false - }, - "page_action": { - "default_popup": "popup.html" - }, - "manifest_version": 2, - "content_scripts": [ - { - "matches": ["https://*.vk.com/*"], - "js": ["hide_element.js"] + "name": "VK Mute", + "icons": { + "140": "icons/icon140.png", + "128": "icons/icon128.png", + "48": "icons/icon48.png" }, - { - "matches": ["https://*.vk.com/im*"], - "js": ["controls.js"], - "css": ["controls.css"] - } - ] + "version": "1.0", + "description": "Позволяет заглушить нежелаемых собеседников", + "permissions": [ + "activeTab", + "declarativeContent", + "storage" + ], + "background": { + "scripts": ["background.js"], + "persistent": false + }, + "page_action": { + "default_popup": "popup.html" + }, + "manifest_version": 2, + "content_scripts": [ + { + "matches": ["https://*.vk.com/im*"], + "js": ["hide_element.js"] + }, + { + "matches": ["https://*.vk.com/im*"], + "js": ["controls.js"], + "css": ["controls.css"] + } + ] } diff --git a/popup.js b/popup.js index 8a2d267..83d47a9 100644 --- a/popup.js +++ b/popup.js @@ -9,30 +9,37 @@ var enableText = "Кринж офф"; var disableText = "Кринж он"; chrome.storage.sync.get('isExtensionOn', function(data) { - isExtensionOn = data.isExtensionOn; + isExtensionOn = data.isExtensionOn; - disableCheckbox.checked = isExtensionOn; - if (isExtensionOn) { - status.innerHTML = enableText; - } else { - status.innerHTML = disableText; - } + disableCheckbox.checked = isExtensionOn; + if (isExtensionOn) { + status.innerHTML = enableText; + } else { + status.innerHTML = disableText; + } }); chrome.storage.sync.get('idToHide', function(data) { - idToHide = data.idToHide; - idToHideDisplay.innerText = idToHide; + idToHide = data.idToHide; + idToHideDisplay.innerText = idToHide; }); disableCheckbox.addEventListener('change', (event) => { - isExtensionOn = event.target.checked; - if (event.target.checked) { - status.innerHTML = enableText; - } else { - status.innerHTML = disableText; - } + isExtensionOn = event.target.checked; + if (event.target.checked) { + status.innerHTML = enableText; + } else { + status.innerHTML = disableText; + } - chrome.storage.sync.set({isExtensionOn: isExtensionOn}, function() { - console.log('isExtensionOn: '+isExtensionOn); - }); + chrome.storage.sync.set({isExtensionOn: isExtensionOn}, function() { + console.log('isExtensionOn: '+isExtensionOn); + }); +}); + +idToHideDisplay.addEventListener('click', function() { + chrome.storage.sync.set({idToHide: ''}, function() { + idToHideDisplay.innerText = ''; + console.log('Cleared idToHide'); + }); });