HELPER LICENSING КЛЮЧИ И ДОСТУП /ACTIVATE / LICENSE STATUS / OWNER PANEL / BOOSTY ROLE CLAIM
Licensing превращает HELPER в коммерческий продукт: владелец создаёт ключи Base / Premium / Ultra, клиент активирует ключ на своём сервере, а бот ведёт подписку, срок действия, blacklist, audit history, Boosty-выдачу и owner-only панель управления продажами.
Что делает Licensing
Это закрытый owner-only модуль продажи доступа к HELPER. Он создаёт ключи, активирует подписки на серверы, не даёт активировать ключи blacklist-пользователям и blacklist-серверам, ведёт историю использованных ключей, предупреждает об истечении срока и помогает автоматизировать выдачу ключей через Boosty.
Ключи
Base, Premium и Ultra с заданным сроком, комментарием и создателем.
Активация
Клиент вводит /activate, ключ переносится из stock в used_keys.
Подписка
В subscriptions хранится tier, expires_at, owner_id и предупреждения.
Контроль
Owner видит audit, меняет сроки, блокирует цели и делает broadcast.
Больше информации картинками
Ниже показан весь путь: получение ключа, активация, status, owner panel, bulk generation, audit, blacklist, Boosty claim и предупреждение об истечении.
Команды Discord
Клиентские команды отделены от owner-команд. Клиент активирует и проверяет подписку, владелец управляет продажами.
/activate key:HLPR-PREM-9F2A-K7QX-M2LAАктивирует ключ на текущем сервере, обновляет subscriptions и переносит ключ в used_keys.
/license_statusПоказывает текущий статус лицензии сервера: тир, активность, срок и owner_id.
/admin_panel_init channel:#private-owner-panelСоздаёт приватную owner-панель с кнопками генерации ключей, bulk, audit, blacklist и настроек.
GenerateKeyModal
BulkKeyModal
AuditModal
EditTimeModal
BlacklistModal
BroadcastModal
ConfigModalОсновная работа владельца идёт кнопками и modal-окнами, а не отдельными ручными командами.
Путь клиента от покупки до доступа
пакет
HLPR-...
/activate
subscription
PNG + embed
modules
Ключ не тратится зря
Blacklist и проверки проходят до успешной активации, чтобы не сжечь ключ в плохом сценарии.
Сервер запоминается
Подписка привязана к guild_id, tier, expires_at и owner_id.
Owner-log
Владелец видит, кто активировал ключ, на каком сервере и какой пакет куплен.
Owner-панель управления продажами
Панель доступна только владельцу бота. Она нужна для ручных продаж, массовой выдачи ключей, аудита клиентов, изменения сроков, блокировок, рассылок и настройки лог-канала / баннера.
Boosty авто-выдача ключей
Когда пользователю дают Boosty-роль, бот сверяет её с картой ролей, создаёт ключ нужного tier/days, записывает boosty_role_state и отправляет claim-кнопку. Если роль снимается, неиспользованный ключ можно отозвать.
выдали роль
tier/days
generated
button
key
boosty log
Base role10 дней доступа.Premium role30 дней доступа.Ultra role9999 дней доступа.BOOSTY_ROLE_MAP_JSONможно заменить карту через ENV.Renew / Upgrade и защита от понижения
Новая подписка
У сервера не было активного доступа. Ключ создаёт новую subscription.
Продление
Если tier совпадает, срок увеличивается, а уровень остаётся прежним.
Upgrade
Если куплен tier выше текущего, активный уровень повышается.
Без понижения
Если сервер Ultra, а купили Base, срок продлевается, но tier не падает.
new✅ Новая подписка активирована.renew🔁 Подписка продлена.upgrade⬆️ Подписка повышена.extend_higher🛡️ Продление без понижения.Activation Card
GraphicsEngine рисует отдельную картинку активации 1120×420: фон, glow, grid, иконку сервера, tier, статус и режим активации.
Baseсиний / cyan стиль.Premiumзолотой / yellow стиль.Ultraфиолетовый / violet стиль.extend_higherособая подпись: куплен ниже, сохранён выше.Защита и контроль
Owner-only
Панель и modal-окна проверяют is_owner_user перед действием.
Blacklist
Можно блокировать guild или user, чтобы ключи не активировались.
Transaction
Ключ переносится атомарно: stock → used_keys → subscription.
Logs
Активации, истечения, Boosty и аудит уходят в owner-log канал.
Почему это owner-only
Эта Wiki может быть публичной как описание продукта, но реальные команды генерации ключей, blacklist, audit и broadcast должны быть доступны только владельцу бота.
Что хранится в базе
keysключи на складеused_keysактивацииsubscriptionsдоступ серверовblacklistблокировкиconfigлог и баннерboosty_role_stateроль → ключguild_idсервер клиента.tierBase / Premium / Ultra.expires_atдата окончания доступа.warned_3d / warned_1dфлаги предупреждений.owner_idвладелец сервера для уведомлений.Что нужно настроить
OWNER_GUILD_IDсервер владельца / служебный сервер.OWNER_IDSID владельцев, которым доступна панель.ADMIN_LOG_CHANNEL_IDкуда отправлять owner-log.ADMIN_BANNERбаннер owner-панели и лицензий.BOOSTY_ROLE_MAP_JSONпереопределение ролей Base/Premium/Ultra.Карта технической логики
data/licenses.db — основная SQLite-база лицензий.
LicensingCog, /activate, /license_status, owner logs и license_checker.
LicenseDB, таблицы, генерация ключей и активация.
GraphicsEngine рисует activation card 1120×420.
Owner-панель, claim key view и modal-окна управления.
MAX_BULK_KEYS500 ключейLICENSE_CHECK6 часовCLAIM_TIMEOUT86400 секVALID_TIERS3 пакетаMAX_DAYS36500WALSQLite modesanitize_license_keyнормализует ключ.is_blacklistedпроверяет guild/user blacklist.activate_keyтранзакционно обновляет ключ и подписку.build_activation_admin_embedсоздаёт embed с mode_text.create_activation_cardрисует PNG-карточку лицензии.license_checkerкаждые 6 часов читает subscriptions.warned_3dпредупреждение за 3 дня.warned_1dпредупреждение за 1 день и expired-state.owner lookupпытается найти owner по guild или owner_id.Ошибки и решения
Клиент пишет, что ключ не работает
Проверьте audit по ключу: он может быть уже использован, отозван после Boosty или введён с ошибкой.
Сервер не получил доступ после активации
Проверьте subscriptions по guild_id, expires_at и blacklist. Для доступа важен active subscription.
Панель не нажимается
AdminControlView доступна только владельцу бота. Проверьте OWNER_IDS или bot.is_owner.
Bulk не создаёт ключи
Количество должно быть числом от 1 до 500. При ошибке уникальности смотрите логи генерации.
Boosty ключ не пришёл в ЛС
Пользователь мог закрыть личные сообщения. ClaimKeyView вернёт понятное сообщение об ошибке.
Срок закончился, но запись осталась
Это нормально: запись subscriptions не удаляется сразу, чтобы сайт мог отличить “истекла” от “нет подписки”.