Java Исходник [Discord / NodeJS] Модульная система защиты (Аналог Gerda / Wick)

Joce

Известный
Автор темы
134
71
Привет! Выкладываю полноценного самописного бота (в разработке использовался ИИ) защиты для Discord-серверов.

Бот создавался как надежная замена популярным ботам вроде Gerda и Wick. Предотвращает сливы, блокирует ботов-крашеров, моментально откатывает вредоносные действия и управляется прямо из чата через удобные интерактивные карточки с кнопками.

При использовании данного бота указывать авторство by Joce



Возможности​

  • АнтиСлив и иерархия ролей — жесткая настройка: какая роль имеет право выдавать/снимать другие роли. Если пользователь трогает запрещенную роль (хоть себе, хоть другому), бот мгновенно возвращает всё назад, снимает с нарушителя все роли, выдает карантин и вешает таймаут на 28 дней.
  • Роли до изменения — в карточке выводятся настоящие роли нарушителя и пользователя, которые были у них ДО совершения слива (свежевыданные роли отфильтровываются).
  • Решение в 1 клик — в канал логов падает карточка с кнопками [ Одобрить ], [ Отказать ], [ Помиловать ]. При вынесении вердикта через команду /guard verdict карточка в канале логов сама обновляется в реальном времени (перекрашивается и блокирует кнопки).
  • Авто-оповещение — при сработке бот автоматически пингует в карточке тех, кому разрешено выносить вердикт (создатель бота при этом никогда не тегается).
  • Защита от опасных прав ролей — отслеживает 47 прав Discord на официальном русском языке (Администратор, Управление ролями, Каналами и т.д.). Попытка выдать опасные права откатывается, нарушитель изолируется.
  • Защита от ботов-крашеров (AntiBot) — если кто-то попытается завести на сервер стороннего бота, добавленный бот мгновенно банится навсегда, а пригласивший изолируется.
  • Защита от удаления ролей и вебхуков — удаленные роли восстанавливаются ботом автоматически, а созданные для спама вебхуки сразу удаляются.
  • Управление защитами под каждый сервер — любой модуль (АнтиСлив, опасные права, снос ролей, боты, вебхуки, лимиты) можно включать или выключать отдельно на каждом сервере.
  • Полный доступ к ролям (RoleMaster) — возможность выдать доверенному лицу или роли право менять абсолютно любые роли в обход иерархии.
  • Раздельные логи — отдельный канал для карточек сработок и отдельный канал для истории изменения настроек (с кнопкой перехода к сообщению справа).
  • Массовая настройка (/guard batch) — быстрая настройка всего сервера через текст или файл .txt. Поддерживает дедупликацию, перечисление прав через пробел и подробный вывод ошибок со строками.
  • Полный бэкап сервера (/guard export) — выгружает готовый файл backup_[ID].txt со всеми ролями, каналами, правами и белым списком.
  • База данных на SQL — все сработки хранятся ровно 168 часов (7 дней) и не пропадают при перезагрузке бота.
  • Ошибки в ЛС — бот не падает при сбоях и отправляет отчет об ошибках Создателю в ЛС (включается/выключается командой /error).


Структура проекта​


Код:
src/
├─ config/
│ └─ constants.js # Права, цвета и теги
├─ database/
│ ├─ schema.sql #  SQL таблица
│ ├─ client.js # better-sqlite3 и WAL
│ └─ repositories/
│ ├─ GuildRepo.js # Репозиторий настроек серверов
│ ├─ AccessRepo.js # Репозиторий прав доступа и команд
│ └─ TriggerRepo.js # Репозиторий архива сработок (168 часов)
├─ core/
│ ├─ BotClient.js # Клиент Discord
│ ├─ RateLimiter.js # Защита от спама быстрыми действиями
│ └─ ErrorHandler.js # Защита от крашей и алерты ошибок в ЛС
├─ ui/
│ ├─ v2.js # Движок Discord Components V2
│ └─ Pager.js # Авто-деление длинного текста на страницы
├─ commands/
│ └─ error.js # Команда /error (вкл/выкл ошибок в ЛС)
├─ modules/
│ └─ guard/
│ ├─ Guard.js # Обработчик /guard
│ ├─ ui.js # UI Слой модуля Guard
│ └─ submodules/
│ ├─ Access.js # Доступ к боту (пользователи и роли)
│ ├─ Config.js # Статус, каналы логов, карантин, белый список
│ ├─ AntiSliv.js # Защита ролей, откат и авто-пинг вердиктов
│ ├─ AntiPerms.js # Защита от опасных прав ролей
│ ├─ AntiRoleNuke.js # Защита от создания и удаления ролей
│ ├─ AntiBot.js # Авто-бан чужих ботов-крашеров
│ ├─ AntiWebhook.js # Удаление вредоносных вебхуков
│ ├─ IncidentCard.js # Карточка с кнопками вердикта
│ ├─ History.js # Архив всех сработок за 7 дней
│ ├─ Batch.js # Массовая настройка ролей текстом/файлом
│ ├─ BatchHelp.js # Справка по синтаксису батча
│ ├─ Export.js # Полный бэкап настроек в файл .txt
│ ├─ PermsConfig.js # Настройка опасных прав и RoleMaster
│ ├─ QuarantineSetup.js# Настройка роли карантина за 0.5с
│ ├─ ModuleToggle.js # Включение/выключение модулей защиты
│ ├─ RateLimit.js # Блокировка массового спама ролями
│ └─ AuditLogger.js # Логирование настроек с кнопкой перехода
└─ index.js # Точка входа


Установка и запуск​

Для работы потребуется
better-sqlite3 v11.8.1
discord.js v14.17.3
dotenv v16.4.7
  1. Скачайте файлы проекта
  2. Откройте терминал в папке с ботом и установите зависимости:
Код:
npm install discord.js better-sqlite3 dotenv
  1. Создайте в корне файл .env и впишите свои данные:
Код:
DISCORD=токен_вашего_бота
OWNER=ваш_цифровой_id_дискорда
  1. Запустите бота:
Код:
node src/index.js



Примеры использования​


1. Основные команды:​

/guard status — показывает всю информацию о защите сервера (кнопки перехода в каналы прикреплены справа)
/guard quarantine — создает роль @Quarantine и заблокирует ей доступ во всех категориях
/guard set-logs channel:#канал — выбрать канал для карточек сработок с кнопками
/guard set-config-logs channel:#канал — выбрать канал для истории изменения настроек
/error state:True/False — включить/выключить отправку системных ошибок бота себе в ЛС

2. Защита ролей и прав:​

/guard rule-add target_role:@Администратор allowed_role:@Куратор — выдавать @Администратор разрешено только роли @Куратор
/guard rule-remove — забрать разрешение на выдачу роли
/guard rule-clear target_role:@Администратор — полностью снять защиту с роли (с подтверждением кнопками)
/guard perms sub_action:Добавить permission:Управлять ролями — добавить отслеживание права (поиск работает на русском)
/guard role-master sub_action:Добавить user:@Пользователь — выдать полный доступ ко всем ролям без ограничений

Полный перечень прав для защиты
'ViewChannel': { bit: P.ViewChannel, ru: 'Просматривать каналы' },
'ManageChannels': { bit: P.ManageChannels, ru: 'Управлять каналами' },
'ManageRoles': { bit: P.ManageRoles, ru: 'Управлять ролями' },
'CreateGuildExpressions': { bit: P.CreateGuildExpressions || 0n, ru: 'Создавать средства выражения эмоций' },
'ManageGuildExpressions': { bit: P.ManageGuildExpressions || 0n, ru: 'Управлять выражениями' },
'ViewAuditLog': { bit: P.ViewAuditLog, ru: 'Просматривать журнал аудита' },
'ManageWebhooks': { bit: P.ManageWebhooks, ru: 'Управлять вебхуками (webhooks)' },
'ManageGuild': { bit: P.ManageGuild, ru: 'Управлять сервером' },
'CreateInstantInvite': { bit: P.CreateInstantInvite, ru: 'Создание приглашения' },
'ChangeNickname': { bit: P.ChangeNickname, ru: 'Изменить никнейм' },
'ManageNicknames': { bit: P.ManageNicknames, ru: 'Управлять никнеймами' },
'KickMembers': { bit: P.KickMembers, ru: 'Выгоняйте, одобряйте или отклоняйте участников' },
'BanMembers': { bit: P.BanMembers, ru: 'Банить участников' },
'ModerateMembers': { bit: P.ModerateMembers, ru: 'Отправить участников подумать о своём поведении' },
'SendMessages': { bit: P.SendMessages, ru: 'Отправка сообщений и создание публикаций' },
'SendMessagesInThreads': { bit: P.SendMessagesInThreads, ru: 'Отправлять сообщения в ветках и публикациях' },
'CreatePublicThreads': { bit: P.CreatePublicThreads, ru: 'Создать публичные ветки' },
'CreatePrivateThreads': { bit: P.CreatePrivateThreads, ru: 'Создание приватных веток' },
'EmbedLinks': { bit: P.EmbedLinks, ru: 'Встраивать ссылки' },
'AttachFiles': { bit: P.AttachFiles, ru: 'Прикреплять файлы' },
'AddReactions': { bit: P.AddReactions, ru: 'Добавлять реакции' },
'UseExternalEmojis': { bit: P.UseExternalEmojis, ru: 'Использовать внешние эмодзи' },
'UseExternalStickers': { bit: P.UseExternalStickers, ru: 'Использовать внешние стикеры' },
'MentionEveryone': { bit: P.MentionEveryone, ru: 'Упоминание @everyone, @here и всех ролей' },
'ManageMessages': { bit: P.ManageMessages, ru: 'Управлять сообщениями' },
'ManageThreads': { bit: P.ManageThreads, ru: 'Управление ветками и публикациями' },
'ReadMessageHistory': { bit: P.ReadMessageHistory, ru: 'Читать историю сообщений' },
'SendTTSMessages': { bit: P.SendTTSMessages, ru: 'Отправка сообщений text-to-speech' },
'SendVoiceMessages': { bit: P.SendVoiceMessages || 0n, ru: 'Отправлять голосовые сообщения' },
'SendPolls': { bit: P.SendPolls || 0n, ru: 'Создание опросов' },
'Connect': { bit: P.Connect, ru: 'Подключаться' },
'Speak': { bit: P.Speak, ru: 'Говорить' },
'Stream': { bit: P.Stream, ru: 'Видео' },
'UseSoundboard': { bit: P.UseSoundboard || 0n, ru: 'Использовать звуковую панель' },
'UseExternalSounds': { bit: P.UseExternalSounds || 0n, ru: 'Использовать внешние звуки' },
'UseVAD': { bit: P.UseVAD, ru: 'Использовать режим активации по голосу' },
'PrioritySpeaker': { bit: P.PrioritySpeaker, ru: 'Приоритетный режим' },
'MuteMembers': { bit: P.MuteMembers, ru: 'Отключать участникам микрофон' },
'DeafenMembers': { bit: P.DeafenMembers, ru: 'Отключать участникам звук' },
'MoveMembers': { bit: P.MoveMembers, ru: 'Перемещать участников' },
'SetVoiceChannelStatus': { bit: P.SetVoiceChannelStatus || 0n, ru: 'Задать статус голосового канала' },
'UseApplicationCommands': { bit: P.UseApplicationCommands, ru: 'Использовать команды приложения' },
'UseEmbeddedActivities': { bit: P.UseEmbeddedActivities, ru: 'Использовать активности' },
'UseExternalApps': { bit: P.UseExternalApps || 0n, ru: 'Использовать внешние приложения' },
'CreateEvents': { bit: P.CreateEvents || 0n, ru: 'Создавать события' },
'ManageEvents': { bit: P.ManageEvents, ru: 'Управление событиями' },
'Administrator': { bit: P.Administrator, ru: 'Администратор' }

3. Управление модулями и доступом к командам:​

/guard module name:Защита от ботов state:Выключить — вкл/выкл модуль на сервере
/guard access-grant user:@Модератор command:verdict — разрешить пользователю/роле выносить вердикты
/guard access-list — посмотреть, у кого есть доступ к боту и каким командам

4. Массовая быстрая настройка (/guard batch):​

Можно вставить списком в поле text: или загрузить .txt файлом:
Код:
# Настройка доступа к ролям
g1207983892917653514 +r1264512101578182728 r1360074595813691542
g1207983892917653514 -r1274575791157411900 r1360074595813691542

]Назначить каналы и роль карантина
g1207983892917653514 =log c1524067902569840850
g1207983892917653514 =cfglog c1524067902569840850
g1207983892917653514 =quarantine r1272351896987893770

Белый список (пользователи и роли)
g1207983892917653514 +w u1527665333941436447
g1207983892917653514 +w r1274575791157411900

Опасные права списком через пробел
g1207983892917653514 +p Administrator ManageRoles ManageChannels BanMembers
Полная информация /guard batch-help.

5. Бэкап и история:​

/guard export — присылает готовый файл backup_[ID].txt со всеми настройками сервера
/guard verdict user:@Нарушитель decision:Помиловать — вынести решение текстом (сообщение в логах само обновится)
/guard history — просмотр архива всех сработок за последние 168 часов (7 дней)


Важные настройки в самом Discord​

  1. В Настройки сервера ➔ Роли перетащите роль Бота на самый верх (выше ролей модераторов и защищаемых ролей). Бот физически не может наказывать тех, кто стоит выше него в иерархии Discord.
  2. В Discord Developer Portal во вкладке Bot обязательно включите галочку Server Members Intent.

1791804907902.png
1791804910082.png
1791804999622.png
1791805021448.png
1791805266099.png
1791834748707.png
 

Вложения

  • src.rar
    35.8 KB · Просмотры: 1
Последнее редактирование:
  • Нравится
Реакции: romacaddy

Hrustalev

Известный
90
55
А ты случаем туды, всякие штучки не внидрил, чтобы потом делац рофлы?)
 

Andrey Markelov

Участник
33
56
А ты случаем туды, всякие штучки не внидрил, чтобы потом делац рофлы?)
пробежался, ничего такого нет

архитектура не очень, есть моменты, конечно, где логика будет работать не как ожидается и тупо бд не обвноится, советую автору все таки самому делать тесты.
обычно выкладывают package.json, но раз нейронка делала, хотябы версии зависимости указал бы.
sql с кодом, делать кашу - в 26 году себя не уважать
а почему тестами не покрыл?
 

Joce

Известный
Автор темы
134
71
пробежался, ничего такого нет

архитектура не очень, есть моменты, конечно, где логика будет работать не как ожидается и тупо бд не обвноится, советую автору все таки самому делать тесты.
обычно выкладывают package.json, но раз нейронка делала, хотябы версии зависимости указал бы.
sql с кодом, делать кашу - в 26 году себя не уважать
а почему тестами не покрыл?
Поправил, теперь проблем не должно быть

А ты случаем туды, всякие штучки не внидрил, чтобы потом делац рофлы?)
Я добропорядочный, только за идею

В след релизе пофикшу проблему с памятью, мелкие улучшения, проведу полный стек ошибок, чтобы довести его до максимальной отказо устойчивости
Далее в планах реализовать модерирования, систему экономики. Если есть у кого каки-то предложения или баги, жду предложений
 
Последнее редактирование: