Предупреждение
Из за недоступности Telegram в РФ бот временно отключен до переезда на зарубежные сервера
osu!not
Telegram-бот для отслеживания результатов игроков в osu!. Позволяет подписываться на игроков, получать уведомления о новых прохождениях с подробной статистикой и отсеивать результаты без улучшения PP. Написан на PHP и Laravel с использованием osu! API v2, очередей задач и собственной системы генерации карточек результатов.

osu!not - уведомления о результатах osu! в Telegram
В какой-то момент мне захотелось сделать бота, который позволял бы следить за результатами игроков в osu! прямо через Telegram. Постоянно заходить на сайт и проверять профили друзей не очень удобно, особенно когда хочется просто узнать, кто и какую карту недавно прошел.
Так появился osu!not. Идея довольно простая: добавляешь интересующих игроков в чат, а бот самостоятельно отслеживает их новые результаты и присылает уведомления.
Причем использовать его можно не только в личных сообщениях, но и в группах. Например, собрать в одном чате всех друзей, играющих в osu!, и следить за их прохождениями, не заходя лишний раз в игру.
Как работает бот
Для начала достаточно отправить /start и добавить игрока командой /add username. После этого бот начинает периодически проверять его последние результаты через osu! API v2.
Когда появляется новое подходящее прохождение, в чат отправляется сообщение с информацией о карте, полученных PP, точности, оценке, сложности и использованных модификаторах. Оттуда же можно перейти к самой карте или профилю игрока.

Отдельно я реализовал генерацию карточек результатов. Помимо основной статистики, на них отображаются обложка карты, аватар игрока, количество очков, комбо и промахи.
Генерация изображения выполняется отдельно, через очередь задач. Поэтому сначала бот отправляет обычное текстовое уведомление, а когда карточка готова, просто добавляет ее к уже отправленному сообщению.
Подписки и фильтрация результатов
Со временем стало понятно, что получать уведомления буквально о каждом прохождении не всегда удобно. Особенно если кто-то решил несколько десятков раз подряд переиграть одну и ту же карту :)
Поэтому я добавил возможность отсеивать результаты без улучшения PP. Бот запоминает предыдущие прохождения и может отправлять уведомление только тогда, когда игрок набирает больше PP на той же сложности, чем в ранее сохраненных результатах.

Здесь есть небольшой нюанс: бот сравнивает результаты только с теми, которые успел отследить сам, а не со всей историей игрока.
У каждого чата собственный список подписок и настройки уведомлений. Можно, например, получать все результаты в личные сообщения, а в общем чате оставить только улучшения.
Управлять подписками можно через /players. Я добавил кнопки для изменения настроек и удаления игроков, чтобы не приходилось запоминать отдельные команды.
Пока поддерживается только osu!standard, а из результатов учитываются успешные прохождения с PP больше нуля.
Немного о технической части
Бот написан на PHP с использованием Laravel и MariaDB. Для взаимодействия с Telegram используется Bot API, а для получения игровой статистики - osu! API v2.
Основная сложность оказалась не столько в отправке сообщений, сколько в организации постоянной проверки результатов.
Изначально бот проверял каждого добавленного игрока примерно раз в 10 секунд. Но у osu! API есть ограничения на количество запросов, поэтому с ростом числа отслеживаемых игроков такой подход быстро стал бы проблемой.
Позже я добавил систему, которая учитывает активность игроков. Если человек регулярно играет, бот продолжает проверять его с небольшим интервалом. Если же долго ничего не происходит, частота запросов постепенно снижается, вплоть до одной проверки в полчаса.
Таким образом удалось заметно сократить количество лишних обращений к API, хотя у этого решения есть и недостаток: после длительного отсутствия игрока первое уведомление может прийти с задержкой.
Также стоит учитывать, что бот проверяет последнее прохождение игрока. Если между проверками было сыграно сразу несколько карт, часть результатов может быть пропущена.
Для обработки проверок и генерации карточек я использую планировщик Laravel и отдельные очереди задач. Это позволяет не смешивать получение результатов с подготовкой изображений и отправкой уведомлений.
Что в итоге
В результате получился бот, которым можно пользоваться как для отслеживания собственных результатов, так и для наблюдения за друзьями. Все основные действия выполняются прямо в Telegram, без отдельных сайтов, регистраций и сложных настроек.
Для меня это также был хороший повод подробнее разобраться с Laravel, очередями задач, Telegram Bot API и ограничениями сторонних API. Особенно интересной оказалась оптимизация проверок, поскольку изначально я не особо задумывался о том, сколько запросов будет выполнять приложение при увеличении числа пользователей.