Rival Drafts
Production-grade Marvel Rivals Discord bot + υποδομή: matchmaking, tournaments, moderation, API auto-verify, two-VPS failover.
Σύνοψη
Το Rival Drafts είναι production Discord bot που έφτιαξα για ένα Marvel Rivals PUG community. Τρέχει 12-player matchmaking με captain drafts και per-queue ELO, πλήρη tournament brackets (single/double elim, Swiss, round robin), moderation + automod, ticket-based rank verification, Marvel Rivals API auto-confirmation, Twitch go-live notifications, daily username verification, admin web dashboard, daily cross-VPS backups, και active-passive failover system με αυτόματο failback. Deployed σε δύο VPSs μέσω Docker Compose, λειτουργεί υπό systemd, monitoring μέσω webhook alerts.
Σημαντικά σημεία
- ▸ Παραδόθηκε σε ~10 ημέρες: 130+ commits, 60+ slash commands σε 5 surfaces.
- ▸ Two-VPS υποδομή: primary + standby με health-check watchdog, auto-failover, και auto-failback.
- ▸ Daily cross-VPS database backups πάνω σε rsync/SSH, 7-day retention, Discord webhook alerts σε success/failure.
- ▸ Marvel Rivals API integration: auto-verify match results + daily username sync (πιάνει renames, DMs τους παίκτες).
- ▸ Interactive tournament dashboard V2: single/double elim, Swiss, round robin, hidden competitive seeding, live bracket updates.
- ▸ Interactive automod panel: spam / invites / caps / bad words / mass mentions, ρυθμίζονται μέσω buttons + modals.
- ▸ Επτά γύροι συστηματικού audit pass: 40+ targeted fixes, race-condition guards, memory-leak patching.
Πλαίσιο
Ένα Marvel Rivals community που ήμουν μέλος έτρεχε PUG nights χειροκίνητα — spreadsheets για ELO, mod calls σε DMs, tournament brackets ζωγραφισμένα στο χαρτί. Κάθε Σάββατο ήταν μία ώρα setup πριν το πρώτο match. Έφτιαξα ένα bot που να καταβροχθίζει ολόκληρο το workflow: queue, draft, match, report, verify, moderate, season, tournament. Μετά συνέχισα να φτιάχνω μέχρι να μοιάζει με υποδομή, όχι με script.
Νούμερα
- ~10 ημέρες, από το πρώτο commit μέχρι production (Apr 11 → Apr 21, 2026).
- 130+ commits — features, refactors, και επτά ξεκάθαροι γύροι audit fixes.
- 60+ slash commands: 14 matchmaking, 9 moderation, 28+ admin, 13 tournament subcommands, 1 ticket-panel.
- 10+ SQLite tables — players, per-queue stats, matches, pending reports, bans, hero pool, seasons, tournament, queue state, Twitch links, config.
- 2 VPSs, 2 Docker containers (bot + admin dashboard), 1 systemd service, 1 watchdog, 1 backup job.
- 3 third-party integrations: Marvel Rivals API, Twitch API, Discord webhooks.
Υποδομή
Σχεδιασμένο να επιβιώνει από VPS outage κατά τη διάρκεια live tournament. Ο primary τρέχει το bot και το dashboard. Ο standby λαμβάνει daily DB backups και μπορεί να αναλάβει αυτόματα.
- Primary VPS: rivals-bot-bot (Node.js + discord.js + health endpoint στο :3000) και rival-drafts-dashboard (web admin UI στο :80), και τα δύο σε Docker.
- Standby VPS: backup storage στο /opt/rivals-backup, watchdog script, ready-to-start αντίγραφο του bot.
- Health-check watchdog: 30s poll, 3 fails → failover, 5 successes → failback. Discord webhook alert σε κάθε μετάβαση.
- Daily rsync backup στις 04:00 UTC — και τα δύο SQLite DBs μαζί με .env, docker-compose.yml, package.json. 7-day rolling archive.
- Docker image: node:20-alpine, τρέχει ως non-root 'node' user μέσω entrypoint.sh, persistent data volume.
- Locked internal health endpoint, bind bot port μόνο στο 127.0.0.1 (terrain για reverse-proxy).
Σημαντικά σημεία μηχανικής
Τα μέρη που μετέτρεψαν το “Discord bot” σε “σύστημα.”
- Active-passive failover με watchdog + DB sync + webhook alerts — primary πέφτει, standby αναλαμβάνει‧ primary επιστρέφει, failback.
- Marvel Rivals API auto-verify: μετά από report, polls το MR custom-room API (5 min initial delay, 3 min interval), cross-references team rosters, auto-confirms συμπεριλαμβανομένου MVP/SVP, flags mismatches μεταξύ reported και API αποτελεσμάτων. 15-min manual timer παρακάμπτεται όταν κλειδώνει το API match.
- Daily username verification job: 24h cron-like sweep σε όλα τα linked MR names, rate-limited (2s delay). 404 από το API → username clearαρει + DM για re-register.
- Tournament V2 dashboard: ένα interactive message με dropdown nav, rank-based hidden seeding, live bracket updates, αλλαγή format + BO χωρίς να ξαναφτιαχτεί το tournament.
- Interactive automod config panel: το staff κάνει tune σε spam / invite / caps / mass-mention / bad-word policies μέσω buttons + modals, χωρίς config-file editing.
- Multi-queue architecture: Open (όλα τα ranks) + Pro (μόνο Rank X/A), πλήρως ξεχωριστά ELO, stats, channels, και persistence.
- Queue persistence + timer recovery: queue state αποθηκεύεται σε κάθε join/leave, επανέρχεται σε bot restart με τους timers να υπολογίζονται από το elapsed time.
- Twitch integration: polls το Twitch API για linked players, posts go-live notifications σε ρυθμισμένο channel.
- Admin web dashboard: ξεχωριστό container, live bot stats, quick-action buttons.
Διαδικασία ποιότητας
Επτά ξεκάθαροι audit γύροι μετά το αρχικό feature push. Κάθε γύρος είχε θέμα και commit που λίσταρε κάθε fix.
- Round 5: ELO baseline, dodge cooldown, balance-teams safety, ticket role errors.
- Round 6: 11 fixes — format vote, ban queue, timer auth, queueId integrity, ELO falsy-check, match-ID collision, streak limits.
- Round 7: moderation client param, timer recovery, setelo scope, ready-check cleanup, tournament timer stop.
- Συν: “17 audit fixes” stability/security/reliability sweep, memory-leak hunt, polish pass για deprecation warnings + race conditions.
Αρχιτεκτονική
discord.js v14 codebase με commands ομαδοποιημένα ανά concern. Persistence ενοποιήθηκε σε SQLite μέσω better-sqlite3 μετά από ενδιάμεση μετανάστευση από JSON (το dead JSON backup module διαγράφηκε όταν σταθεροποιήθηκε). Ένα μεγάλο matchdb.js (~600 γραμμές) έχει match/player/ELO‧ ένα slim bot.db χειρίζεται warnings + tickets.
- src/index.js — startup, command + event loading, recovery, periodic jobs, health endpoint, graceful shutdown.
- src/commands/ — matchmaking, moderation, admin, tickets, tournament (5 surfaces).
- src/events/ — ready, interactionCreate router, guildMemberAdd/Remove.
- src/handlers/ — buttons.js (400+ γραμμές), tickets/ (creation, close, rank verification), tournament-v2.js (bracket logic).
- src/matchmaking.js + queue.js + elo.js + state.js — core PUG flow και rating math.
- src/rivals-api.js — Marvel Rivals API client (register verification, match verification, daily sweep).
- src/twitch-monitor.js + twitch.js — stream polling + API helpers.
- src/automod.js — filter + interactive config.
- src/utils/ — embed builders, action logger — ο logger γράφει κάθε mod action / ELO change / admin action / ticket event σε log channel.
- Dockerfile + docker-compose.yml + entrypoint.sh — one-command deploy ως non-root 'node' user.
Λειτουργία
- Deploy: ssh στον primary → git pull → docker compose down + build --no-cache + up -d → deploy-commands.js αν αλλάξανε slash commands.
- Live logs μέσω docker compose logs -f bot.
- Standard rescue commands: /admin_cancelmatch, /admin_rewind, /admin_clearqueue, /admin_resetcooldown.
- /admin_export ρίχνει όλο το dataset ως CSV για offline analysis.
- /admin_seasonreset αρχειοθετεί την τρέχουσα season (full players + matches snapshot στον seasons table) και resetάρει τα stats.
Κατάσταση
Το bot είναι έτοιμο και δοκιμασμένο σε production. Λόγω άσχετων διαφορών στο community, δεν είμαι πια στον server — δες το blog post για την ιστορία. Το ίδιο το bot είναι πλήρες και έτοιμο να redeployεται σε οποιοδήποτε Marvel Rivals community που πραγματικά θα το χρησιμοποιήσει.
- Έτοιμο και production-proven.
- Αυτή τη στιγμή άστεγο. Αν τρέχεις Rivals community και το θες, γράψε μου.
- Πρόχειρη τιμή: δωρεάν / σχεδόν δωρεάν αν το deployment γίνει και beta playground μου (δες About).
Τι κρατάω
- Το SQLite χειρίζεται workloads σε “μικρά multiplayer servers” χωρίς πρόβλημα — το JSON ήταν λάθος default‧ η ενδιάμεση μετανάστευση πληρώθηκε αμέσως.
- Interactive dashboards (buttons + modals + dropdowns) είναι καλύτερα από text commands για ό,τι χρησιμοποιεί καθημερινά το staff.
- Οι συστηματικοί audit γύροι πιάνουν 3x περισσότερα bugs απ’ ό,τι ο ίδιος χρόνος σε feature-driven testing.
- Το failover αξίζει ακόμα και για Discord bot — το downtime σε live tournament είναι community-trust ζημιά που δεν ανακτάς.
- Ποτέ μη γράφεις τον κώδικα πριν υπογραφούν τα νομικά.