В конце ноября я увидел пост о телеграм-боте для проведения Тайного Санты, и, естественно, захотелось запилить что-то такое. Естественно — потому что пилить что-то своё хочется, а такой бот — простой, комфортный, и, что важно, завершаемый проект.
У меня уже была потенциально заинтересованная аудитория, так что я забросил идею со ссылкой на отдельный чатик в общий чат тусовки иии понеслась. Нас набралось чуть меньше 100 человек.
В следующие пару недель по вечерам я лениво писал самого бота. По идее, я хотел от него не слишком многого:
- Юзер должен самостоятельно присоединиться к участию в Санте (Santa в названии чата с лёгкой руки Т. превратился в Satan). Я не хотел, чтобы люди присоединялись к чату, забывали о нём, а кто-то потом из-за этого не получал бы свой подарок.
- Юзер должен подтвердить своё участие в личке у бота. Во-первых, это позволяло боту отправлять ему сообщения в будущем, во-вторых, это была дополнительная гарантия того, что человек не сольётся с участия.
- Бот должен уметь отправлять пользователям телеграм-юзернейм назначенных им детишек (одариваемых то есть)
- Бот должен принимать в личке предпочтения от вписавшихся пользователей. Так назначенным им Сантам будет проще выбрать подарок.
Были ещё всякие нюансы вроде “А что делать, если кто-то ливнет” и так далее, но это успешно было разрешено.
Поскольку наша тусовка во многом именно оффлайновая, и многие люди друг друга знают, изначальной и неизменной была идея личной встречи для обмена подарками. Для этого одна пара, участвовавшая в движухе, любезно предоставила нам возможность собраться всей большой толпой в их квартире.
Собственно, всё остальное прошло достаточно гладко. Мы озвучили и многократно повторили где, когда и во сколько мы встречаемся, я написал простенький скрипт, который выуживал из базы случайных подтверждённых участников и назначал им Санту, потом Санта получал от бота в личку юзернейм и предпочтения этого участника, и всё, что оставалось сделать — это закупиться подарками и дождаться дня Д.
В прошедшую субботу, 21 декабря, я встретился с одной из Сант, чтобы захватить её подарок и положить его под ёлку для назначенного ей участника, купил подарок для своего, взвалил на горбушку полный рюкзак мандаринов, и отправился в обозначенное место. Там всё уже было суперпразднично, пришло сколько-то человек, и чем дальше в лес, тем больше нас набивалось в квартиру.
Мы решили сделать так: раз в N минут мы объявляем дарение, я выуживаю один из заранее сложенных Сантами под ёлку подарков, читаю написанное на нём (малярный скотч и маркер я предусмотрительно притащил с собой) имя и телеграм-юзернейм участника, и, если он уже пришёл, то торжественно его одариваю. Он счастлив, я счастлив, все счастливы! И так по цепочке: теперь уже получивший подарок становится Сантой, ищет подарок для следующего участника и одаривает его. Повторить.
На случай, если подарки закончатся, а люди нет, мы подготовили несколько символических подарков для тех, кто останется без них: пять маленьких ёлкоподобных кипарисов и пять шоколадок Toblerone. Никто не уйдёт без подарка!
На пике нас собралось порядка 64 (я считал) человек, было ощутимо жарко, но это нисколько не помешало общему веселью.
Как таковых, сложностей особо и не было. Да, участники иногда (часто :) не сразу понимали, как пользоваться ботом, но, пожалуй, это был единственный момент, а его корректно разруливала в чате моя Т. :)
Технологически это good ol’ Ruby on Rails. Я взял готовое приложение-пример, впилил туда dry-containers (до сих пор плююсь ядом от документации драй-стека). Проект получился очень простой, занял немного (как мне и хотелось) времени и по завершении полностью выполнил свою задачу. Подеплоено с помощью Dokku :)
Конечно, я хотел бы успеть дописать для бота чуть больше возможностей, но для проведения локального Secret Satan его оказалось вполне достаточно. Скорее всего, я займусь этим позднее, чтобы подготовить его к публичному релизу, особенно, если после этого поста обнаружится спрос :)
Немного статистики напоследок:
- 96 живых человек в чате
- 79 подтверждённых участников
- 8 подарков осталось к концу вечера под ёлкой (их уже забрали или заберут позже те, кому они предназначались)
- 10 бэкап-подарков для тех, кому не повезло
- 1 бэкап-подарок оказался реально необходим
- 6-8 вечеров по паре коммитов на написание бота
- Гигантская гора курток и обуви в прихожей
P.S. Не могу не выразить благодарность всем участникам, всем, кто помогал мне в организации движухи и в тестировании бота. Спасибо!
UPD dec 2021: доделали платформу, можно найти здесь: https://mysterious.gifts