Исправлена страница настроек

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-06-25 15:53:12 +10:00
parent 877cd4ca1d
commit 7815b0c348
3 changed files with 75 additions and 87 deletions

View File

@ -52,7 +52,7 @@
"webRequestBlocking" "webRequestBlocking"
], ],
"options_ui": { "options_ui": {
"page": "/system/settings/index.html" "page": "/settings/index.html"
}, },
"content_scripts": [ "content_scripts": [
{ {
@ -60,10 +60,10 @@
"https://*.vk.com/*" "https://*.vk.com/*"
], ],
"js": [ "js": [
"/system/log.js", "/log.js",
"/system/settings.js", "/settings.js",
"/system/core.js", "/core.js",
"/system/modules/module.js" "/modules/module.js"
], ],
"run_at": "document_start" "run_at": "document_start"
}, },
@ -72,8 +72,18 @@
"https://*.vk.com/*" "https://*.vk.com/*"
], ],
"js": [ "js": [
"/system/modules/visor/core.js", "/modules/visor/core.js",
"/system/modules/killer/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" "run_at": "document_end"
}, },
@ -82,7 +92,7 @@
"https://vk.com/settings?act=nadrez" "https://vk.com/settings?act=nadrez"
], ],
"js": [ "js": [
"/system/pages/settings/index.js" "/pages/settings/index.js"
], ],
"run_at": "document_end" "run_at": "document_end"
}, },
@ -91,7 +101,7 @@
"https://vk.com/im?sel=*" "https://vk.com/im?sel=*"
], ],
"js": [ "js": [
"/system/modules/killer/conversation.js" "/modules/killer/conversation.js"
], ],
"run_at": "document_end" "run_at": "document_end"
} }

View File

@ -5,42 +5,6 @@
*/ */
class killer { class killer {
constructor() { 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 Группа для обработки * @param {string} group Группа для обработки
* *
* @return {bool} Статус выполнения * @return {bool} Статус выполнения
*
* @todo 1. Добавить режим в котором проверяется не каждая группа сообщений, а
* сначала читаются все найденные группы сообщений и только потом обрабатываются все вместе
*/ */
this.tribunal = async function (group = this.last(), list = this.list()) { 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} Количество обработанных групп сообщений * @return {number} Количество обработанных групп сообщений
*/ */
this.genocide = async function () { this.genocide = async function () {
@ -103,6 +72,8 @@ class killer {
/** /**
* Найти элемент-оболочку групп сообщений * Найти элемент-оболочку групп сообщений
* *
* Элемент хранит в себе все группы сообщений (окно чата)
*
* @return {Element} Оболочка групп сообщений * @return {Element} Оболочка групп сообщений
*/ */
this.wrap = function () { this.wrap = function () {
@ -112,6 +83,14 @@ class killer {
/** /**
* Найти последнюю группу сообщений * Найти последнюю группу сообщений
* *
* Группа сообщений - элемент-оболочка в котором хранятся
* сообщения от одного и того же пользователя. Группу сообщений
* закрывает сообщение от другого пользователя или прохождение
* некоторого времени, таким образом будет создана отдельная группа.
*
* Определить группы можно по аватарам пользователей (у каждой группы
* аватар отправителя отображается только 1 раз)
*
* @return {Element} Группа сообщений, если найдена * @return {Element} Группа сообщений, если найдена
*/ */
this.last = function () { this.last = function () {
@ -125,9 +104,9 @@ class killer {
} }
/** /**
* Найти и прочитать пользователя последней группы сообщений * Найти и прочитать пользователя группы сообщений
* *
* @param {string} group Группа для обработки * @param {string} group Группа для обработки (иначе самая последняя, новая)
* *
* @return {number} Идентификатор страницы ВКонтакте (только цифры) * @return {number} Идентификатор страницы ВКонтакте (только цифры)
*/ */
@ -141,13 +120,20 @@ class killer {
/** /**
* Прочитать список аккаунтов на удаление из реестра * Прочитать список аккаунтов на удаление из реестра
* *
* Реестр очищается через определённое в настройках время
* он должен быть маленьким, чтобы не проводить длительные поиски аккаунта,
* но при этом он должен быть большим, чтобы проверять каждого пользователя
* в чате слишком часто, что ещё хуже, посколько выполняет отдельный запрос
* и ищет данные о нахождении в чёрном списке.
*
* Реестр может хранить в себе данные об аккаунтах записанных туда непосредственно,
* то есть аккаунты не обязательно находятся в чёрном списке
*
* @return {object} Список аккаунтов на удаление * @return {object} Список аккаунтов на удаление
*/ */
this.list = async function () { this.list = async function () {
// Инициализация списка аккаунтов на удаление // Инициализация списка аккаунтов на удаление
const targets = await settings.read('killer_targets'); return await settings.read('killer_targets');
return targets;
} }
/** /**
@ -156,42 +142,32 @@ class killer {
* @param {number} account Аккаунт для обработки * @param {number} account Аккаунт для обработки
* *
* @return {boolean} Статус наличия аккаунта в списке на удаление * @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()) { if (account === this.self()) {
// Обрабатывается свой аккаунт // Обрабатывается свой аккаунт
// Инициализация статуса разрешения блокировки самого себя // Инициализация статуса разрешения блокировки самого себя
const self = await settings.read('killer_self'); return await settings.read('killer_self') ?? false;
return self ?? false;
} }
console.log(targets); if (typeof await targets === 'object') {
if (typeof targets === 'object') {
// Пройдена проверка на тип // Пройдена проверка на тип
if (Object.keys(targets).length >= await settings.read('killer_targets_limit') ?? 500) { if (Object.keys(targets).length >= await settings.read('killer_targets_limit') ?? 500) {
// Достигло ограничения количество аккаунтов в реестре // Достигло ограничения количество аккаунтов в реестре
// Полная очистка реестра // Реинициализация реестра
this.purge(); this.purge();
} else { } else {
// Не достигло ограничения rоличество аккаунтов в ресстре // Не достигло ограничения rоличество аккаунтов в ресстре
for (const { target, status } in targets) { // Перебор искомых целей для удаления
// Перебор искомых целей для удаления for (const target in targets) if (+target === +account) return true;
alert(target);
alert(status);
if (target === account) {
// Найдена цель
return true;
}
}
} }
} else { } else {
// Не пройдена проверка на тип и пустоту // Не пройдена проверка на тип и пустоту
@ -324,11 +300,8 @@ class killer {
// Инициализация кнопки "Заблокировать пользователя" // Инициализация кнопки "Заблокировать пользователя"
const button = page.body.querySelector('a[data-task-click="ProfileAction/toggle_blacklist"]'); const button = page.body.querySelector('a[data-task-click="ProfileAction/toggle_blacklist"]');
// Проверка на инициализированность кнопки
if (typeof button === 'null') return false;
// Возвращает true если заблокирован пользователь (подразумевается наличие текста "Разблокировать {пользователь}") // Возвращает true если заблокирован пользователь (подразумевается наличие текста "Разблокировать {пользователь}")
return button.innerText.trim()[0] === 'Р'; return (button.innerText.trim()[0] === 'Р') ?? false;
} }
/** /**
@ -340,18 +313,18 @@ class killer {
* *
* @todo Доделать * @todo Доделать
*/ */
this.forgive = async function (account, targets = await this.list()) { this.forgive = async function (account, targets) {
if (typeof account !== 'undefined' && typeof account !== 'null') { if (typeof account !== 'undefined' && typeof account !== 'null') {
// Пройдена проверка полученных значений аргументов // Пройдена проверка полученных значений аргументов
// Инициализация буфера записи в хранилище // Инициализация буфера записи в хранилище
let buffer = {}; let buffer = {};
for (const { target, status } in targets) { for (const target in targets) {
// Перебор заблокированных аккаунтов // Перебор заблокированных аккаунтов
// Проверка на совпадение // Проверка на совпадение
if (target === account) continue; if (+target === +account) continue;
// Запись в буфер записи в хранилище // Запись в буфер записи в хранилище
buffer.push(account); buffer.push(account);

View File

@ -87,7 +87,6 @@ class page {
this.blocks.fields.checkbox('target', 'list', 'Отдельный список на удаление', 'Выбрать пользователей вручную'), this.blocks.fields.checkbox('target', 'list', 'Отдельный список на удаление', 'Выбрать пользователей вручную'),
modules.killer.list('asdasd'), 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 => { settings.read(id).then(result => {
// Инициализация оболочки кнопки активации // Инициализация оболочки кнопки активации
@ -345,12 +344,14 @@ class page {
// Активирована // Активирована
if (settings.write(group + '_' + id, false)) { if (settings.write(group + '_' + id, false)) {
// Записан статус активации // Записан статус активации
// Запуск анимации и переход в состояние деактивации // Запуск анимации и переход в состояние деактивации
button.classList.remove('on'); button.classList.remove('on');
settings.read(group + '_' + id).then(result => { settings.read(group + '_' + id).then(result => {
if (result[group + '_' + id] === false) { if (result === false) {
// Сохранены изменения // Сохранены изменения
// Запуск анимации // Запуск анимации
status.style.transition = '0.5s'; status.style.transition = '0.5s';
status.style.opacity = 1; status.style.opacity = 1;
@ -365,12 +366,14 @@ class page {
// Деактивирована // Деактивирована
if (settings.write(group + '_' + id, true)) { if (settings.write(group + '_' + id, true)) {
// Записан статус активации // Записан статус активации
// Запуск анимации и переход в состояние активации // Запуск анимации и переход в состояние активации
button.classList.add('on'); button.classList.add('on');
settings.read(group + '_' + id).then(result => { settings.read(group + '_' + id).then(result => {
if (result[group + '_' + id] === true) { if (result === true) {
// Сохранены изменения // Сохранены изменения
// Запуск анимации // Запуск анимации
status.style.transition = '0.5s'; status.style.transition = '0.5s';
status.style.opacity = 1; status.style.opacity = 1;
@ -387,7 +390,7 @@ class page {
// Инициализация разделителя кнопки активации // Инициализация разделителя кнопки активации
let separator = document.createElement('div'); let separator = document.createElement('div');
separator.classList.add('settings_separated_row_extra'); 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'); let button = document.createElement('div');
@ -399,8 +402,9 @@ class page {
settings.read(group + '_' + id).then(result => { settings.read(group + '_' + id).then(result => {
// Получены данные о значении настройки // Получены данные о значении настройки
// Запись состояния // Запись состояния
if (result[group + '_' + id]) if (result)
checkbox.classList.add('on'); checkbox.classList.add('on');
}); });
@ -424,6 +428,7 @@ class page {
if (description !== undefined && typeof description === 'string') { if (description !== undefined && typeof description === 'string') {
// Получено описание // Получено описание
// Инициализация текста описания кнопки активации // Инициализация текста описания кнопки активации
let text = document.createElement('div'); let text = document.createElement('div');
text.classList.add('settings_separated_row_hint'); text.classList.add('settings_separated_row_hint');