HELPER TICKETS ЦЕНТР ПОДДЕРЖКИ /SETUP_TICKETS / TICKETS_DEPLOY / TICKET ADD REMOVE / TRANSCRIPT LOGS
Tickets превращает поддержку сервера в аккуратную систему: пользователь нажимает кнопку, HELPER создаёт приватный канал обращения, выдаёт доступ автору и support-ролям, ведёт номер тикета, а staff может добавить участника, удалить участника, закрыть обращение и сохранить TXT-транскрипт в лог-канал. Новая версия поддерживает несколько независимых тикет-панелей через systems, не создавая дублей.
Что делает Tickets Core
Модуль создаёт приватные каналы обращений. В обычном сценарии пользователь нажимает кнопку, бот проверяет активность модуля, находит нужную тикет-систему по message_id/channel_id, проверяет открытую категорию, создаёт запись в SQLite, открывает канал и отправляет внутрь welcome-сообщение с кнопками управления.
Панель
Публичный embed с кнопкой “Создать тикет”. Текст, цвет, баннер и footer меняются с сайта.
Приватный канал
Канал создаётся в выбранной категории и доступен автору, боту и support-ролям.
Staff Control
Внутри тикета есть кнопки закрытия, добавления и удаления пользователей.
Transcript
При закрытии бот собирает историю сообщений, отправляет TXT в лог-канал и удаляет канал.
Больше информации картинками
Ниже весь путь глазами покупателя: настройка, публичная панель, создание тикета, приватный канал, staff-кнопки, подтверждение закрытия, лог с transcript, multi-system и safe disabled-state.
Команды Discord
У модуля есть отдельные admin-команды для установки и redeploy, плюс sub-команды управления пользователями внутри открытого тикета.
/setup_tickets setup_channel:#поддержка category:📞 Тикеты log_channel:#тикет-логи support_role:@SupportОткрывает TicketSetupModal, сохраняет базовые настройки, включает модуль и публикует панель.
/tickets_deployПересобирает все настроенные тикет-системы сервера. Если есть nested systems, обновляет каждую систему отдельно.
/ticket add user:@PlayerДобавляет пользователя в текущий тикет. Команда работает только внутри тикет-канала и требует staff-доступ.
/ticket remove user:@PlayerУдаляет пользователя из текущего тикета, снимая его permission overwrite в канале.
Путь тикета от кнопки до архива
button
system
allocate
private
staff
close
Panel routing
Бот определяет систему по message_id и channel_id, поэтому разные панели могут вести в разные категории.
SQLite ticket_no
Номер тикета выделяется атомарно по guild_id, чтобы #0001/#0002 не ломались между серверами.
Safe close
Закрытие требует подтверждения, формирует transcript, помечает тикет закрытым и удаляет канал.
Что видит обычный пользователь
Что делает support-команда
Staff-доступ получают администраторы, пользователи с Manage Channels или роли из support_role_ids. Внутри тикета команда может управлять участниками и закрывать обращения.
Закрывает
Кнопка “Закрыть тикет” открывает ConfirmCloseView с подтверждением.
Добавляет
UserSelect выдаёт права конкретному пользователю на просмотр и отправку сообщений.
Удаляет
Удаление пользователя снимает overwrite и пишет системное сообщение в канал.
Архивирует
После закрытия лог с transcript уходит в log_channel_id.
administratorадминистратор сервера проходит всегда.manage_channelsпользователь с Manage Channels проходит проверку.support_role_idsнесколько ролей поддержки.support_role_idlegacy одиночная роль.aliasesstaff_role_ids, moderator_role_ids, allowed_role_ids, access_role_ids.Несколько тикет-панелей
В новой логике systems — главный источник правды. Если systems уже есть, бот не создаёт отдельную legacy/default-панель из top-level полей. Это важно, чтобы при включении/выключении одной плашки не появлялся дубль в Discord.
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.
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массив ролей поддержки.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текст внутри нового тикета.Первичная настройка через Discord
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.
ticket_noномер внутри guildguild_idсерверchannel_idканал тикетаauthor_idсоздательstatusopen/closedsystem_idпанельBEGIN IMMEDIATEблокирует гонки при выдаче номера.MAX(ticket_no)+1номер считается внутри guild_id.status = openновая запись сразу считается открытой.mark_ticket_channelпосле создания канала привязывает channel_id.mark_ticket_closedпри закрытии пишет closed_at и closed_by.Транскрипты и архивирование
Права бота и staff
Manage Channels
Нужно для создания, настройки прав и удаления тикет-каналов.
Send Messages
Нужно для публичной панели, welcome-сообщения и системных сообщений.
Embed Links
Нужно для красивых embeds панели, тикета и логов.
Attach Files
Нужно для отправки transcript-файла в лог-канал.
@everyoneне видит приватный канал.authorвидит, пишет, прикрепляет файлы и читает историю.support rolesвидят и обрабатывают обращение.botдолжен иметь доступ для transcript и закрытия.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 мог закрыть старые обращения и не оставлять мусор.
ticketsосновной ключ.ticketкороткий alias.supportalias поддержки.support_center / support-centerцентр поддержки.ticket_center / ticket-centerцентр тикетов.центр_поддержки / тикетырусские alias.Карта технической логики
Экспортирует TicketsCog.
TicketsCog, deploy_panel, deploy_all_systems, site_sync_loop, /setup_tickets, /tickets_deploy и /ticket.
CreateTicketView, TicketControlView, ConfirmCloseView, DisabledTicketsPanelView и TicketSetupModal.
SQLite tickets, ticket_no, channel_id, status, system_id, allocate/close helpers и миграции.
normalize_settings, systems_json, get_ticket_systems_from_settings, module aliases и deploy state.
panel/disabled embeds, resolve helpers, parse_bool, safe_int, support_role_ids и text/url normalization.
TICKETS_FILEtickets_settings.jsonTICKETS_DBtickets.dbMODULES_FILEmodule_states.jsonDEPLOY5 attemptsSITE_SYNC5 secBUTTONSpersistentdeploy_requestedсайт просит пересобрать панели.deploy_all_systemsобходит все systems и вызывает deploy_panel.panel_message_idесли сообщение есть — редактируется.last_panel_channel_idесли канал изменился — старое сообщение удаляется.MAX_DEPLOY_ATTEMPTSпосле 5 ошибок deploy_requested отключается.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 и права бота отправлять сообщения и файлы в лог-канал.
Модуль выключен, но старые тикеты закрываются
Это специально: новые тикеты не создаются, но старые обращения можно безопасно закрыть и удалить.