Студенты и очереди
Вы когда-нибудь сидели в студенческих чатах?
Знакомо? Именно так обычно устраиваются очереди на экзамены, зачеты, защиту лабораторных работ, выступления с докладами. Когда в группе больше 20 человек — это боль. Куча флуда, номера в очереди перемешиваются со спорами, дебатами, разговорами и важными сообщениями. А кто-то вообще в это время спал... Полный хаос, никакого порядка.
Более продвинутые делают запись в очередь через Google-таблицы: создаётся таблица, в которой заранее размечены строки под очередь. Достаточно просто вписать свою фамилию в свободную строчку.
Чтобы всё было честно, группа договаривается о времени открытия таблицы. В условный 19:00 староста отправляет ссылку на таблицу, и каждый залетает, пытаясь первым занять заветное место. Чем-то напоминает покупку билетов на концерт: первые места занимают за долю секунды.
Такой способ действительно удобнее, чем "циферки" или "плюсики" в чате — вся очередь в одном месте, сразу видно, кто на каком месте, а лишнего флуда почти нет. Но остаются свои нюансы: кто-то может случайно (или не очень) стереть чужую запись, а кто-то из-за медленного интернета не успевает записаться на желаемое место. Да и неудобно это все.
В какой-то момент у меня возникла мысль: зачем эти заморочки, если все можно автоматизировать? Идея очень проста: нужен телеграм-бот, который будет выбрасывать в чат сообщение с очередью в виде текстового списка и inline-кнопкой для записи в очередь. Таким образом, действие записи в очередь сводится к тому, что пользователю нужно лишь нажать на кнопку (прямо в чате), после чего он добавляется в конец списка.
Загоревшись идеей, бот был реализован за пару часов при помощи Python. Одногруппникам очень даже зашло данное решение, очереди стали более простыми. После этого я постоянно дорабатывал бота и добавлял различные функции: выход из очереди, перемещение, перемешивание, отсрочка открытия очереди и многое другое.
Чуть технарщины. Изначально я сделал бота на pyTelegramBotAPI. Всё работало нормально, за исключением случаев, когда в очередь пытались влететь сразу человек 20-30. А это стандартная ситуация: очередь открылась - и вся группа одновременно жмёт "Записаться". В этот момент бот зависал, а одногруппники злились. Пришлось переписать бота почти с нуля. В новом варианте я уже использовал Aiogram с применением WebHooks для уменьшения задержек получения запросов, вместо SQLite3 подключил PostgreSQL, а для кеширования добавил Redis. Вся эта радость крутится на недорогом VPS.
В итоге получилось что-то вполне боевое: бот спокойно выдерживает массовые заходы в очередь, запросы обрабатываются мгновенно. Единственная проблема, которую не решить - это ограничение Telegram Bot API на частоту обновления сообщения. То есть, в момент массовой записи в очередь список будет обновлятся раз в несколько секунд, и может казаться, что бот зависает. Однако при нажатии на кнопку "Записаться" пользователь мгновенно получает всплывающее сообщение с номером своей позиции, что означает успешную обработку на стороне сервера.
Любой участник очереди может обмениваться местами с другими участниками, передвигаться по очереди, а также выставлять свое место на так называемый "аукцион". Особое внимание я уделил справедливости. Любые перемещения по очереди должны быть только с согласия тех участников, чьи позиции изменятся в результате перемещения. Хочешь поменяться местами с другим участником — получи его согласие. Хочешь пропустить вперед пару человек — согласие должен дать каждый.
В итоге очереди в нашей группе стали намного удобнее. Теперь одна очередь — это одно сообщение, а не десятки сообщений, разбросанных по всему чату.
В данной статье я описал далеко не все "плюшки", поэтому я оставляю здесь ссылку на моего бота: https://t.me/LuddmillaBot. Кому интересно — можете поиграться. Бот может быть полезен не только для студенческих чатов, а вообще где угодно, где вам нужно сформировать какую-то очередь или список.
А у вас во время учебы часто случались конфликты из-за очередей? Пишите в комментариях!👇