Всем привет! Я изучаю различные платформы форумов, чтобы создать сообщество для бразильских конкурсных программистов (CP), и, кажется, я уже нашёл идеальное решение!
Одной из функций, которую я хотел бы реализовать на этом форуме, является интеграция с Codeforces — онлайн-платформой, где проходят соревнования и обсуждения по CP. На Codeforces у участников есть рейтинг, который меняется в зависимости от их результатов на рейтинговых соревнованиях. Я хочу дать пользователям возможность отображать свои заслуженные рейтинги в профилях на форуме.
Первое, что должен сделать этот плагин, который я планирую разработать, — это позволить пользователю ввести свой никнейм на Codeforces и каким-то образом подтвердить, что этот никнейм действительно принадлежит пользователю форума. Для этого я думаю использовать плагин Custom Wizard, чтобы запросить никнейм, затем отправить случайную строку через API Codeforces Talks, которую пользователь должен будет правильно ввести обратно. Если всё в порядке, сохранить никнейм в пользовательском поле. Выглядит ли это нормально? Сделали бы вы это по-другому?
Теперь я хорошо знаю своих [будущих] пользователей, ведь сам я CPer! Им понравится отображать свой рейтинг через цвет никнейма на форуме. То есть, если рейтинг выше 1400, никнейм будет голубым (cyan), если выше 1600 — синим, и так далее.
Моё быстрое исследование по кастомизации цветов никнеймов на Discourse привело меня к следующему решению: создать группу пользователей для каждого диапазона рейтинга, а затем динамически назначать пользователей в правильную группу. (Есть ли лучший или более простой способ?)
Итак, когда пользователь впервые свяжет свой аккаунт Codeforces со своим профилем, я могу получить его рейтинг и назначить соответствующую группу (specialist, expert, candidate master, …, international grandmaster). Однако рейтинг может быстро измениться, и я хотел бы автоматически обновлять группу пользователя при изменении его рейтинга.
Я придумал несколько способов реализации этого и хотел бы получить предложения, какой из них выбрать, а также, по возможности, руководство по специфике Discourse:
- Запуск регулярной задачи (Job), которая обновляет индивидуальный рейтинг и группу каждого пользователя (много внешних запросов к API Codeforces).
- Запуск регулярной задачи, которая обрабатывает соревнования по мере их проведения. Поскольку рейтинг может измениться только во время соревнования, если начальные рейтинги пользователей корректны, обрабатывая изменения рейтинга по мере их возникновения, я смогу обновлять только изменённые рейтинги и поддерживать согласованность с одним внешним запросом к API.
- Реализация собственного резолвера рейтинга и групп. В этом случае я буду хранить дату последнего получения рейтинга, и при следующем запросе
GET rating/groups, если рейтинг устарел, я сделаю запрос к API Codeforces и обновлю рейтинг и группу пользователя. Это моё предпочтительное решение, так как оно кажется простым и обеспечивает eventual consistency. Однако я не уверен, как его реализовать, каковы последствия динамического удаления и добавления групп пользователю, или даже возможно ли это вообще в виде плагина.
Извините за простыню текста! Буду рад любым комментариям по всем этим вопросам. Спасибо за внимание.