HELPER Discord Bot
К списку Wiki
TICKETS CORE // PRIVATE SUPPORT CHANNELS // MULTI PANEL SYSTEMS

HELPER TICKETS ЦЕНТР ПОДДЕРЖКИ /SETUP_TICKETS / TICKETS_DEPLOY / TICKET ADD REMOVE / TRANSCRIPT LOGS

Tickets превращает поддержку сервера в аккуратную систему: пользователь нажимает кнопку, HELPER создаёт приватный канал обращения, выдаёт доступ автору и support-ролям, ведёт номер тикета, а staff может добавить участника, удалить участника, закрыть обращение и сохранить TXT-транскрипт в лог-канал. Новая версия поддерживает несколько независимых тикет-панелей через systems, не создавая дублей.

5screate cooldown
5ssite sync loop
v4create button
v2control buttons
Panel/setup_tickets создаёт support-панель
Privateканал видит автор и support
Multi Systemssystems без legacy-дублей
Transcriptполная история в TXT
Safeзакрытие старых тикетов остаётся

Что делает Tickets Core

Модуль создаёт приватные каналы обращений. В обычном сценарии пользователь нажимает кнопку, бот проверяет активность модуля, находит нужную тикет-систему по message_id/channel_id, проверяет открытую категорию, создаёт запись в SQLite, открывает канал и отправляет внутрь welcome-сообщение с кнопками управления.

01

Панель

Публичный embed с кнопкой “Создать тикет”. Текст, цвет, баннер и footer меняются с сайта.

02

Приватный канал

Канал создаётся в выбранной категории и доступен автору, боту и support-ролям.

03

Staff Control

Внутри тикета есть кнопки закрытия, добавления и удаления пользователей.

04

Transcript

При закрытии бот собирает историю сообщений, отправляет TXT в лог-канал и удаляет канал.

Больше информации картинками

Ниже весь путь глазами покупателя: настройка, публичная панель, создание тикета, приватный канал, staff-кнопки, подтверждение закрытия, лог с transcript, multi-system и safe disabled-state.

01 / setupАдмин вводит /setup_tickets
💬
slash command/setup_tickets

Развернуть систему тикетов

Админ выбирает канал панели, категорию тикетов, лог-канал и роль поддержки. Затем открывается TicketSetupModal.

/setup_tickets setup_channel:#поддержка category:📞 Тикеты log_channel:#логи support_role:@Support
TicketSetupModal → save settings → deploy panel
02 / public panelПубличная support-панель
📞
#поддержкаЦЕНТР ПОДДЕРЖКИ

📞 ЦЕНТР ПОДДЕРЖКИ

Гарантия приватности, быстрый ответ, логирование и кнопка создания обращения.

TICKETS BANNER
🎫 Создать тикет
03 / create checksПроверки перед созданием
CreateTicketViewcooldown 5sguild only
module activeесли tickets выключен, показывается красный disabled embed
state
system enabledконкретная панель может быть закрыта отдельно
system
category existsкатегория тикетов должна быть CategoryChannel
channel
one open ticketодин открытый тикет на пользователя в системе
anti spam
04 / private channelНовый тикет
🎫
private channelticket-0007-sasi

🎫 ТИКЕТ #0007

Опишите ситуацию максимально подробно. Поддержка скоро свяжется с вами.

Автор@Sasi
Системаsupport
Support@Support
Статусopen
🔒 Закрыть тикет
➕ Добавить
➖ Удалить
05 / add userДобавить пользователя

➕ UserSelect

Staff выбирает пользователя, бот выдаёт view_channel, read_messages, send_messages, attach_files и read_message_history.

TicketControlView.add_user_btn
06 / close confirmПодтверждение закрытия

🔒 Закрыть тикет #0007?

После подтверждения HELPER соберёт полный лог переписки и удалит канал через несколько секунд.

✅ Да, закрыть
❌ Отмена
07 / transcript logTXT-транскрипт

🔒 ТИКЕТ ЗАКРЫТ | #0007

Лог-канал получает embed с автором, staff, каналом, системой и файлом ticket_guild_0007_transcript.txt.

attachment://ticket_123_0007_transcript.txt
08 / disabledТикеты отключены

🔌 ЦЕНТР ПОДДЕРЖКИ ОБЕСТОЧЕН

Создание новых тикетов временно отключено администратором. Уже созданные тикеты staff всё ещё может закрыть.

🔌 ТИКЕТЫ ОБЕСТОЧЕНЫ

Команды Discord

У модуля есть отдельные admin-команды для установки и redeploy, плюс sub-команды управления пользователями внутри открытого тикета.

setup/setup_tickets
/setup_tickets setup_channel:#поддержка category:📞 Тикеты log_channel:#тикет-логи support_role:@Support

Открывает TicketSetupModal, сохраняет базовые настройки, включает модуль и публикует панель.

redeploy/tickets_deploy
/tickets_deploy

Пересобирает все настроенные тикет-системы сервера. Если есть nested systems, обновляет каждую систему отдельно.

inside ticket/ticket add
/ticket add user:@Player

Добавляет пользователя в текущий тикет. Команда работает только внутри тикет-канала и требует staff-доступ.

inside ticket/ticket remove
/ticket remove user:@Player

Удаляет пользователя из текущего тикета, снимая его permission overwrite в канале.

Путь тикета от кнопки до архива

1Panel

button

2Resolve

system

3DB

allocate

4Channel

private

5Control

staff

6Transcript

close

A

Panel routing

Бот определяет систему по message_id и channel_id, поэтому разные панели могут вести в разные категории.

B

SQLite ticket_no

Номер тикета выделяется атомарно по guild_id, чтобы #0001/#0002 не ломались между серверами.

C

Safe close

Закрытие требует подтверждения, формирует transcript, помечает тикет закрытым и удаляет канал.

Что видит обычный пользователь

open ticketСоздание обращения

🎫 Создать тикет

Пользователь нажимает кнопку и получает приватный канал. Канал не видят остальные участники сервера.

create_ticket_btn_v4
already openЕсли тикет уже есть

⚠️ У вас уже есть активный тикет

Бот возвращает ссылку на существующий канал. Если запись битая, cleanup_dead_open_ticket убирает её.

find_existing_open_ticket
closed systemЕсли система закрыта

⛔ Эта тикет-система временно закрыта

Можно закрыть отдельную панель без выключения всего модуля: enabled / is_open / accepting_responses.

system_enabled = false
cooldownЗащита от спама

⏳ Подождите 5 секунд

CreateTicketView хранит cooldown по user_id и периодически чистит старые записи.

cooldowns[user_id] window 5 sec

Что делает support-команда

Staff-доступ получают администраторы, пользователи с Manage Channels или роли из support_role_ids. Внутри тикета команда может управлять участниками и закрывать обращения.

🔒

Закрывает

Кнопка “Закрыть тикет” открывает ConfirmCloseView с подтверждением.

Добавляет

UserSelect выдаёт права конкретному пользователю на просмотр и отправку сообщений.

Удаляет

Удаление пользователя снимает overwrite и пишет системное сообщение в канал.

📜

Архивирует

После закрытия лог с transcript уходит в log_channel_id.

staff accessКто считается staff
administratorадминистратор сервера проходит всегда.
manage_channelsпользователь с Manage Channels проходит проверку.
support_role_idsнесколько ролей поддержки.
support_role_idlegacy одиночная роль.
aliasesstaff_role_ids, moderator_role_ids, allowed_role_ids, access_role_ids.
transcript uxЗакрытие тикета

⏳ Формируем транскрипт

Перед удалением канала бот проходит по истории сообщений, сохраняет content и attachment URLs.

channel.history(limit=None, oldest_first=True)

Несколько тикет-панелей

В новой логике systems — главный источник правды. Если systems уже есть, бот не создаёт отдельную legacy/default-панель из top-level полей. Это важно, чтобы при включении/выключении одной плашки не появлялся дубль в Discord.

systems examplesРазные панели поддержки
systemsno duplicates
support#поддержка → 📞 Support Tickets → @Support
main
donate#донат-помощь → 💎 Donate Tickets → @Finance
billing
report#жалобы → 🚨 Report Tickets → @Moderation
mod
default legacyсоздаётся только если systems нет
fallback
system fieldsПоля каждой системы
system_idстабильный ID, например support или donate.
nameназвание панели для логов и админки.
panel_channel_idканал, где стоит конкретная плашка.
category_idкатегория, куда создаются каналы тикетов.
log_channel_idкуда отправлять transcript.
support_role_idsstaff-роли именно этой системы.
enabledможно закрыть одну систему, не выключая весь модуль.

Настройка на сайте

Dashboard пишет настройки в data/tickets_settings.json. Cog каждые 5 секунд читает изменения, проверяет deploy_requested и module_states, затем редактирует старые панели по panel_message_id.

channelsКаналы и категория
panel_channel_id / PANEL_CHANNEL_IDканал публичной кнопки.
category_id / CATEGORY_IDкатегория для приватных тикет-каналов.
log_channel_id / LOG_CHANNEL_IDканал логов закрытия и transcript.
panel_message_id / PANEL_MESSAGE_IDID опубликованной панели.
last_panel_channel_idпомогает переносить панель между каналами.
support_role_idsмассив ролей поддержки.
visual settingsОформление панели
custom_title / panel_titleзаголовок embed.
custom_desc / custom_descriptionописание панели.
custom_button_text / button_textтекст кнопки создания.
custom_footerfooter панели.
custom_colorцвет embed-линии.
panel_banner / banner_urlбаннер от сайта или BannerManagerCog.
ticket_welcomeтекст внутри нового тикета.
json previewtickets_settings.json
data/tickets_settings.json
{ "123456789": { "systems": { "support": { "system_id": "support", "name": "Основная поддержка", "panel_channel_id": "111", "category_id": "222", "log_channel_id": "333", "support_role_ids": ["444"], "panel_message_id": "555", "last_panel_channel_id": "111", "enabled": true, "custom_title": "📞 ЦЕНТР ПОДДЕРЖКИ", "custom_button_text": "Создать тикет" } }, "systems_json": "{...}", "deploy_requested": true } }
site syncsite_sync_loop

Каждые 5 секунд

Loop ищет deploy_requested или изменение module_states.json, затем вызывает deploy_all_systems.

deploy_requested → deploy_all_systems → updates

Первичная настройка через Discord

TicketSetupModalЧто вводит админ
📝
modalНастройка тикетов

Поля модального окна

Заголовок панели: 📞 ЦЕНТР ПОДДЕРЖКИ
Описание: Добро пожаловать в систему обращений...
Текст кнопки: Создать тикет
Приветствие в тикете: Опишите ситуацию...
Цвет: #7C3AED
deploy resultПосле сохранения
update_tickets_settings_asyncпишет guild-настройки.
deploy_panelсоздаёт или редактирует панель.
panel_message_idсохраняется для будущих edit.
last_panel_channel_idсохраняется для переноса панели.
deploy_requested = falseпосле успешной публикации.

Что хранится в SQLite

Тикеты хранятся в data/tickets.db. База использует WAL, busy_timeout, индексы по guild/author/status, channel_id, ticket_no и system_id.

tickets tableТаблица tickets
#
ticket_noномер внутри guild
🏠
guild_idсервер
🎫
channel_idканал тикета
👤
author_idсоздатель
📌
statusopen/closed
⚙️
system_idпанель
atomic allocateallocate_ticket
BEGIN IMMEDIATEблокирует гонки при выдаче номера.
MAX(ticket_no)+1номер считается внутри guild_id.
status = openновая запись сразу считается открытой.
mark_ticket_channelпосле создания канала привязывает channel_id.
mark_ticket_closedпри закрытии пишет closed_at и closed_by.

Транскрипты и архивирование

transcript fileКак выглядит TXT
ticket_123456789_0007_transcript.txt
==================================================== ЛОГ ТИКЕТА #0007 | HELPER SYSTEM ==================================================== Сервер : Helper Server (123456789) Название канала : ticket-0007-sasi Дата закрытия : 2026-06-03 22:00:00 UTC Администратор : Admin (111111111) Создатель : 222222222 ==================================================== [2026-06-03 21:59:00] Sasi (222): Здравствуйте, нужна помощь... [2026-06-03 21:59:30] Support (333): Добрый вечер, чем помочь?
log channelEmbed в лог-канале

🔒 ТИКЕТ ЗАКРЫТ | #0007

Переписка была сохранена в виде текстового файла.

Создатель@Sasi
Закрыл@Admin
Каналticket-0007-sasi
Системаsupport

Права бота и staff

01

Manage Channels

Нужно для создания, настройки прав и удаления тикет-каналов.

02

Send Messages

Нужно для публичной панели, welcome-сообщения и системных сообщений.

03

Embed Links

Нужно для красивых embeds панели, тикета и логов.

04

Attach Files

Нужно для отправки transcript-файла в лог-канал.

channel overwritesКому виден тикет
@everyoneне видит приватный канал.
authorвидит, пишет, прикрепляет файлы и читает историю.
support rolesвидят и обрабатывают обращение.
botдолжен иметь доступ для transcript и закрытия.
staff checkКто может закрывать
administratorпроходит всегда.
manage_channelsпроходит как staff.
support_role_idsроли поддержки из текущей ticket-system.
inside ticketдля add/remove/close нужна запись канала в tickets.db.

Если модуль выключен

Отключение через module_states.json не удаляет tickets_settings.json и tickets.db. Новые тикеты блокируются, публичная панель становится красной, но кнопки управления внутри уже созданных тикетов остаются рабочими, чтобы staff мог закрыть старые обращения и не оставлять мусор.

disabled panelЧто видит пользователь
🔌
safe stateTickets disabled

🔌 ЦЕНТР ПОДДЕРЖКИ ОБЕСТОЧЕН

Создание новых тикетов временно отключено администратором. Когда модуль будет включён, рабочая кнопка вернётся автоматически.

🔌 ТИКЕТЫ ОБЕСТОЧЕНЫ
state aliasesКлючи состояния
ticketsосновной ключ.
ticketкороткий alias.
supportalias поддержки.
support_center / support-centerцентр поддержки.
ticket_center / ticket-centerцентр тикетов.
центр_поддержки / тикетырусские alias.

Карта технической логики

filesФайлы модуля
__init__.py

Экспортирует TicketsCog.

cog.py

TicketsCog, deploy_panel, deploy_all_systems, site_sync_loop, /setup_tickets, /tickets_deploy и /ticket.

views.py

CreateTicketView, TicketControlView, ConfirmCloseView, DisabledTicketsPanelView и TicketSetupModal.

database.py

SQLite tickets, ticket_no, channel_id, status, system_id, allocate/close helpers и миграции.

settings.py

normalize_settings, systems_json, get_ticket_systems_from_settings, module aliases и deploy state.

embeds.py / utils.py

panel/disabled embeds, resolve helpers, parse_bool, safe_int, support_role_ids и text/url normalization.

constantsГлавные константы
🎫
TICKETS_FILEtickets_settings.json
🧊
TICKETS_DBtickets.db
🔌
MODULES_FILEmodule_states.json
⚠️
DEPLOY5 attempts
⏱️
SITE_SYNC5 sec
🛡️
BUTTONSpersistent
deploy logicWeb → Discord
deploy_requestedсайт просит пересобрать панели.
deploy_all_systemsобходит все systems и вызывает deploy_panel.
panel_message_idесли сообщение есть — редактируется.
last_panel_channel_idесли канал изменился — старое сообщение удаляется.
MAX_DEPLOY_ATTEMPTSпосле 5 ошибок deploy_requested отключается.
ticket lifecycleЖизненный цикл
allocate_ticketсоздаёт DB-запись и номер.
mark_ticket_channelзаписывает channel_id после создания канала.
find_existing_open_ticketне даёт создать второй открытый тикет.
mark_ticket_closedзакрывает запись и фиксирует staff.
delete_ticket_recordубирает запись при ошибках создания.

Ошибки и решения

/setup_tickets не открывает modal

Проверьте права администратора, вызов команды на сервере и корректность выбранных channel/category/log_channel.

Панель не публикуется

Проверьте panel_channel_id, тип канала TextChannel и права бота Send Messages / Embed Links.

При сохранении появились дубли панелей

Проверьте, что settings используют nested systems. Если systems есть, legacy/default из top-level полей добавляться не должен.

Пользователь не может создать второй тикет

Это штатная защита: find_existing_open_ticket блокирует второй открытый тикет в одной системе.

Категория тикетов удалена

Создание тикета остановится с сообщением “Категория для тикетов удалена или не найдена”. Выберите новую category_id на сайте.

Staff не может закрыть тикет

Проверьте Administrator, Manage Channels или support_role_ids текущей ticket-system.

Транскрипт не отправился

Проверьте log_channel_id и права бота отправлять сообщения и файлы в лог-канал.

Модуль выключен, но старые тикеты закрываются

Это специально: новые тикеты не создаются, но старые обращения можно безопасно закрыть и удалить.

// WIKI_NAVIGATION

Вернуться к списку Wiki

Ты дошёл до конца страницы Tickets. Можно вернуться в общий центр документации, открыть Dashboard или подняться наверх к началу этой страницы.