Документация 9.6.24
Интеграция Discord
Используйте функции установленной панели.
Webhook#
Создайте webhook нужного канала и сохраните в настройках. URL и токен секретны. До уведомлений отправьте контролируемый тест.
Права#
Выдавайте только нужные права. При сбое проверьте канал, токен и ответ провайдера. Раскрытые токены смените, из логов удалите.
Разделите три интеграции#
В Настройки → Интеграции URL webhook, токен бота и данные OAuth имеют отдельные поля. Они отвечают за уведомления, личность бота и вход. Работающий webhook не подтверждает команды или OAuth.
Webhook, токен и client secret являются секретами. Публичное приглашение сообщества отличается: не помещайте секретный webhook в поле приглашения сайта.
Проверяйте уведомления контролируемо#
Выберите подходящий канал сотрудников и проверьте доступ до отправки данных игроков.
- Создайте собственный webhook по официальному руководству и сохраните полный адрес.
- Проверьте обрезанный URL, пробелы и старые данные другого канала.
- Используйте доступный тест или обычное безопасное событие; не баньте игроков и не запускайте платежи ради проверки.
- Проверьте канал, время и содержимое; изучите сбойный процесс без постоянного повторения события.
Бот, OAuth и раскрытые секреты#
Давайте боту только нужные права. Сохранённый токен не настраивает его выполнение или все команды. Для OAuth сохраните ID и secret отдельно, а адрес возврата согласуйте с установленным входом.
Проверьте вход в другой сессии, сохранив доступную сессию администратора. Поддержке укажите конкретный процесс, время и ошибку без секретов.
Опубликованные токены и webhook замените у провайдера, обновите панель и проверьте другие установки со старым значением. Повторно проверьте обычный процесс и скрывайте секреты на снимках.
Проследите отсутствующее уведомление от события до канала#
Если сообщение Discord отсутствует, сначала подтвердите само событие и настройку используемой им интеграции. Сохранённый webhook не доказывает, что каждое событие создаёт уведомление. До смены данных доступа запишите сервер или сайт и время события.
Если обычное событие видно в панели, но не в Discord, проверьте целевой канал и сохранённый webhook. Удалённый webhook, изменённый канал или неполный адрес нужно исправить на соответствующем этапе. Сохраните прежний контекст без секретов, чтобы изменение можно было проверить.
Если сообщение пришло не в тот канал, ограничьте там доступ и исправьте назначение до новых проверок. Не создавайте повторные санкции ради диагностики доставки. Передайте поддержке категорию события, время и очищенную ошибку, а не полный webhook или личные данные игроков.
Учитывайте сохранение пустых секретных полей#
Токен бота и OAuth client secret — конфиденциальные поля пароля. В текущей реализации пустое поле при сохранении оставляет его прежнее значение. Поэтому пустое поле на экране само по себе не означает отсутствие настроенного секрета; прочитайте пояснение до замены.
При смене данных вставьте новое значение в его поле и сохраните уполномоченным аккаунтом. Webhook URL и client ID имеют отдельные поля и поведение. Не считайте пустое сохранение отзывом токена или OAuth-секрета; отзывайте раскрытые данные через Discord.
Запишите, какие данные изменены и когда, без самого значения. Затем проверьте конкретный процесс: доставку в канал для webhook, доступную функцию для бота или настоящий результат входа для OAuth. Успешность одного процесса не подтверждает два остальных.
Безопасно исследуйте возврат входа через Discord#
Начните новый вход с правильного сайта и продолжайте в одной сессии браузера. OAuth использует state для связи исходящего запроса и возврата. Открытие старого callback или смешивание нескольких попыток может оставить возврат без связи с текущей сессией.
При ошибке недопустимого state или похожем сообщении запишите её и начните с обычной страницы входа вместо обновления callback. Проверьте, не блокируют ли настройки или расширения нужные cookies и переходы. Оставьте существующую сессию администратора доступной на время исследования.
Отличайте вход Discord платформы от индивидуальных данных интеграции арендованного сайта. Определите проблемный процесс до изменения client ID или перенаправления. Не публикуйте callback с кодами авторизации, state, сведениями сессии или секретами в открытых каналах поддержки.
Проверяйте содержание по потребностям команды#
Приход сообщения подтверждает доставку; понятный контекст нужным людям — отдельная проверка. Изучите обычное сообщение интеграции: сервер или сайт, время и тип операции. Читайте существующий формат, не предполагая отсутствующий редактор шаблонов или фильтр.
Ограничьте канал нужной командой. Скрывайте идентификаторы и лишние личные сведения при экспорте и снимках. Обнаружение может не содержать всего контекста; сопоставьте время с панелью. Для нескольких серверов в канале названия должны достаточно различаться.
При непонятном сообщении запишите тип, время и очищенный текст. Уточните реальный вывод с поддержкой, не придумывая функции и не наказывая игрока ради теста. Цель — одинаковое понимание ресурса и события без лишнего раскрытия секретов.
Проверяйте выбор аккаунта и отменённый вход#
При OAuth рассмотрите неверный аккаунт и отмену разрешений, а не только успех. В браузере может быть открыт другой Discord. Прочитайте личность на странице авторизации и подтвердите нужный аккаунт. Это процесс идентификации; смена канала webhook не исправляет его.
При отмене или отказе запишите результат и начните обычный вход заново. Не распространяйте старый callback с данными входа. После успеха проверьте аккаунт и сайт. Остановитесь до управления неожиданным аккаунтом. Создание другого или покупка тарифа не подтверждает сопоставление.
Укажите процесс, ожидаемый аккаунт, результат и время без token, client secret, state и кода авторизации. Вход платформы отличается от частной интеграции сайта. Названный процесс помогает поддержке без замены чужих данных доступа.
Проверяйте бота как отдельный сервис#
Сайт, webhook и бот — разные компоненты. Client ID, Guild ID и приватные данные должны соответствовать одному сайту и Discord-серверу.
Используйте поддерживаемую LTS-версию Node.js; боту требуется как минимум Node 22 LTS. Установленный отдельный сервис использует Node 24.21.0 LTS: /opt/tosun-discord-node/v24.21.0/bin/node. Пример использует один исполняемый файл для doctor в ExecStartPre и запуска ExecStart. Выполняйте npm ci и doctor с этой средой в PATH. При ошибке doctor вход не выполняется. Не включайте сервис, пока обязательные учётные данные не заполнены.
- Проверьте числовые ID ролей и каналов; не выдавайте Administrator всей команде.
- Оператор устанавливает ключи сайта и мигрирует журнал. npm ci использует lock-файл; npm run doctor проверяет без входа в Discord.
- Пустое поле секрета сохраняет значение; новые секреты требуют ключ сайта. После смены token/API перезапустите сервис.
Проверяйте неопределённый результат до повтора#
Таймаут не доказывает неудачу. Завершённая та же интеракция не выполняется повторно, но новая команда создаёт новый ID.
- Processing и unknown не разрешаются повторно из-за возраста. Проверьте результат и ID до повторных денежных, предметных, бан- или серверных команд.
- Screenshot, live-watch, sync и diag требуют авторизованную сессию панели. Не передавайте поддержке токены, ключи и пароли БД.
Разделение секретов Discord и AC#
Токен бота, webhook, секрет OAuth и лицензия Tosun — разные данные. Секреты бота хранятся в частных настройках сервиса или разрешённых полях Discord панели, не в общем Lua, NUI или серверном файле AC.
Ключи AC находятся в server.cfg или configs/anticheat_server.lua. Короткие токены снимков/видео разрешают только соответствующую загрузку. Заменяйте каждый секрет у его поставщика и контролируемо перезапускайте сервис. Проверяйте статус и тестовый канал; не повторяйте вслепую операции денег или бана с неопределённым результатом.
Отдельная установка Discord-бота из пакета#
discord-bot работает на Node.js, а не через ensure. Создайте своё приложение в Discord Developer Portal; Application ID, Guild ID, роли и каналы берите из своего Discord. Токен храните в закрытом файле окружения.
Учётная запись базы сайта по умолчанию ограничена localhost провайдера. Бот на другой машине FiveM не получает доступ автоматически. Нужен управляемый сервис на хосте сайта либо одобренное закрытое подключение только вашей базы. Не используйте root провайдера и не открывайте MySQL всем. Старые команды с прямыми запросами к игровым таблицам проверяйте отдельно.
Владелец сайта сохраняет токен, Client ID и Guild ID в Управление сайтом → Discord-бот. Через Download private bot setup скачайте приватный файл и сохраните как .env в своей папке бота. Он содержит только ключи выбранного сайта, в отличие от пустого примера ZIP. Не публикуйте файл и не добавляйте его в репозиторий.
- Установите поддерживаемую LTS-версию Node.js не ниже 22 и подготовьте примеры скриптом установки.
- Добавьте бота со scope bot и applications.commands и нужными правами.
- Настройте базу сайта и HTTPS API. Закрытый ключ команд относится только к этому боту и сайту; это не лицензия и не главный SaaS-ключ.
- До запуска выполните npm run doctor. Затем отдельно проверьте онлайн-статус и роли; doctor не входит в Discord.
cd discord-bot
sh setup.sh
# Configure the private .env and site bot settings first.
npm run doctor
npm start