Hallo zusammen! Ich recherchiere verschiedene Forum-Plattformen, um eine Community für brasilianische Competitive-Programmierer (CP) aufzubauen, aber es scheint, als hätte ich sie gefunden!
Eine Funktion, die ich auf diesem Forum gerne hätte, ist eine Integration mit Codeforces – einer Online-Plattform, die Wettbewerbe und Diskussionen rund um CP hostet. Innerhalb von Codeforces haben Teilnehmer eine Bewertung (Rating), die sich entsprechend ihrer Leistung in bewerteten Wettbewerben ändert. Ich möchte meinen Nutzern die Möglichkeit geben, ihre hart erarbeiteten Bewertungen in ihren Forum-Profilen anzuzeigen.
Das Erste, was dieses Plugin, das ich entwickeln möchte, tun müsste, ist also, dem Nutzer die Eingabe seines Codeforces-Namens zu ermöglichen und dann irgendwie zu authentifizieren, dass der Name zum Forennutzer gehört. Um das zu tun, überlege ich, das Custom Wizard Plugin zu verwenden, um nach dem Namen zu fragen, dann eine zufällige Zeichenfolge über die Codeforces Talks API zu senden, die der Nutzer korrekt eingeben muss, und wenn alles in Ordnung ist, seinen Namen in einem benutzerdefinierten Feld zu speichern. Klingt das vernünftig? Würden Sie es anders machen?
Nun, ich kenne meine [zukünftigen] Nutzer, schließlich bin ich selbst ein CPer! Sie würden es genießen, ihre Bewertung durch die Farbe ihres Forum-Namens anzuzeigen. Das heißt, wenn Sie eine Bewertung über 1400 haben, ist Ihr Name cyanfarben, bei über 1600 blau und so weiter.
Meine schnelle Recherche zur Anpassung der Namenfarben in Discourse führte mich zu folgender Lösung. Ich sollte für jede Bewertungskategorie eine Nutzergruppe erstellen und dann meine Nutzer dynamisch der richtigen Gruppe zuweisen. (Gibt es einen besseren/einfacheren Weg?)
Wenn der Nutzer also zunächst sein Codeforces-Konto mit seinem Profil verknüpft, könnte ich seine Bewertung abrufen und ihm die richtige Gruppe zuweisen (Specialist, Expert, Candidate Master, …, International Grandmaster). Die Bewertung kann sich jedoch schnell ändern, und ich möchte die Gruppe des Nutzers automatisch aktualisieren, wenn sich seine Bewertung ändert.
Nun habe ich einige Möglichkeiten, dies zu erreichen, und ich möchte Vorschläge, welcher Weg der richtige ist, sowie, wenn möglich, eine Anleitung zu Discourse-spezifischen Details:
- Einen regelmäßig laufenden Job, der die individuelle Bewertung und Gruppe jedes Nutzers aktualisiert (viele externe Anfragen an die Codeforces-API)
- Einen regelmäßig laufenden Job, der Wettbewerbe verarbeitet, sobald sie stattfinden. Da sich Bewertungen nur während eines Wettbewerbs ändern können, kann ich, wenn die Bewertungen der Nutzer initial konsistent sind, durch die Verarbeitung von Bewertungsänderungen, sobald sie eintreten, nur die geänderten Bewertungen aktualisieren und die Konsistenz mit einem einzigen externen API-Aufruf aufrechterhalten.
- Einen benutzerdefinierten Rating- und Gruppen-Resolver. Ich müsste also die letzte Bewertungsrückholung speichern und beim nächsten
GET rating/groups, falls die Bewertung veraltet ist, die Codeforces-API aufrufen und die Bewertung/Gruppen des Nutzers aktualisieren. Dies ist meine bevorzugte Lösung, da sie einfach erscheint und immer eventual consistency gewährleistet. Allerdings bin ich mir nicht sicher, wie ich dies umsetzen würde oder welche Konsequenzen das dynamische Entfernen und Hinzufügen einer Gruppe zu einem Nutzer hätte. Oder ob dies überhaupt als Plugin möglich ist.
Tja, ich entschuldige mich für den Textwall! Ich würde mich über jegliche Art von Input zu all dem freuen. Vielen Dank für Ihre Aufmerksamkeit.