! Tools

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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);
})();