Исправлена страница настроек
This commit is contained in:
parent
877cd4ca1d
commit
7815b0c348
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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');
|
||||||
|
|
Loading…
Reference in New Issue