/кадр-итоги
Закрывает текущую неделю досрочно: считает голоса, объявляет победителей и начинает новую неделю.
Канал со скриншотами обычно живёт сам по себе: кто-то выкладывает кадр, кто-то отвечает на него тремя строчками обсуждения, и через неделю найти в этой ленте хорошую картинку уже невозможно, а лучшие работы никто не замечает. «Кадр недели» превращает такой канал в конкурс с понятными правилами. Всё, что попало в него без картинки, бот убирает и спокойно объясняет автору почему; под каждым принятым кадром появляется кнопка голоса со счётчиком. Раз в неделю, в выбранный владельцем день и час, бот сам закрывает неделю: называет тройку лучших, упоминает авторов и выдаёт победителю роль на заданное число дней, а когда срок выйдет — снимает её сам. Прошлые недели собираются в витрину: одно сообщение, которое обновляется само и ведёт на сами кадры, а не на файлы, ссылки на которые у Discord живут недолго. От модерации не требуется ничего: ни считать голоса, ни помнить про воскресенье.
Весь путь целиком, шаг за шагом. Справа — то, что реально увидят на вашем сервере.
Всё, что попадает в выбранный канал без картинки, бот убирает. Объяснение уходит автору в личные сообщения, а если личные закрыты — короткой запиской прямо в канал, которая исчезает сама через сорок пять секунд. Если у бота нет права «Управление сообщениями», он не трогает ничего и пишет об этом в журнал: обещать человеку, что его сообщение убрано, и оставить его на месте — хуже, чем промолчать.
Под каждым принятым кадром бот вешает своё сообщение с кнопкой: чужое сообщение он редактировать не может, компоненты добавляются только к своим. Счётчик стоит прямо на кнопке и виден всем сразу. Один человек — один голос за кадр, за свой кадр голосовать нельзя, повторное нажатие снимает голос. Голоса лежат в базе с ключом «кадр плюс человек», поэтому два быстрых нажатия ничего не задваивают, а счётчик каждый раз пересчитывается по таблице, а не прибавляется на единицу.
Владелец задаёт, сколько кадров в сутки может выложить один человек. Считаются последние двадцать четыре часа, а не календарный день, и считает это сама база: процесс бота живёт по UTC, база по Москве, и подсчёт в коде ошибался бы на три часа. Кадр сверх потолка убирается с таким же спокойным объяснением, как и сообщение без картинки. Ноль в настройке означает «не ограничивать».
Раз в неделю, в выбранный день и час по московскому времени, бот закрывает неделю: считает кадры, выложенные с прошлого подведения, отбирает призовые места и объявляет их с упоминанием авторов — в отдельный канал итогов или в сам канал конкурса. Неделя захватывается одним атомарным запросом, поэтому расписание и команда владельца не подведут одни и те же итоги дважды. Если бот пролежал свой час, итоги уйдут при первой возможности, а не пропадут совсем. Перед объявлением каждый претендент проверяется: кадр, удалённый автором уже после голосования, в тройку не попадёт, и ссылка в витрине не поведёт в пустоту.
Победителю выдаётся выбранная роль на заданное число дней. Перед выдачей бот проверяет, что роль существует, не служебная и стоит ниже его собственной: иначе Discord откажет, и владелец узнает об этом из журнала, а не из тишины. Срок хранится в базе её же выражением и поэтому переживает любой перезапуск. Раз в пять минут бот проходит по вышедшим срокам и снимает роль, а если в этот момент снять её нельзя — оставляет строку в работе и вернётся к ней следующим проходом, когда владелец поправит порядок ролей.
Одна команда в нужном канале ставит витрину — сообщение со списком прошлых недель, которое дальше обновляется само после каждых итогов, переносить его не нужно. Ссылки в нём ведут на сообщения с кадрами, а не на файлы: ссылки на вложения Discord подписаны и через несколько дней перестают открываться, и витрина превратилась бы в набор битых картинок. Повторная команда переносит витрину в другой канал и убирает прежнее сообщение, чтобы в чате не оставалось мёртвого списка, который больше не обновляется. Вторым блоком в витрине идут правила участия: куда выкладывать кадр, сколько кадров в сутки принимается, когда подводятся итоги и что получает победитель. Правила бот собирает из ваших же настроек, поэтому они не разойдутся с тем, как конкурс ведёт себя на самом деле: поменяли в кабинете день итогов — изменилось и объявление в канале. Поэтому витрину и стоит ставить в сам канал конкурса: тогда человеку, зашедшему первый раз, не приходится гадать, как сюда попасть.
Всё это меняется в личном кабинете в любой момент — каналы и роли выбираются списками с вашего сервера, вводить ID руками не нужно. Бот подхватывает изменения сам.
Конкурс
Голосование и итоги
Награда
Объявление победителей
Витрина победителей
Ответы автору
Оформление и журнал
Что вводят на сервере, когда модуль подключён. Команды набираются со слэша — Discord подсказывает список сам, наизусть помнить ничего не нужно.
/кадр-итоги
Закрывает текущую неделю досрочно: считает голоса, объявляет победителей и начинает новую неделю.
/кадр-витрина
опубликовать сразу
Ставит в текущий канал витрину — одно сообщение, которое дальше обновляется само. В нём и победители прошлых недель, и правила участия: куда выкладывать кадр, сколько кадров в сутки принимается, когда итоги и что получает победитель. Правила собираются из ваших настроек, так что переписывать их вручную не придётся.
/кадр-проверка
проверка настроек Показывает списком, что мешает конкурсу работать: каналы, права бота, роль победителя, расписание и текущее состояние недели.
Команды для администрации Discord показывает только тем, у кого есть нужное право сервера. Чтобы ими пользовалась ваша модерация без прав администратора, откройте доступ её ролям: Настройки сервера → Интеграции → ваш бот → нужная команда.
Бот разворачивается за пару минут: выбираете модули, вставляете токен, приглашаете на сервер.