! Tools

Профессиональный инструмент модератора для мгновенного перемещения тем между разделами. Умное меню, автоматические ответы, работа в один клик!

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         ! Tools
// @namespace    https://forum.blackrussia.online
// @version      1.0.6
// @description  Профессиональный инструмент модератора для мгновенного перемещения тем между разделами. Умное меню, автоматические ответы, работа в один клик!
// @author       Botir_Soliev | https://vk.com/id250006978
// @match        https://forum.blackrussia.online/threads/*
// @grant        none
// @icon         https://i.postimg.cc/sgKbLbj9/verify-icon-png.jpg
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';


    // Добавляем функцию addButton
    function addButton(name, id, style) {
        $('.button--icon--reply').before(
            `<button type="button" class="button--primary button rippleButton" id="${id}" style="${style}">${name}</button>`
        );
    }


    // Функция для создания FormData
    function getFormData(data) {
        const formData = new FormData();
        Object.entries(data).forEach(i => formData.append(i[0], i[1]));
        return formData;
    }

    // Функция для получения данных автора темы
    function getThreadData() {
        const authorElement = document.querySelector('a.username');
        if (!authorElement) return null;

        const authorID = authorElement.getAttribute('data-user-id');
        const authorName = authorElement.textContent;
        const hours = new Date().getHours();

        return {
            user: {
                id: authorID,
                name: authorName,
                mention: `[USER=${authorID}]${authorName}[/USER]`,
            },
            greeting: () =>
                4 < hours && hours <= 11 ?
                'Доброе утро, уважаемый(ая)' :
                11 < hours && hours <= 15 ?
                'Добрый день, уважаемый(ая)' :
                15 < hours && hours <= 21 ?
                'Добрый вечер, уважаемый(ая)' :
                'Доброй ночи, уважаемый(ая)',
        };
    }

    // Функция для получения названия категории из названия кнопки меню
    function getCategoryNameFromMenu(categoryName) {
        const categoryMap = {
            'Тех раздел': 'технический раздел',
            'ЖБ на техов': 'жалобы на технических специалистов',
            'Админы': 'жалобы на администрацию',
            'Лидеры': 'жалобы на лидеров',
            'Игроки': 'жалобы на игроков',
            'Обжалование': 'обжалование наказаний'
        };

        return categoryMap[categoryName] || categoryName;
    }

    // Функция для очистки названия сервера от цифр и скобок
    function cleanServerName(buttonTitle) {
        return buttonTitle.replace(/\s*\(\d+\)$/, '').trim();
    }

    // Функция для создания ответа в теме
    function createReply(message, callback) {
        const formData = new FormData();
        formData.append('message_html', message);
        formData.append('_xfToken', XF.config.csrf);
        formData.append('_xfRequestUri', window.location.pathname);
        formData.append('_xfWithData', '1');
        formData.append('_xfResponseType', 'json');

        fetch(`${window.location.href}add-reply`, {
            method: 'POST',
            body: formData,
            credentials: 'include',
            headers: {
                'X-Requested-With': 'XMLHttpRequest',
            }
        })
        .then(resp => resp.json())
        .then(data => {
            if (data.errors) {
                console.error('Ошибка при создании ответа:', data.errors);
                alert('Ошибка при создании ответа:\n' + data.errors.join('\n'));
                return;
            }
            console.log('Ответ успешно создан');
            if (callback) callback();
        })
        .catch(err => {
            console.error('Ошибка запроса при создании ответа:', err);
            alert('Ошибка запроса при создании ответа:\n' + err);
        });
    }

    // Функция для получения заголовка темы
    function getThreadTitle() {
        const titleElement = document.querySelector('.p-title-value');
        if (titleElement && titleElement.lastChild) {
            return titleElement.lastChild.textContent;
        }
        return 'Без названия';
    }

    // Функция для выполнения перемещения темы
    function performMove(task) {
        const threadTitle = getThreadTitle();

        fetch(`${document.URL}move`, {
            method: 'POST',
            body: getFormData({
                prefix_id: 0,
                title: threadTitle,
                target_node_id: task.move,
                redirect_type: 'none',
                notify_watchers: 1,
                starter_alert: 1,
                starter_alert_reason: "",
                _xfToken: XF.config.csrf,
                _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
                _xfWithData: 1,
                _xfResponseType: 'json',
            }),
        }).then(() => location.reload());
    }

    // Функция для перемещения темы
    function moveThread(task, category) {
        const threadData = getThreadData();
        if (!threadData) {
            alert('Не удалось получить данные автора темы');
            return;
        }

        // Если это кнопка "Заявки с окончательным ответом" или "Жалобы на технических специалистов" - не создаем ответ
        if (task.title === 'Заявки с окончательным ответом' || task.title === 'Жалобы на технических специалистов') {
            // Просто перемещаем тему без создания ответа
            performMove(task);
            return;
        }

        // Получаем красивые названия из названия категории меню
        const categoryName = getCategoryNameFromMenu(category.name);
        const serverName = cleanServerName(task.title);

        // Создаем красивое сообщение
        const message = `
[FONT=Verdana]${threadData.greeting()} ${threadData.user.mention}<br><br>
Данная тема не соответствует разделу, в котором она была создана.<br>
Переношу в корректный раздел: ${categoryName} сервера: ${serverName}<br><br>
[/FONT]
`.trim();

        // Сначала создаем ответ
        createReply(message, function() {
            // После создания ответа перемещаем тему
            performMove(task);
        });
    }

////////////////////////ТЕХНИЧЕСКИЙ РАЗДЕЛ////////////////////////
    const category1 = {
        name: 'Тех раздел',
        color: '#000080',
        text: '#FFFFFF',
        description: 'Перемещение тем в раздел "Технический раздел". Выберите нужный сервер из кнопок ниже',
        buttons: [
            { title: 'RED (1)', move: 226,},
            { title: 'GREEN (2)', move: 227,},
            { title: 'BLUE (3)', move: 228,},
            { title: 'YELLOW (4)', move: 229,},
            { title: 'ORANGE (5)', move: 245,},
            { title: 'PURPLE (6)', move: 325,},
            { title: 'LIME (7)', move: 365,},
            { title: 'PINK (8)', move: 396,},
            { title: 'CHERRY (9)', move: 408,},
            { title: 'BLACK (10)', move: 488,},
            { title: 'INDIGO (11)', move: 493,},
            { title: 'WHITE (12)', move: 554,},
            { title: 'MAGENTA (13)', move: 613,},
            { title: 'CRIMSON (14)', move: 653,},
            { title: 'GOLD (15)', move: 660,},
            { title: 'AZURE (16)', move: 701,},
            { title: 'PLATINUM (17)', move: 757,},
            { title: 'AQUA (18)', move: 815,},
            { title: 'GRAY (19)', move: 857,},
            { title: 'ICE (20)', move: 925,},
            { title: 'CHILLI (21)', move: 1007,},
            { title: 'CHOCO (22)', move: 1048,},
            { title: 'MOSCOW (23)', move: 1052,},
            { title: 'SPB (24)', move: 1095,},
            { title: 'UFA (25)', move: 1138,},
            { title: 'SOCHI (26)', move: 1248,},
            { title: 'KAZAN (27)', move: 1290,},
            { title: 'SAMARA (28)', move: 1292,},
            { title: 'ROSTOV (29)', move: 1334,},
            { title: 'ANAPA (30)', move: 1416,},
            { title: 'EKB (31)', move: 1458,},
            { title: 'KRASNODAR (32)', move: 1460,},
            { title: 'ARZAMAS (33)', move: 1502,},
            { title: 'NOVOSIBIRSK (34)', move: 1544,},
            { title: 'GROZNY (35)', move: 1586,},
            { title: 'SARATOV (36)', move: 1628,},
            { title: 'OMSK (37)', move: 1670,},
            { title: 'IRKUTSK (38)', move: 1712,},
            { title: 'VOLGOGRAD (39)', move: 1758,},
            { title: 'VORONEZH (40)', move: 1800,},
            { title: 'BELGOROD (41)', move: 1840,},
            { title: 'MAKHACHKALA (42)', move: 1884,},
            { title: 'VLADIKAVKAZ (43)', move: 1926,},
            { title: 'VLADIVOSTOK (44)', move: 1968,},
            { title: 'KALININGRAD (45)', move: 2010,},
            { title: 'CHELYABINSK (46)', move: 2052,},
            { title: 'KRASNOYARSK (47)', move: 2094,},
            { title: 'CHEBOKSARY (48)', move: 2136,},
            { title: 'KHABAROVSK (49)', move: 2178,},
            { title: 'PERM (50)', move: 2220,},
            { title: 'TULA (51)', move: 2262,},
            { title: 'RYAZAN (52)', move: 2304,},
            { title: 'MURMANSK (53)', move: 2346,},
            { title: 'PENZA (54)', move: 2388,},
            { title: 'KURSK (55)', move: 2430,},
            { title: 'ARKHANGELSK (56)', move: 2472,},
            { title: 'ORENBURG (57)', move: 2514,},
            { title: 'KIROV (58)', move: 2516,},
            { title: 'KEMEROVO (59)', move: 2598,},
            { title: 'TYUMEN (60)', move: 2639,},
            { title: 'TOLYATTI (61)', move: 2682,},
            { title: 'IVANOVO (62)', move: 2714,},
            { title: 'STAVROPOL (63)', move: 2747,},
            { title: 'SMOLENSK (64)', move: 2779,},
            { title: 'PSKOV (65)', move: 2811,},
            { title: 'BRYANSK (66)', move: 2843,},
            { title: 'OREL (67)', move: 2875,},
            { title: 'YAROSLAVL (68)', move: 2907,},
            { title: 'BARNAUL (69)', move: 2939,},
            { title: 'LIPETSK (70)', move: 2971,},
            { title: 'ULYANOVSK (71)', move: 3003,},
            { title: 'YAKUTSK (72)', move: 3035,},
            { title: 'TAMBOV (73)', move: 3289,},
            { title: 'BRATSK (74)', move: 3324,},
            { title: 'ASTRAKHAN (75)', move: 3359,},
            { title: 'CHITA (76)', move: 3394,},
            { title: 'KOSTROMA (77)', move: 3429,},
            { title: 'VLADIMIR (78)', move: 3464,},
            { title: 'KALUGA (79)', move: 3499,},
            { title: 'NOVGOROD (80)', move: 3535,},
            { title: 'TAGANROG (81)', move: 3570,},
            { title: 'VOLOGDA (82)', move: 3605,},
            { title: 'TVER (83)', move: 3643,},
            { title: 'TOMSK (84)', move: 3740,},
            { title: 'IZHEVSK (85)', move: 3747,},
            { title: 'SURGUT (86)', move: 3812,},
            { title: 'PODOLSK (87)', move: 3817,},
            { title: 'MAGADAN (88)', move: 3912,},
            { title: 'CHEREPOVETS (89)', move: 3978, },

            { title: 'Жалобы на технических специалистов', move: 490, color: '#FF0000', text: '#FFFFFF' },
            { title: 'Заявки с окончательным ответом', move: 230, color: '#FF0000', text: '#FFFFFF' } ] };

    const category2 = {
        name: 'ЖБ на техов',
        color: '#ff4500',
        text: '#000000',
        description: 'Перемещение тем в раздел "Жалобы на технических специалистов". Выберите нужный сервер из кнопок ниже',
        buttons: [
            { title: 'RED (1)', move: 1182,},
            { title: 'GREEN (2)', move: 1183,},
            { title: 'BLUE (3)', move: 1184,},
            { title: 'YELLOW (4)', move: 1185,},
            { title: 'ORANGE (5)', move: 1186,},
            { title: 'PURPLE (6)', move: 1187,},
            { title: 'LIME (7)', move: 1188,},
            { title: 'PINK (8)', move: 1189,},
            { title: 'CHERRY (9)', move: 1190,},
            { title: 'BLACK (10)', move: 1191,},
            { title: 'INDIGO (11)', move: 1192,},
            { title: 'WHITE (12)', move: 1193,},
            { title: 'MAGENTA (13)', move: 1194,},
            { title: 'CRIMSON (14)', move: 1195,},
            { title: 'GOLD (15)', move: 1196,},
            { title: 'AZURE (16)', move: 1197,},
            { title: 'PLATINUM (17)', move: 1198,},
            { title: 'AQUA (18)', move: 1199,},
            { title: 'GRAY (19)', move: 1200,},
            { title: 'ICE (20)', move: 1201,},
            { title: 'CHILLI (21)', move: 1202,},
            { title: 'CHOCO (22)', move: 1203,},
            { title: 'MOSCOW (23)', move: 1204,},
            { title: 'SPB (24)', move: 1205,},
            { title: 'UFA (25)', move: 1206,},
            { title: 'SOCHI (26)', move: 1247,},
            { title: 'KAZAN (27)', move: 1289,},
            { title: 'SAMARA (28)', move: 1291,},
            { title: 'ROSTOV (29)', move: 1333,},
            { title: 'ANAPA (30)', move: 1415,},
            { title: 'EKB (31)', move: 1457,},
            { title: 'KRASNODAR (32)', move: 1459,},
            { title: 'ARZAMAS (33)', move: 1501,},
            { title: 'NOVOSIBIRSK (34)', move: 1543,},
            { title: 'GROZNY (35)', move: 1585,},
            { title: 'SARATOV (36)', move: 1627,},
            { title: 'OMSK (37)', move: 1669,},
            { title: 'IRKUTSK (38)', move: 1711,},
            { title: 'VOLGOGRAD (39)', move: 1757,},
            { title: 'VORONEZH (40)', move: 1801,},
            { title: 'BELGOROD (41)', move: 1841,},
            { title: 'MAKHACHKALA (42)', move: 1883,},
            { title: 'VLADIKAVKAZ (43)', move: 1925,},
            { title: 'VLADIVOSTOK (44)', move: 1967,},
            { title: 'KALININGRAD (45)', move: 2009,},
            { title: 'CHELYABINSK (46)', move: 2051,},
            { title: 'KRASNOYARSK (47)', move: 2093,},
            { title: 'CHEBOKSARY (48)', move: 2135,},
            { title: 'KHABAROVSK (49)', move: 2177,},
            { title: 'PERM (50)', move: 2219,},
            { title: 'TULA (51)', move: 2261,},
            { title: 'RYAZAN (52)', move: 2303,},
            { title: 'MURMANSK (53)', move: 2345,},
            { title: 'PENZA (54)', move: 2387,},
            { title: 'KURSK (55)', move: 2429,},
            { title: 'ARKHANGELSK (56)', move: 2471,},
            { title: 'ORENBURG (57)', move: 2513,},
            { title: 'KIROV (58)', move: 2515,},
            { title: 'KEMEROVO (59)', move: 2597,},
            { title: 'TYUMEN (60)', move: 2640,},
            { title: 'TOLYATTI (61)', move: 2681,},
            { title: 'IVANOVO (62)', move: 2713,},
            { title: 'STAVROPOL (63)', move: 2746,},
            { title: 'SMOLENSK (64)', move: 2778,},
            { title: 'PSKOV (65)', move: 2810,},
            { title: 'BRYANSK (66)', move: 2842,},
            { title: 'OREL (67)', move: 2874,},
            { title: 'YAROSLAVL (68)', move: 2906,},
            { title: 'BARNAUL (69)', move: 2938,},
            { title: 'LIPETSK (70)', move: 2970,},
            { title: 'ULYANOVSK (71)', move: 3002,},
            { title: 'YAKUTSK (72)', move: 3034,},
            { title: 'TAMBOV (73)', move: 3288,},
            { title: 'BRATSK (74)', move: 3323,},
            { title: 'ASTRAKHAN (75)', move: 3358,},
            { title: 'CHITA (76)', move: 3393,},
            { title: 'KOSTROMA (77)', move: 3428,},
            { title: 'VLADIMIR (78)', move: 3463,},
            { title: 'KALUGA (79)', move: 3498,},
            { title: 'NOVGOROD (80)', move: 3533,},
            { title: 'TAGANROG (81)', move: 3569,},
            { title: 'VOLOGDA (82)', move: 3604,},
            { title: 'TVER (83)', move: 3642,},
            { title: 'TOMSK (84)', move: 3739,},
            { title: 'IZHEVSK (85)', move: 3746,},
            { title: 'SURGUT (86)', move: 3811,},
            { title: 'PODOLSK (87)', move: 3816,},
            { title: 'MAGADAN (88)', move: 3911,},
            { title: 'CHEREPOVETS (89)', move: 3946, },

            { title: 'Жалобы на технических специалистов', move: 490, color: '#FF0000', text: '#FFFFFF' },
            { title: 'Заявки с окончательным ответом', move: 230, color: '#FF0000', text: '#FFFFFF' } ] };

////////////////////////ЖАЛОБЫ НА АДМИНОВ////////////////////////
    const category3 = {
        name: 'Админы',
        color: '#8B008B',
        text: '#FFFFFF',
        description: 'Перемещение тем в раздел "Жалобы на администрацию". Выберите нужный сервер из кнопок ниже',
        buttons: [
            { title: 'RED (1)', move: 86,},
            { title: 'GREEN (2)', move: 117,},
            { title: 'BLUE (3)', move: 154,},
            { title: 'YELLOW (4)', move: 192,},
            { title: 'ORANGE (5)', move: 271,},
            { title: 'PURPLE (6)', move: 310,},
            { title: 'LIME (7)', move: 350,},
            { title: 'PINK (8)', move: 392,},
            { title: 'CHERRY (9)', move: 433,},
            { title: 'BLACK (10)', move: 468,},
            { title: 'INDIGO (11)', move: 517,},
            { title: 'WHITE (12)', move: 558,},
            { title: 'MAGENTA (13)', move: 597,},
            { title: 'CRIMSON (14)', move: 638,},
            { title: 'GOLD (15)', move: 680,},
            { title: 'AZURE (16)', move: 721,},
            { title: 'PLATINUM (17)', move: 783,},
            { title: 'AQUA (18)', move: 842,},
            { title: 'GRAY (19)', move: 883,},
            { title: 'ICE (20)', move: 952,},
            { title: 'CHILLI (21)', move: 992,},
            { title: 'CHOCO (22)', move: 1034,},
            { title: 'MOSCOW (23)', move: 1080,},
            { title: 'SPB (24)', move: 1122,},
            { title: 'UFA (25)', move: 1165,},
            { title: 'SOCHI (26)', move: 1232,},
            { title: 'KAZAN (27)', move: 1274,},
            { title: 'SAMARA (28)', move: 1318,},
            { title: 'ROSTOV (29)', move: 1360,},
            { title: 'ANAPA (30)', move: 1400,},
            { title: 'EKB (31)', move: 1442,},
            { title: 'KRASNODAR (32)', move: 1486,},
            { title: 'ARZAMAS (33)', move: 1529,},
            { title: 'NOVOSIBIRSK (34)', move: 1570,},
            { title: 'GROZNY (35)', move: 1612,},
            { title: 'SARATOV (36)', move: 1654,},
            { title: 'OMSK (37)', move: 1696,},
            { title: 'IRKUTSK (38)', move: 1738,},
            { title: 'VOLGOGRAD (39)', move: 1784,},
            { title: 'VORONEZH (40)', move: 1826,},
            { title: 'BELGOROD (41)', move: 1868,},
            { title: 'MAKHACHKALA (42)', move: 1910,},
            { title: 'VLADIKAVKAZ (43)', move: 1952,},
            { title: 'VLADIVOSTOK (44)', move: 1994,},
            { title: 'KALININGRAD (45)', move: 2036,},
            { title: 'CHELYABINSK (46)', move: 2078,},
            { title: 'KRASNOYARSK (47)', move: 2120,},
            { title: 'CHEBOKSARY (48)', move: 2162,},
            { title: 'KHABAROVSK (49)', move: 2204,},
            { title: 'PERM (50)', move: 2246,},
            { title: 'TULA (51)', move: 2288,},
            { title: 'RYAZAN (52)', move: 2330,},
            { title: 'MURMANSK (53)', move: 2372,},
            { title: 'PENZA (54)', move: 2414,},
            { title: 'KURSK (55)', move: 2456,},
            { title: 'ARKHANGELSK (56)', move: 2498,},
            { title: 'ORENBURG (57)', move: 2543,},
            { title: 'KIROV (58)', move: 2582,},
            { title: 'KEMEROVO (59)', move: 2624,},
            { title: 'TYUMEN (60)', move: 2661,},
            { title: 'TOLYATTI (61)', move: 2700,},
            { title: 'IVANOVO (62)', move: 2733,},
            { title: 'STAVROPOL (63)', move: 2765,},
            { title: 'SMOLENSK (64)', move: 2797,},
            { title: 'PSKOV (65)', move: 2829,},
            { title: 'BRYANSK (66)', move: 2861,},
            { title: 'OREL (67)', move: 2893,},
            { title: 'YAROSLAVL (68)', move: 2925,},
            { title: 'BARNAUL (69)', move: 2957,},
            { title: 'LIPETSK (70)', move: 2989,},
            { title: 'ULYANOVSK (71)', move: 3021,},
            { title: 'YAKUTSK (72)', move: 3053,},
            { title: 'TAMBOV (73)', move: 3307,},
            { title: 'BRATSK (74)', move: 3342,},
            { title: 'ASTRAKHAN (75)', move: 3377,},
            { title: 'CHITA (76)', move: 3412,},
            { title: 'KOSTROMA (77)', move: 3447,},
            { title: 'VLADIMIR (78)', move: 3482,},
            { title: 'KALUGA (79)', move: 3517,},
            { title: 'NOVGOROD (80)', move: 3553,},
            { title: 'TAGANROG (81)', move: 3588,},
            { title: 'VOLOGDA (82)', move: 3623,},
            { title: 'TVER (83)', move: 3664,},
            { title: 'TOMSK (84)', move: 3726,},
            { title: 'IZHEVSK (85)', move: 3765,},
            { title: 'SURGUT (86)', move: 3798,},
            { title: 'PODOLSK (87)', move: 3835,},
            { title: 'MAGADAN (88)', move: 3930,},
            { title: 'CHEREPOVETS (89)', move: 3965, }, ] };

////////////////////////ЖАЛОБЫ НА ЛИДЕРОВ////////////////////////
    const category4 = {
        name: 'Лидеры',
        color: '#20B2AA',
        text: '#FFFFFF',
        description: 'Перемещение тем в раздел "Жалобы на лидеров". Выберите нужный сервер из кнопок ниже',
        buttons: [
            { title: 'RED (1)', move: 87,},
            { title: 'GREEN (2)', move: 118,},
            { title: 'BLUE (3)', move: 155,},
            { title: 'YELLOW (4)', move: 193,},
            { title: 'ORANGE (5)', move: 272,},
            { title: 'PURPLE (6)', move: 311,},
            { title: 'LIME (7)', move: 351,},
            { title: 'PINK (8)', move: 393,},
            { title: 'CHERRY (9)', move: 434,},
            { title: 'BLACK (10)', move: 469,},
            { title: 'INDIGO (11)', move: 518,},
            { title: 'WHITE (12)', move: 559,},
            { title: 'MAGENTA (13)', move: 598,},
            { title: 'CRIMSON (14)', move: 639,},
            { title: 'GOLD (15)', move: 681,},
            { title: 'AZURE (16)', move: 722,},
            { title: 'PLATINUM (17)', move: 784,},
            { title: 'AQUA (18)', move: 843,},
            { title: 'GRAY (19)', move: 884,},
            { title: 'ICE (20)', move: 953,},
            { title: 'CHILLI (21)', move: 993,},
            { title: 'CHOCO (22)', move: 1035,},
            { title: 'MOSCOW (23)', move: 1081,},
            { title: 'SPB (24)', move: 1123,},
            { title: 'UFA (25)', move: 1166,},
            { title: 'SOCHI (26)', move: 1233,},
            { title: 'KAZAN (27)', move: 1275,},
            { title: 'SAMARA (28)', move: 1319,},
            { title: 'ROSTOV (29)', move: 1361,},
            { title: 'ANAPA (30)', move: 1401,},
            { title: 'EKB (31)', move: 1443,},
            { title: 'KRASNODAR (32)', move: 1487,},
            { title: 'ARZAMAS (33)', move: 1530,},
            { title: 'NOVOSIBIRSK (34)', move: 1571,},
            { title: 'GROZNY (35)', move: 1613,},
            { title: 'SARATOV (36)', move: 1655,},
            { title: 'OMSK (37)', move: 1697,},
            { title: 'IRKUTSK (38)', move: 1739,},
            { title: 'VOLGOGRAD (39)', move: 1785,},
            { title: 'VORONEZH (40)', move: 1827,},
            { title: 'BELGOROD (41)', move: 1869,},
            { title: 'MAKHACHKALA (42)', move: 1911,},
            { title: 'VLADIKAVKAZ (43)', move: 1953,},
            { title: 'VLADIVOSTOK (44)', move: 1995,},
            { title: 'KALININGRAD (45)', move: 2037,},
            { title: 'CHELYABINSK (46)', move: 2079,},
            { title: 'KRASNOYARSK (47)', move: 2121,},
            { title: 'CHEBOKSARY (48)', move: 2163,},
            { title: 'KHABAROVSK (49)', move: 2205,},
            { title: 'PERM (50)', move: 2247,},
            { title: 'TULA (51)', move: 2289,},
            { title: 'RYAZAN (52)', move: 2331,},
            { title: 'MURMANSK (53)', move: 2373,},
            { title: 'PENZA (54)', move: 2415,},
            { title: 'KURSK (55)', move: 2457,},
            { title: 'ARKHANGELSK (56)', move: 2499,},
            { title: 'ORENBURG (57)', move: 2544,},
            { title: 'KIROV (58)', move: 2583,},
            { title: 'KEMEROVO (59)', move: 2625,},
            { title: 'TYUMEN (60)', move: 2662,},
            { title: 'TOLYATTI (61)', move: 2701,},
            { title: 'IVANOVO (62)', move: 2734,},
            { title: 'STAVROPOL (63)', move: 2766,},
            { title: 'SMOLENSK (64)', move: 2798,},
            { title: 'PSKOV (65)', move: 2830,},
            { title: 'BRYANSK (66)', move: 2862,},
            { title: 'OREL (67)', move: 2894,},
            { title: 'YAROSLAVL (68)', move: 2926,},
            { title: 'BARNAUL (69)', move: 2958,},
            { title: 'LIPETSK (70)', move: 2990,},
            { title: 'ULYANOVSK (71)', move: 3022,},
            { title: 'YAKUTSK (72)', move: 3054,},
            { title: 'TAMBOV (73)', move: 3308,},
            { title: 'BRATSK (74)', move: 3343,},
            { title: 'ASTRAKHAN (75)', move: 3378,},
            { title: 'CHITA (76)', move: 3413,},
            { title: 'KOSTROMA (77)', move: 3448,},
            { title: 'VLADIMIR (78)', move: 3483,},
            { title: 'KALUGA (79)', move: 3518,},
            { title: 'NOVGOROD (80)', move: 3554,},
            { title: 'TAGANROG (81)', move: 3589,},
            { title: 'VOLOGDA (82)', move: 3624,},
            { title: 'TVER (83)', move: 3665,},
            { title: 'TOMSK (84)', move: 3727,},
            { title: 'IZHEVSK (85)', move: 3766,},
            { title: 'SURGUT (86)', move: 3799,},
            { title: 'PODOLSK (87)', move: 3836,},
            { title: 'MAGADAN (88)', move: 3931,},
            { title: 'CHEREPOVETS (89)', move: 3966, }, ] };
////////////////////////ЖАЛОБЫ НА ИГРОКОВ////////////////////////
    const category5 = {
        name: 'Игроки',
        color: '#32CD32',
        text: '#000000',
        description: 'Перемещение тем в раздел "Жалобы на игроков". Выберите нужный сервер из кнопок ниже',
        buttons: [
            { title: 'RED (1)', move: 88,},
            { title: 'GREEN (2)', move: 119,},
            { title: 'BLUE (3)', move: 156,},
            { title: 'YELLOW (4)', move: 194,},
            { title: 'ORANGE (5)', move: 273,},
            { title: 'PURPLE (6)', move: 312,},
            { title: 'LIME (7)', move: 352,},
            { title: 'PINK (8)', move: 394,},
            { title: 'CHERRY (9)', move: 435,},
            { title: 'BLACK (10)', move: 470,},
            { title: 'INDIGO (11)', move: 519,},
            { title: 'WHITE (12)', move: 560,},
            { title: 'MAGENTA (13)', move: 599,},
            { title: 'CRIMSON (14)', move: 640,},
            { title: 'GOLD (15)', move: 682,},
            { title: 'AZURE (16)', move: 723,},
            { title: 'PLATINUM (17)', move: 785,},
            { title: 'AQUA (18)', move: 844,},
            { title: 'GRAY (19)', move: 885,},
            { title: 'ICE (20)', move: 954,},
            { title: 'CHILLI (21)', move: 994,},
            { title: 'CHOCO (22)', move: 1036,},
            { title: 'MOSCOW (23)', move: 1082,},
            { title: 'SPB (24)', move: 1124,},
            { title: 'UFA (25)', move: 1167,},
            { title: 'SOCHI (26)', move: 1234,},
            { title: 'KAZAN (27)', move: 1276,},
            { title: 'SAMARA (28)', move: 1320,},
            { title: 'ROSTOV (29)', move: 1362,},
            { title: 'ANAPA (30)', move: 1402,},
            { title: 'EKB (31)', move: 1444,},
            { title: 'KRASNODAR (32)', move: 1488,},
            { title: 'ARZAMAS (33)', move: 1531,},
            { title: 'NOVOSIBIRSK (34)', move: 1572,},
            { title: 'GROZNY (35)', move: 1614,},
            { title: 'SARATOV (36)', move: 1656,},
            { title: 'OMSK (37)', move: 1698,},
            { title: 'IRKUTSK (38)', move: 1740,},
            { title: 'VOLGOGRAD (39)', move: 1786,},
            { title: 'VORONEZH (40)', move: 1828,},
            { title: 'BELGOROD (41)', move: 1870,},
            { title: 'MAKHACHKALA (42)', move: 1912,},
            { title: 'VLADIKAVKAZ (43)', move: 1954,},
            { title: 'VLADIVOSTOK (44)', move: 1996,},
            { title: 'KALININGRAD (45)', move: 2038,},
            { title: 'CHELYABINSK (46)', move: 2080,},
            { title: 'KRASNOYARSK (47)', move: 2122,},
            { title: 'CHEBOKSARY (48)', move: 2164,},
            { title: 'KHABAROVSK (49)', move: 2206,},
            { title: 'PERM (50)', move: 2248,},
            { title: 'TULA (51)', move: 2290,},
            { title: 'RYAZAN (52)', move: 2332,},
            { title: 'MURMANSK (53)', move: 2374,},
            { title: 'PENZA (54)', move: 2416,},
            { title: 'KURSK (55)', move: 2458,},
            { title: 'ARKHANGELSK (56)', move: 2500,},
            { title: 'ORENBURG (57)', move: 2545,},
            { title: 'KIROV (58)', move: 2584,},
            { title: 'KEMEROVO (59)', move: 2626,},
            { title: 'TYUMEN (60)', move: 2663,},
            { title: 'TOLYATTI (61)', move: 2702,},
            { title: 'IVANOVO (62)', move: 2735,},
            { title: 'STAVROPOL (63)', move: 2767,},
            { title: 'SMOLENSK (64)', move: 2799,},
            { title: 'PSKOV (65)', move: 2831,},
            { title: 'BRYANSK (66)', move: 2863,},
            { title: 'OREL (67)', move: 2895,},
            { title: 'YAROSLAVL (68)', move: 2927,},
            { title: 'BARNAUL (69)', move: 2959,},
            { title: 'LIPETSK (70)', move: 2991,},
            { title: 'ULYANOVSK (71)', move: 3023,},
            { title: 'YAKUTSK (72)', move: 3055,},
            { title: 'TAMBOV (73)', move: 3309,},
            { title: 'BRATSK (74)', move: 3344,},
            { title: 'ASTRAKHAN (75)', move: 3379,},
            { title: 'CHITA (76)', move: 3414,},
            { title: 'KOSTROMA (77)', move: 3449,},
            { title: 'VLADIMIR (78)', move: 3484,},
            { title: 'KALUGA (79)', move: 3519,},
            { title: 'NOVGOROD (80)', move: 3555,},
            { title: 'TAGANROG (81)', move: 3590,},
            { title: 'VOLOGDA (82)', move: 3625,},
            { title: 'TVER (83)', move: 3666,},
            { title: 'TOMSK (84)', move: 3728,},
            { title: 'IZHEVSK (85)', move: 3767,},
            { title: 'SURGUT (86)', move: 3800,},
            { title: 'PODOLSK (87)', move: 3837,},
            { title: 'MAGADAN (88)', move: 3932,},
            { title: 'CHEREPOVETS (89)', move: 3967, }, ] };

////////////////////////ОБЖАЛОВАНИЕ////////////////////////
    const category6 = {
        name: 'Обжалование',
        color: '#DC143C',
        text: '#FFFFFF',
        description: 'Перемещение тем в раздел "Обжалование наказаний". Выберите нужный сервер из кнопок ниже',
        buttons: [
            { title: 'RED (1)', move: 89,},
            { title: 'GREEN (2)', move: 120,},
            { title: 'BLUE (3)', move: 157,},
            { title: 'YELLOW (4)', move: 195,},
            { title: 'ORANGE (5)', move: 274,},
            { title: 'PURPLE (6)', move: 313,},
            { title: 'LIME (7)', move: 353,},
            { title: 'PINK (8)', move: 395,},
            { title: 'CHERRY (9)', move: 436,},
            { title: 'BLACK (10)', move: 471,},
            { title: 'INDIGO (11)', move: 520,},
            { title: 'WHITE (12)', move: 561,},
            { title: 'MAGENTA (13)', move: 600,},
            { title: 'CRIMSON (14)', move: 641,},
            { title: 'GOLD (15)', move: 683,},
            { title: 'AZURE (16)', move: 724,},
            { title: 'PLATINUM (17)', move: 786,},
            { title: 'AQUA (18)', move: 845,},
            { title: 'GRAY (19)', move: 886,},
            { title: 'ICE (20)', move: 955,},
            { title: 'CHILLI (21)', move: 995,},
            { title: 'CHOCO (22)', move: 1037,},
            { title: 'MOSCOW (23)', move: 1084,},
            { title: 'SPB (24)', move: 1125,},
            { title: 'UFA (25)', move: 1168,},
            { title: 'SOCHI (26)', move: 1235,},
            { title: 'KAZAN (27)', move: 1277,},
            { title: 'SAMARA (28)', move: 1321,},
            { title: 'ROSTOV (29)', move: 1363,},
            { title: 'ANAPA (30)', move: 1403,},
            { title: 'EKB (31)', move: 1445,},
            { title: 'KRASNODAR (32)', move: 1489,},
            { title: 'ARZAMAS (33)', move: 1528,},
            { title: 'NOVOSIBIRSK (34)', move: 1573,},
            { title: 'GROZNY (35)', move: 1615,},
            { title: 'SARATOV (36)', move: 1657,},
            { title: 'OMSK (37)', move: 1699,},
            { title: 'IRKUTSK (38)', move: 1741,},
            { title: 'VOLGOGRAD (39)', move: 1787,},
            { title: 'VORONEZH (40)', move: 1829,},
            { title: 'BELGOROD (41)', move: 1871,},
            { title: 'MAKHACHKALA (42)', move: 1913,},
            { title: 'VLADIKAVKAZ (43)', move: 1955,},
            { title: 'VLADIVOSTOK (44)', move: 1997,},
            { title: 'KALININGRAD (45)', move: 2039,},
            { title: 'CHELYABINSK (46)', move: 2081,},
            { title: 'KRASNOYARSK (47)', move: 2123,},
            { title: 'CHEBOKSARY (48)', move: 2165,},
            { title: 'KHABAROVSK (49)', move: 2207,},
            { title: 'PERM (50)', move: 2249,},
            { title: 'TULA (51)', move: 2291,},
            { title: 'RYAZAN (52)', move: 2333,},
            { title: 'MURMANSK (53)', move: 2375,},
            { title: 'PENZA (54)', move: 2417,},
            { title: 'KURSK (55)', move: 2459,},
            { title: 'ARKHANGELSK (56)', move: 2501,},
            { title: 'ORENBURG (57)', move: 2546,},
            { title: 'KIROV (58)', move: 2585,},
            { title: 'KEMEROVO (59)', move: 2627,},
            { title: 'TYUMEN (60)', move: 2664,},
            { title: 'TOLYATTI (61)', move: 2703,},
            { title: 'IVANOVO (62)', move: 2736,},
            { title: 'STAVROPOL (63)', move: 2768,},
            { title: 'SMOLENSK (64)', move: 2800,},
            { title: 'PSKOV (65)', move: 2832,},
            { title: 'BRYANSK (66)', move: 2864,},
            { title: 'OREL (67)', move: 2896,},
            { title: 'YAROSLAVL (68)', move: 2928,},
            { title: 'BARNAUL (69)', move: 2960,},
            { title: 'LIPETSK (70)', move: 2992,},
            { title: 'ULYANOVSK (71)', move: 3024,},
            { title: 'YAKUTSK (72)', move: 3056,},
            { title: 'TAMBOV (73)', move: 3310,},
            { title: 'BRATSK (74)', move: 3345,},
            { title: 'ASTRAKHAN (75)', move: 3380,},
            { title: 'CHITA (76)', move: 3415,},
            { title: 'KOSTROMA (77)', move: 3450,},
            { title: 'VLADIMIR (78)', move: 3485,},
            { title: 'KALUGA (79)', move: 3520,},
            { title: 'NOVGOROD (80)', move: 3556,},
            { title: 'TAGANROG (81)', move: 3591,},
            { title: 'VOLOGDA (82)', move: 3626,},
            { title: 'TVER (83)', move: 3667,},
            { title: 'TOMSK (84)', move: 3729,},
            { title: 'IZHEVSK (85)', move: 3768,},
            { title: 'SURGUT (86)', move: 3801,},
            { title: 'PODOLSK (87)', move: 3838,},
            { title: 'MAGADAN (88)', move: 3933,},
            { title: 'CHEREPOVETS (89)', move: 3968, }, ] };

    // Массив всех категорий
    const categories = [category1, category2, category3, category4, category5, category6];

    // Подключаем шрифт Roboto
    const fontLink = document.createElement('link');
    fontLink.href = 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap';
    fontLink.rel = 'stylesheet';
    document.head.appendChild(fontLink);

    const style = `
    .button-container {
        position: fixed;
        left: 50%;
        top: 50px;
        transform: translateX(-50%);
        z-index: 9999;
        display: none;
        flex-wrap: wrap;
        justify-content: flex-start;
        width: 95vw;
        max-height: 80vh;
        overflow-y: auto;
        padding: 15px;
        background-color: rgba(0, 0, 0, 0.9);
        border-radius: 10px;
        transition: opacity 0.3s ease;
        box-sizing: border-box;
    }
    .custom-button {
        color: white;
        padding: 8px 12px;
        border: none;
        border-radius: 5px;
        font-size: 12px;
        cursor: pointer;
        box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
        transition: background-color 0.3s, transform 0.2s;
        margin: 4px;
        width: calc(33.333% - 8px);
        text-align: center;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        box-sizing: border-box;
        font-family: 'Roboto', sans-serif;
    }
    .custom-button:hover {
        opacity: 0.8;
        transform: scale(1.01);
    }
    .mobile-menu-button {
        position: fixed;
        top: 10px;
        right: 10px;
        z-index: 10000;
        padding: 8px 12px;
        background-color: #333;
        color: white;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        font-size: 14px;
        font-family: 'Roboto', sans-serif;
    }
    .mobile-menu-button:hover {
        background-color: #555;
    }
    .mobile-menu-container {
        position: fixed;
        top: 45px;
        right: 10px;
        z-index: 9999;
        display: none;
        flex-direction: column;
        background-color: rgba(0, 0, 0, 0.95);
        border-radius: 8px;
        padding: 10px;
        min-width: 150px;
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
    }
    .mobile-menu-item {
        padding: 10px 15px;
        color: white;
        text-decoration: none;
        border-radius: 5px;
        margin: 2px 0;
        text-align: center;
        font-family: 'Roboto', sans-serif;
        font-size: 14px;
        cursor: pointer;
        transition: background-color 0.3s;
    }
    .mobile-menu-item:hover {
        opacity: 0.8;
    }
    .background-overlay {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(0, 0, 0, 0.5);
        z-index: 9998;
        display: none;
    }
    .container-header {
        color: white;
        font-size: 16px;
        margin-bottom: 10px;
        text-align: center;
        font-weight: bold;
        font-family: 'Roboto', sans-serif;
        width: 100%;
    }
    .container-description {
        color: #ffffff;
        font-size: 14px;
        margin-bottom: 15px;
        text-align: center;
        font-family: 'Roboto', sans-serif;
        width: 100%;
        line-height: 1.4;
    }
    .separator {
        flex-basis: 100%;
        height: 1px;
        background-color: rgba(255,255,255,0.3);
        margin: 10px 0;
    }
    .special-button {
        width: 100% !important;
        margin: 8px auto !important;
        padding: 12px 15px !important;
        font-size: 14px !important;
        font-weight: bold !important;
        text-align: center !important;
    }
    @media (max-width: 480px) {
        .custom-button {
            width: calc(50% - 8px);
            font-size: 11px;
            padding: 6px 8px;
        }
    }
    @media (max-width: 360px) {
        .custom-button {
            width: calc(100% - 8px);
            font-size: 12px;
            padding: 8px 10px;
        }
    }
    `;

    const styleTag = document.createElement('style');
    styleTag.innerHTML = style;
    document.head.appendChild(styleTag);

    // Создаем контейнеры для кнопок
    const buttonContainers = [];
    categories.forEach((category, index) => {
        const container = document.createElement('div');
        container.className = 'button-container';
        container.id = `button-container-${index + 1}`;
        document.body.appendChild(container);
        buttonContainers.push(container);
    });

    // Функция для создания кнопок в контейнерах
    function createButtons(category, container) {
        if (category.description) {
            const description = document.createElement('div');
            description.className = 'container-description';
            description.innerText = category.description;
            container.appendChild(description);
        }

        category.buttons.forEach((buttonData) => {
            if (buttonData.title === 'Заявки с окончательным ответом' || buttonData.title === 'Жалобы на технических специалистов') {
                const separator = document.createElement('div');
                separator.className = 'separator';
                container.appendChild(separator);
            }

            const button = document.createElement('div');
            button.className = 'custom-button';
            button.innerHTML = buttonData.title;
            button.style.backgroundColor = buttonData.color || category.color;
            button.style.color = buttonData.text || category.text;

            if (buttonData.title === 'Заявки с окончательным ответом' || buttonData.title === 'Жалобы на технических специалистов') {
                button.className += ' special-button';
            }

            button.addEventListener('click', function() {
                moveThread(buttonData, category);
                buttonContainers.forEach(container => {
                    container.style.display = 'none';
                });
                backgroundOverlay.style.display = 'none';
                mobileMenuContainer.style.display = 'none';
            });

            container.appendChild(button);
        });
    }

    // Создаем кнопки для каждого контейнера
    categories.forEach((category, index) => {
        createButtons(category, buttonContainers[index]);
    });



















    // Создаем мобильное меню
    const mobileMenuContainer = document.createElement('div');
    mobileMenuContainer.className = 'mobile-menu-container';

    // Добавляем пункты в мобильное меню
    categories.forEach((category, index) => {
        const menuItem = document.createElement('div');
        menuItem.className = 'mobile-menu-item';
        menuItem.innerHTML = category.name;
        menuItem.style.backgroundColor = category.color;
        menuItem.style.color = category.text;

        menuItem.addEventListener('click', function() {
            const targetContainer = buttonContainers[index];

            buttonContainers.forEach(container => {
                container.style.display = 'none';
            });

            targetContainer.style.display = 'flex';
            backgroundOverlay.style.display = 'block';
            mobileMenuContainer.style.display = 'none';
        });

        mobileMenuContainer.appendChild(menuItem);
    });

    // Добавляем кнопку Меню через функцию addButton

addButton('Tech', 'moderatorMenu', 'border-radius: 13px; margin-right: 5px; border: 2px solid; border-color: rgb(255, 165, 0, 1.75); background-color: #black; color: #FFA500;');
    // Обработчик для кнопки меню (с проверкой чтобы не конфликтовало с другими скриптами)
    $(document).on('click', '#moderatorMenu', function(e) {
        e.stopPropagation(); // Останавливаем всплытие события
        e.preventDefault(); // Предотвращаем стандартное действие

        // Проверяем, не активирован ли уже другой скрипт
        if (window.menuScriptActive) {
            return; // Если другой скрипт активен, выходим
        }

        window.menuScriptActive = true; // Помечаем наш скрипт как активный

        // Твой код для отображения меню модератора
        if (mobileMenuContainer.style.display === 'flex') {
            mobileMenuContainer.style.display = 'none';
            backgroundOverlay.style.display = 'none';
        } else {
            mobileMenuContainer.style.display = 'flex';
            backgroundOverlay.style.display = 'block';

            // Скрываем все контейнеры с кнопками при открытии меню
            buttonContainers.forEach(container => {
                container.style.display = 'none';
            });
        }

        // Сбрасываем флаг через короткое время
        setTimeout(() => {
            window.menuScriptActive = false;
        }, 100);
    });













    // Создаем фон для контейнера
    const backgroundOverlay = document.createElement('div');
    backgroundOverlay.className = 'background-overlay';
    document.body.appendChild(backgroundOverlay);

    // Закрытие при клике на фон
    backgroundOverlay.addEventListener('click', function() {
        buttonContainers.forEach(container => {
            container.style.display = 'none';
        });
        mobileMenuContainer.style.display = 'none';
        backgroundOverlay.style.display = 'none';
    });

    // Добавляем элементы в тело страницы
    document.body.appendChild(mobileMenuContainer);

    // Закрытие при клике на фон
    backgroundOverlay.addEventListener('click', function() {
        buttonContainers.forEach(container => {
            container.style.display = 'none';
        });
        mobileMenuContainer.style.display = 'none';
        backgroundOverlay.style.display = 'none';
    });

    // Добавляем элементы в тело страницы
    document.body.appendChild(mobileMenuContainer);
})();