diff --git a/firefox/manifest.json b/firefox/manifest.json index b81c229..a1ee8e5 100644 --- a/firefox/manifest.json +++ b/firefox/manifest.json @@ -52,7 +52,7 @@ "webRequestBlocking" ], "options_ui": { - "page": "/system/settings/index.html" + "page": "/settings/index.html" }, "content_scripts": [ { @@ -60,10 +60,10 @@ "https://*.vk.com/*" ], "js": [ - "/system/log.js", - "/system/settings.js", - "/system/core.js", - "/system/modules/module.js" + "/log.js", + "/settings.js", + "/core.js", + "/modules/module.js" ], "run_at": "document_start" }, @@ -72,8 +72,18 @@ "https://*.vk.com/*" ], "js": [ - "/system/modules/visor/core.js", - "/system/modules/killer/core.js" + "/modules/visor/core.js", + "/modules/killer/core.js" + ], + "run_at": "document_end" + }, + { + "matches": [ + "https://vk.com/*" + ], + "js": [ + "/modules/visor/core.js", + "/modules/killer/core.js" ], "run_at": "document_end" }, @@ -82,7 +92,7 @@ "https://vk.com/settings?act=nadrez" ], "js": [ - "/system/pages/settings/index.js" + "/pages/settings/index.js" ], "run_at": "document_end" }, @@ -91,7 +101,7 @@ "https://vk.com/im?sel=*" ], "js": [ - "/system/modules/killer/conversation.js" + "/modules/killer/conversation.js" ], "run_at": "document_end" } diff --git a/firefox/modules/killer/core.js b/firefox/modules/killer/core.js index 3615885..2014a76 100644 --- a/firefox/modules/killer/core.js +++ b/firefox/modules/killer/core.js @@ -5,42 +5,6 @@ */ class killer { constructor() { - // /** - // * Генерация списка пользователей - // * - // * @param {string} id Идентификатор - // * @param {string} page Идентификатор страницы настроек - // * - // * @return {Function} Функция для выполнения в генераторе группы - // */ - // this.list = function (id, page = 'nadrez') { - // /** - // * Запись в группу (подразумевается выполнение в функции генерирующую группу) - // * - // * @param {string} group Группа - // * - // * @return {bool} Статус выполнения - // */ - // return function (group) { - // if (typeof page === 'string' && typeof id === 'string' && typeof group === 'string') { - // // Пройдена проверка входных параметров - - // // Инициализация блока - // let block = document.getElementById('block_' + group); - - // // Инициализация верхнего колонтинула блока - // let header = block.getElementsByClassName('page_block_header')[0]; - - // // Инициализация элемента со статусом - // let status = header.getElementsByClassName('page_block_saved')[0]; - - // // Инициализация тела блока - // let body = block.getElementsByClassName('settings_panel clear_fix settings_' + core.id + ' settings_section_' + core.id)[0]; - // } - // return false; - // } - // } - /** * Обработка группы сообщений * @@ -49,9 +13,12 @@ class killer { * @param {string} group Группа для обработки * * @return {bool} Статус выполнения + * + * @todo 1. Добавить режим в котором проверяется не каждая группа сообщений, а + * сначала читаются все найденные группы сообщений и только потом обрабатываются все вместе */ this.tribunal = async function (group = this.last(), list = this.list()) { - if (await this.search(this.account(group), this.list())) { + if (await this.search(await this.account(group), await list)) { // Найдена цель на удаление // Инициализация типа действия с группой сообщений заблокированного аккаунта @@ -78,6 +45,8 @@ class killer { /** * Обработка всех видимых групп сообщений * + * Все сообщения загруженные в документе будут обработаны + * * @return {number} Количество обработанных групп сообщений */ this.genocide = async function () { @@ -103,6 +72,8 @@ class killer { /** * Найти элемент-оболочку групп сообщений * + * Элемент хранит в себе все группы сообщений (окно чата) + * * @return {Element} Оболочка групп сообщений */ this.wrap = function () { @@ -112,6 +83,14 @@ class killer { /** * Найти последнюю группу сообщений * + * Группа сообщений - элемент-оболочка в котором хранятся + * сообщения от одного и того же пользователя. Группу сообщений + * закрывает сообщение от другого пользователя или прохождение + * некоторого времени, таким образом будет создана отдельная группа. + * + * Определить группы можно по аватарам пользователей (у каждой группы + * аватар отправителя отображается только 1 раз) + * * @return {Element} Группа сообщений, если найдена */ this.last = function () { @@ -125,9 +104,9 @@ class killer { } /** - * Найти и прочитать пользователя последней группы сообщений + * Найти и прочитать пользователя группы сообщений * - * @param {string} group Группа для обработки + * @param {string} group Группа для обработки (иначе самая последняя, новая) * * @return {number} Идентификатор страницы ВКонтакте (только цифры) */ @@ -141,13 +120,20 @@ class killer { /** * Прочитать список аккаунтов на удаление из реестра * + * Реестр очищается через определённое в настройках время + * он должен быть маленьким, чтобы не проводить длительные поиски аккаунта, + * но при этом он должен быть большим, чтобы проверять каждого пользователя + * в чате слишком часто, что ещё хуже, посколько выполняет отдельный запрос + * и ищет данные о нахождении в чёрном списке. + * + * Реестр может хранить в себе данные об аккаунтах записанных туда непосредственно, + * то есть аккаунты не обязательно находятся в чёрном списке + * * @return {object} Список аккаунтов на удаление */ this.list = async function () { // Инициализация списка аккаунтов на удаление - const targets = await settings.read('killer_targets'); - - return targets; + return await settings.read('killer_targets'); } /** @@ -156,42 +142,32 @@ class killer { * @param {number} account Аккаунт для обработки * * @return {boolean} Статус наличия аккаунта в списке на удаление + * + * @todo 1. Возможно оно может асинхронно перезаписывать само себя когда сохраняет нового + * пользователя в реестр и сразу же после этого сохраняет реестр с другим пользователем без первого + * из-за того что оба процесса были запущены одновременно */ - this.search = async function (account = this.account(), targets = await this.list()) { + this.search = async function (account = this.account(), targets = this.list()) { if (account === this.self()) { // Обрабатывается свой аккаунт // Инициализация статуса разрешения блокировки самого себя - const self = await settings.read('killer_self'); - - return self ?? false; + return await settings.read('killer_self') ?? false; } - console.log(targets); - - if (typeof targets === 'object') { + if (typeof await targets === 'object') { // Пройдена проверка на тип if (Object.keys(targets).length >= await settings.read('killer_targets_limit') ?? 500) { // Достигло ограничения количество аккаунтов в реестре - // Полная очистка реестра + // Реинициализация реестра this.purge(); } else { // Не достигло ограничения rоличество аккаунтов в ресстре - for (const { target, status } in targets) { - // Перебор искомых целей для удаления - - alert(target); - alert(status); - - if (target === account) { - // Найдена цель - - return true; - } - } + // Перебор искомых целей для удаления + for (const target in targets) if (+target === +account) return true; } } else { // Не пройдена проверка на тип и пустоту @@ -324,11 +300,8 @@ class killer { // Инициализация кнопки "Заблокировать пользователя" const button = page.body.querySelector('a[data-task-click="ProfileAction/toggle_blacklist"]'); - // Проверка на инициализированность кнопки - if (typeof button === 'null') return false; - // Возвращает true если заблокирован пользователь (подразумевается наличие текста "Разблокировать {пользователь}") - return button.innerText.trim()[0] === 'Р'; + return (button.innerText.trim()[0] === 'Р') ?? false; } /** @@ -340,18 +313,18 @@ class killer { * * @todo Доделать */ - this.forgive = async function (account, targets = await this.list()) { + this.forgive = async function (account, targets) { if (typeof account !== 'undefined' && typeof account !== 'null') { // Пройдена проверка полученных значений аргументов // Инициализация буфера записи в хранилище let buffer = {}; - for (const { target, status } in targets) { + for (const target in targets) { // Перебор заблокированных аккаунтов // Проверка на совпадение - if (target === account) continue; + if (+target === +account) continue; // Запись в буфер записи в хранилище buffer.push(account); diff --git a/firefox/pages/settings/index.js b/firefox/pages/settings/index.js index 18607d7..95856ac 100644 --- a/firefox/pages/settings/index.js +++ b/firefox/pages/settings/index.js @@ -87,7 +87,6 @@ class page { this.blocks.fields.checkbox('target', 'list', 'Отдельный список на удаление', 'Выбрать пользователей вручную'), modules.killer.list('asdasd'), ); - } /** @@ -321,16 +320,16 @@ class page { // Пройдена проверка входных параметров // Инициализация блока - let block = document.getElementById('block_' + group); + const block = document.getElementById('block_' + group); // Инициализация верхнего колонтинула блока - let header = block.getElementsByClassName('page_block_header')[0]; + const header = block.getElementsByClassName('page_block_header')[0]; // Инициализация элемента со статусом - let status = header.getElementsByClassName('page_block_saved')[0]; + const status = header.getElementsByClassName('page_block_saved')[0]; // Инициализация тела блока - let body = block.getElementsByClassName('settings_panel clear_fix settings_' + core.id + ' settings_section_' + core.id)[0]; + const body = block.getElementsByClassName('settings_panel clear_fix settings_' + core.id + ' settings_section_' + core.id)[0]; settings.read(id).then(result => { // Инициализация оболочки кнопки активации @@ -345,12 +344,14 @@ class page { // Активирована if (settings.write(group + '_' + id, false)) { // Записан статус активации + // Запуск анимации и переход в состояние деактивации button.classList.remove('on'); settings.read(group + '_' + id).then(result => { - if (result[group + '_' + id] === false) { + if (result === false) { // Сохранены изменения + // Запуск анимации status.style.transition = '0.5s'; status.style.opacity = 1; @@ -365,12 +366,14 @@ class page { // Деактивирована if (settings.write(group + '_' + id, true)) { // Записан статус активации + // Запуск анимации и переход в состояние активации button.classList.add('on'); settings.read(group + '_' + id).then(result => { - if (result[group + '_' + id] === true) { + if (result === true) { // Сохранены изменения + // Запуск анимации status.style.transition = '0.5s'; status.style.opacity = 1; @@ -387,7 +390,7 @@ class page { // Инициализация разделителя кнопки активации let separator = document.createElement('div'); separator.classList.add('settings_separated_row_extra'); - separator.checked = result[id] === true || result[id] === 1 || result[id] === '1' ? true : false; + separator.checked = result === true || result === 1 || result === '1' ? true : false; // Инициализация кнопки активации let button = document.createElement('div'); @@ -399,8 +402,9 @@ class page { settings.read(group + '_' + id).then(result => { // Получены данные о значении настройки + // Запись состояния - if (result[group + '_' + id]) + if (result) checkbox.classList.add('on'); }); @@ -424,6 +428,7 @@ class page { if (description !== undefined && typeof description === 'string') { // Получено описание + // Инициализация текста описания кнопки активации let text = document.createElement('div'); text.classList.add('settings_separated_row_hint');