MAATRIX GAMES / Блог / Гивевей-бот для розыгрышей в сообществе

Гивевей-бот для розыгрышей в сообществе

MAATRIX GAMES

Розыгрыш в Discord-сообществе — это когда полсотни человек ставят реакцию под сообщением, а потом кто-то из админов «на глаз» выбирает победителя. Проблема в том, что даже честный выбор со стороны выглядит подозрительно, если его не видно математически, а нечестный — рано или поздно всплывёт в чате с криками «схема». Разберём, как поставить гивевей на автоматику: бот сам собирает участников, сам крутит рандом и сам режет накрутку альтами, а вам остаётся только объявить условия и приз.

Почему ручной розыгрыш в чате — плохая идея

Ручной розыгрыш обычно выглядит так: админ просит поставить emoji под постом, потом копирует список ников в блокнот, а победителя выбирает через генератор случайных чисел на сайте или банально «на глаз». Здесь минимум три дыры.

Во-первых, нет прозрачности: игроки не видят, как считались голоса, и любой каприз рандома читается как договорняк. Во-вторых, ручной сбор участников — это боль на 200+ реакций: копипаст ников из списка реакций Discord неудобен даже через API, не говоря уже про глазами. В-третьих, никто не проверяет, что за 15 однотипных аккаунтов, зарегистрированных вчера, не стоит один человек с фарм-ботом.

Автоматизация закрывает все три пункта разом: бот логирует список участников в момент завершения розыгрыша, выбирает победителя через криптографически стойкий рандом (а не Math.random() пополам с настроением), и может сразу отсеять аккаунты, которые физически не могли быть живыми игроками сообщества. О более широких принципах честных ивентов уже писали в статье про конкурсы и розыгрыши в сообществе — здесь сфокусируемся конкретно на технической части.

Выбираем инструмент: готовый бот или самопальный скрипт

Есть два рабочих пути, и оба нормальные — выбор зависит от того, сколько у вас времени и насколько кастомные правила участия нужны.

Готовый бот — быстрее в 10 раз, но условия участия ограничены тем, что заложил разработчик. Подходит, если правила простые: «поставь реакцию, будь на сервере N дней».

Свой бот на discord.js — дольше в настройке (час-два, если знаком с Node.js), зато условия любые: проверка привязанного игрового ника, роль по донату, статус в вашей RCON-панели, что угодно. Плюс код целиком у вас, не зависите от аптайма чужого сервиса.

ВариантВремя на стартГибкость условийГде хранить конфиг
Carl-bot / MEE6 (готовые)10-15 минутОграниченная (роли, время)В самом боте
discord-giveaways (свой бот)1-3 часаЛюбая, свой код на JSJSON/SQLite на вашем сервере
Ручной скрипт на реакциях30 минутСредняя, без UIОтдельный процесс

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

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Настройка гивевея на встроенном боте

Разберём на примере Carl-bot — он бесплатный в базовой версии и достаточно гибкий для 90% случаев. Логика похожая у MEE6 и у большинства ботов этого класса, отличаются только названия команд.

  1. Добавьте бота на сервер через официальный сайт бота с правами на отправку сообщений и управление реакциями в канале розыгрышей.
  2. Создайте отдельный канал #розыгрыши, чтобы гивевеи не терялись в общем чате.
  3. Запустите розыгрыш командой вида:
/giveaway start
duration: 24h
winners: 1
prize: Discord Nitro на месяц
  1. Бот опубликует эмбед с призом, временем окончания и реакцией 🎉 — участие засчитывается по клику на эту реакцию.
  2. Дополнительные условия участия задаются через требование роли:
/giveaway start
duration: 24h
winners: 1
prize: VIP-статус на сервере
required_role: @Участник

Роль @Участник в этом примере — это роль, которую бот статистики или модерации выдаёт автоматически после недели активности на сервере, а не сразу при входе. Это уже первый и самый простой барьер против накрутки: свежесозданный альт роль не получит физически, даже если поставит реакцию.

  1. По завершении бот сам выбирает победителя и публикует результат в тот же канал — никакого ручного вмешательства.
  2. Если победитель не откликнулся или зафейлил проверку — есть команда реролла:
/giveaway reroll

Она перевыбирает случайного участника из оставшегося пула, не трогая исходный список — это важно, чтобы не пришлось объяснять сообществу, откуда взялся «новый» список голосов.

Свой бот на discord.js и discord-giveaways

Если готовых команд не хватает — например, нужно проверить донат-статус игрока через вашу базу или привязку Steam/игрового ника — пишем модуль сами. Библиотека discord-giveaways на npm закрывает всю рутину (эмбеды, таймер, реролл), вам остаётся только описать условия и приз.

Установка на Node.js 18+:

npm init -y
npm install discord.js discord-giveaways

Базовый скелет бота:

const { Client, GatewayIntentBits } = require('discord.js');
const { GiveawaysManager } = require('discord-giveaways');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.GuildMessageReactions,
    GatewayIntentBits.MessageContent,
  ],
});

client.giveawaysManager = new GiveawaysManager(client, {
  storage: './giveaways.json',
  updateCountdownEvery: 5000,
  default: {
    botsCanWin: false,
    embedColor: '#FF0000',
    reaction: '🎉',
  },
});

client.on('ready', () => console.log(`Бот запущен как ${client.user.tag}`));
client.login(process.env.DISCORD_TOKEN);

Запуск розыгрыша с кастомной проверкой участников — например, отсекаем аккаунты младше 30 дней прямо в коде:

client.giveawaysManager.start(channel, {
  duration: 24 * 60 * 60 * 1000, // 24 часа в мс
  winnerCount: 1,
  prize: 'Игровой сервер на месяц',
  hostedBy: 'Администрация',
  exemptMembers: (member) => {
    const accountAgeDays = (Date.now() - member.user.createdTimestamp) / 86400000;
    return accountAgeDays < 30; // true = не может участвовать
  },
});

Такой бот удобно держать на той же машине, что и админ-панель сервера, или на отдельном лёгком VPS — процессу под Node.js хватает 256-512 МБ памяти, ресурсоёмкость минимальная, конфликтов с игровым сервером не будет даже на одной ноде. Хранить giveaways.json в git не стоит — там id сообщений и служебные данные конкретного розыгрыша, файл живёт локально рядом с ботом.

Честный выбор победителя: как это устроено технически

Ключевой вопрос, который рано или поздно задаст сообщество: «а откуда мы знаем, что выбор реально случайный?» Ответ должен быть не «поверьте нам», а объяснимый механизм.

Библиотека discord-giveaways и большинство встроенных ботов используют генератор случайных чисел из стандартной библиотеки языка (Math.random() в Node.js) поверх собранного массива ID участников — сам массив собирается по списку реакций на момент окончания таймера, без ручного редактирования. Для розыгрышей внутри игрового сообщества этого достаточно: ставки не биржевые, задача — не дать возможность подкрутить результат руками, а не выдержать криптографический аудит.

Если хочется дополнительной прозрачности — публикуйте до розыгрыша число участников (счётчик реакций виден всем в реальном времени), а после — сид или timestamp, по которому был произведён выбор. Это не обязательный шаг, но снимает вопросы у самых недоверчивых.

Отдельно: никогда не выбирайте победителя вручную «для подстраховки», даже если бот выбрал неудобного человека (например, того, кто выиграл уже третий раз подряд). Если это реальная проблема — решайте её правилом «не участвовать 30 дней после победы» на уровне логики бота, а не разовым ручным вмешательством, которое потом невозможно объяснить.

Защита от накрутки альтами: фильтры и ручная проверка

Накрутка через мультиаккаунты — самая частая головная боль гивевеев с ценным призом (VIP-статус, донат-валюта, редкий скин). Один человек создаёт 10-20 свежих аккаунтов, заходит на сервер, ставит реакцию отовсюду — и статистически повышает шанс на выигрыш кратно. Полностью убрать это нельзя, но можно сделать невыгодным.

Работающая связка фильтров:

  • Возраст аккаунта Discord. Минимум 14-30 дней с момента регистрации — самый эффективный и самый простой фильтр, отсекает 90% ботоферм с нуля.
  • Время на сервере. Требуйте роль, которая выдаётся не раньше чем через неделю после входа (см. пример с Carl-bot выше) — так альт, созданный специально под розыгрыш, физически не успевает.
  • Верификация уровня сервера. В настройках Discord-сервера включите Verification Level "Medium" или выше — Discord сам режет часть свежих и непривязанных к телефону аккаунтов ещё до входа.
  • Привязка игрового аккаунта. Если у вас есть бот с привязкой Steam ID / никнейма к Discord-профилю через RCON или базу данных сервера — требуйте привязку для участия. Один живой игровой аккаунт физически не размножить так же легко, как Discord-профиль.
  • Ручной аудит топ-подозрительных. Перед объявлением победителя (если приз ценный) можно вручную посмотреть на аватар, дату создания и активность выигравшего аккаунта — 30 секунд работы модератора против явного мультиаккаунта.

Учтите нюанс: слишком жёсткие фильтры (например, требование быть на сервере 90 дней) режут и обычных новых игроков, которых как раз хочется затянуть в комьюнити гивевеем. Баланс здесь важнее жёсткости — для большинства серверов достаточно связки «аккаунт старше 30 дней + неделя на сервере», без верификации по телефону и привязки Steam.

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

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Частые вопросы

Можно ли проводить гивевей без бота, просто вручную?

Технически да, но с ростом сообщества это быстро превращается в источник недоверия — ручной подсчёт реакций и рандом «на глаз» невозможно объективно доказать, даже если вы никого не обманывали.

Что делать, если победитель не отвечает на объявление?

Используйте встроенную команду реролла (/giveaway reroll в Carl-bot, аналог есть и в discord-giveaways через client.giveawaysManager.reroll()) — она выбирает нового победителя из того же пула без пересбора участников.

Стоит ли давать призом донат-валюту или лучше физические товары?

С точки зрения гивевей-механики разницы нет, вопрос в легальности и налогах — если приз имеет денежный эквивалент, стоит свериться с нюансами, разобранными в статье про донат-систему на игровом сервере.

Нужен ли отдельный сервер или VPS под бота гивевеев?

Нет, если бот один и лёгкий — Node.js-процесс с discord-giveaways спокойно живёт на той же машине, что и другие ваши боты, ресурсов уходит минимум.

Как быть, если Discord-бот встроенного типа (Carl-bot, MEE6) исчезнет или изменит условия использования?

Это риск любого стороннего сервиса — если розыгрыши для вас регулярный процесс, разумно держать резервный вариант на своём коде, который не зависит от чужого аптайма.