HELPER Discord Bot
К списку Wiki
GIVEAWAY CORE // PRIZE ENGINE // REROLL WINDOW

HELPER GIVEAWAYS РОЗЫГРЫШИ DISCORD PANEL / WEB PENDING / RESULT CHANNEL / WINNER REROLL

Giveaways делает из обычной кнопки “участвовать” полноценный prize-flow: администратор разворачивает панель, запускает приз через Discord Modal или Dashboard, участники записываются одной кнопкой, а HELPER сам выбирает победителей, публикует итог, хранит историю и даёт администрации короткое окно для перевыбора.

25победителей максимум
60sокно reroll
10ssite sync loop
DBgiveaways + results
Panel/giveaway_setup ставит центр призов
Modalприз, время, победители, баннер
Liveсчётчик участников обновляется
Resultитоги уходят в канал победителей
Safetyatomic DB и anti-duplicate

Что делает Giveaways

Модуль розыгрышей создаёт готовую активность для Discord-сервера: панель запуска призов, живые сообщения розыгрышей, запись участников, автоматическое завершение, случайный выбор победителей, канал итогов и перевыбор.

01

Развернуть панель

Админ задаёт канал розыгрышей, канал итогов и staff-роль.

02

Создать приз

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

03

Собрать участников

Игроки нажимают “Участвовать”; повторная запись блокируется базой.

04

Выдать итог

Бот выбирает победителей, публикует результат и открывает короткий reroll.

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

Ниже показан весь путь глазами владельца и игрока: панель, modal, live giveaway, успешное участие, завершение, результат, reroll и сайт.

01 / setup panelПанель розыгрышей
🎁
HELPER GIVEAWAYSПАНЕЛЬ РОЗЫГРЫШЕЙ

🎁 ПАНЕЛЬ РОЗЫГРЫШЕЙ

Здесь руководство сервера может запускать розыгрыши для состава.

GIVEAWAY HUB BANNER
➕ Создать розыгрыш
⚙️ Завершить досрочно
📊 Активные
02 / create modalСоздание розыгрыша
📝
Discord ModalСоздать розыгрыш

Поля формы

Приз: VIP на 7 дней
Длительность: 2h / 30m / 1d 3h
Победителей: 2
Роль для пинга: @VIP Winner
Баннер: https://cdn.server/drop.png
03 / live giveawayПубличный розыгрыш
🎁
#giveawaysРозыгрыш активен

🎁 РОЗЫГРЫШ

Приз: Nitro / VIP / Coins
Победителей: 3
Участников: 128

PRIZE POOL
🎟️ Участвовать
04 / player responseИгрок участвует
🎟️
ephemeral responseУчастие записано

✅ Вы успешно участвуете!

Ответ видит только игрок. Канал не засоряется, а счётчик участников обновляется на публичной плашке.

dirty queue → update embed
05 / resultИтоги розыгрыша
🏆
#giveaway-resultsПобедители

🏆 ИТОГИ РОЗЫГРЫША

🎁 Приз: VIP на 7 дней
👥 Участников: 128

👑 1. @PlayerOneпобедитель выбран случайно
👑 2. @PlayerTwoполучает роль, если задана
🔄 Перевыбрать победителя · 60с
06 / reroll closedReroll закрыт

⏰ Перевыбор закрыт

После короткого окна кнопка становится серой и disabled, чтобы результат не меняли бесконечно.

⏰ ПЕРЕВЫБОР ЗАКРЫТ

Команды Discord

Команды закрыты правами администратора или staff-ролями управления. Обычный игрок взаимодействует только с кнопкой “Участвовать”.

setup/giveaway_setup
/giveaway_setup giveaway_channel:#giveaways results_channel:#winners staff_role:@Event Manager

Разворачивает панель розыгрышей, задаёт канал активных призов, канал итогов и staff-роль.

deploy/giveaway_deploy
/giveaway_deploy

Обновляет панель после правок на сайте или ручного изменения настроек.

end/giveaway_end
/giveaway_end message_id:123456789012345678

Досрочно завершает активный розыгрыш по ID сообщения и публикует результат.

owner migration/giveaway_migrate_db
/giveaway_migrate_db

Owner-команда для переноса старого data/giveaways.json в новую SQLite-структуру.

Путь розыгрыша от панели до итога

1Panel

центр призов

2Modal

приз/время

3Join

участники

4Timer

check loop

5Result

победители

6Reroll

60 секунд

A

Atomic join

Участие сохраняется через транзакцию, а дубль получает статус already.

B

Dirty queue

Плашки обновляются пачками, чтобы не бить Discord rate-limit при массовых кликах.

C

Ending lock

Завершение защищено от дублей через статус ending и lock по message_id.

Что видит игрок

joinУчастие

✅ Вы успешно участвуете!

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

🎟️ join_giveaway_v5
alreadyПовторный клик

ℹ️ Вы уже участвуете

Повторные клики не создают дублей: участник хранится по паре message_id + user_id.

unique participant
endedПоздно участвовать

❌ Розыгрыш завершён

Если таймер истёк или статус уже не active, HELPER не принимает новых участников.

status ended / ending
cooldownAnti-spam

⏳ Подождите пару секунд

Кнопка имеет cooldown на пользователя, чтобы не спамить БД и Discord API.

2 sec / user

Что делает админ

01

Настраивает панель

Выбирает канал розыгрышей, канал итогов и staff-роль.

02

Запускает приз

Вводит prize, duration, winners_count, role_ping и banner_url.

03

Завершает досрочно

Через /giveaway_end или manage select на панели.

04

Делает reroll

В течение 60 секунд может перевыбрать победителя.

Победители и перевыбор

После завершения HELPER выбирает случайных победителей, сохраняет result record, публикует итог и запускает таймер закрытия reroll-кнопки.

result cardКанал итогов

🏆 ИТОГИ РОЗЫГРЫША

Приз: 500 000 coins
Участников: 84
Победителей: 3

👑 @WinnerOneвыбран случайно
👑 @WinnerTwoполучает награду
historyИстория reroll
result historylimit 10
Первый итог@PlayerOne, @PlayerTwo
saved
Reroll #1@PlayerTwo заменён на @PlayerNine
reroll
Окно закрытокнопка стала disabled
60s

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

Dashboard работает через data/giveaways_settings.json. Он может развернуть панель, обновить визуал, создать pending_giveaways и отправить их в Discord через site_sync_loop.

dashboard panelНастройки панели
panel_channel_idканал, где стоит панель розыгрышей.
giveaway_channel_idlegacy alias канала активных розыгрышей.
results_channel_idканал итогов и победителей.
staff_role_idsроли, которые могут создавать и завершать розыгрыши.
custom_title/custom_descтекст панели запуска.
custom_bannerfallback-баннер, если общий центр баннеров не задан.
pending queueСоздание с сайта
giveaways_settings.json
{ "123456789": { "panel_channel_id": "111", "results_channel_id": "222", "pending_giveaways": [ { "prize": "VIP на 7 дней", "duration": "2h", "winners": 2, "role_id": "333", "banner_url": "https://cdn.server/drop.png" } ], "deploy_requested": true } }
sync loopsite_sync_loop

10 секунд

Цикл читает pending_giveaways, создаёт до 10 розыгрышей за проход, обновляет deploy и пишет last_pending_* статусы.

pending_giveaways → Discord
banner priorityБаннеры
banners_settings.jsonобщий центр баннеров имеет приоритет для ключа giveaways.
custom_bannerиспользуется как fallback старой настройки.
DEFAULT_BANNERпоследний fallback, если пользователь ничего не настроил.

Примеры розыгрышей

NITRO DROP

Discord Nitro

Классический публичный розыгрыш для активности community.

VIP PASS

VIP / Premium

Победитель получает роль или подписку на сервере.

COINS EVENT

Экономика

Coins, предметы магазина, внутриигровая валюта или сезонные бонусы.

SEASON GIFT

Сезонный подарок

Новый год, турнир, летний сезон, RP-ивент или anniversary.

ROLE ACCESS

Доступ к роли

Победители получают временную или постоянную роль.

SHOP COUPON

Промокод

Розыгрыш скидки, купона, личной комнаты или услуги.

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

Отключение закрывает создание, участие и reroll, но не удаляет активные и завершённые данные.

disabled embedЧто видит пользователь
🔌
safe stateМодуль отключён

🔌 МОДУЛЬ РОЗЫГРЫШЕЙ ОТКЛЮЧЁН

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

🔌 РОЗЫГРЫШИ ОБЕСТОЧЕНЫ
module stateПочему безопасно
module_states.jsonхранит состояние giveaways / giveaway / giveaways_module / розыгрыши.
ProtectedViewпроверяет статус перед кнопками участия и reroll.
build_panel_payloadстроит disabled-панель вместо рабочей кнопки.
databaseданные не удаляются при выключении.

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

filesФайлы и данные
SETTINGS_FILE

data/giveaways_settings.json — настройки панели, каналов, ролей, pending_giveaways и deploy.

GIVEAWAYS_DB

data/giveaways.db — активные розыгрыши, участники и результаты.

site_sync_loop

каждые 10 секунд читает pending_giveaways и deploy_requested.

check_giveaways

каждые 15 секунд проверяет активные розыгрыши и завершает истёкшие.

update_dirty_giveaways

каждые 8 секунд обновляет плашки, где изменился счётчик участников.

database tablesSQLite
🎁
giveawaysпризы и статусы
🎟️
giveaway_participantsучастники
🏆
giveaway_resultsитоги и reroll
🔒
BEGIN IMMEDIATEatomic actions
giveaways tableГлавные поля
message_idID Discord-сообщения розыгрыша.
guild_id/channel_idсервер и канал активного приза.
prize/end_timeприз и время завершения.
winners/participantsколичество победителей и JSON-список участников.
statusactive / ending / ended.
result tableИтоги
result_message_idID сообщения итогов.
original_message_idисходный розыгрыш.
winners/historyпобедители и история перевыборов.
endedзакрыто ли окно reroll.

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

Панель не появилась после /giveaway_setup

Проверьте права бота в канале: Send Messages и Embed Links. Для баннера также нужен доступ к изображению.

Игрок пишет, что уже участвует

Это нормально: один user_id может быть записан в один message_id только один раз.

Розыгрыш не завершается

Проверьте check_giveaways loop, статус active/ending и корректный ISO end_time в базе.

Почему reroll пропал?

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

Сайт не создал розыгрыш

Проверьте pending_giveaways, panel_channel_id, права бота, duration и last_pending_error в settings JSON.

Баннер не тот

Приоритет такой: общий центр баннеров key giveaways → custom_banner/banner_url → DEFAULT_BANNER.

// WIKI_NAVIGATION

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

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