review-bot
Highlights
- Built by @Khaidu (Johan Lindros) for a games-editorial Discord — the bot logic, IGDB integration, embed design, and the whole editorial workflow below are his; our part was dockerizing it and getting it hosted
- /announce searches IGDB, shows a private dropdown of matches, then posts a public embed with cover art, screenshots, trailer link, and Yes/Maybe/No voting buttons
- /close locks voting, assigns a reviewer, and DMs them the review code, embargo (shown in the reader's own timezone via Discord timestamps), and press kit link — with a copy logged to a private channel
- /submit lets a writer notify the editor-in-chief a review is ready, autocompleted to only the games actually assigned to them
- /todayinhistory surfaces top-rated games released on this date in past years, filtered to real EU/Worldwide releases and deduplicated by parent game
- Our contribution: a Dockerfile and Gitea Actions workflow to build and push the image, plus migrating storage from a single JSON blob to SQLite (better-sqlite3, rebuilt from source in the Alpine image) so the data survives redeploys and isn't one bad write away from corruption
A friend, @Khaidu (Johan Lindros), built this for a games-editorial team’s Discord: the actual day-to-day process of deciding what to review, who reviews it, and keeping embargoed details out of the wrong channel, run entirely through slash commands instead of a spreadsheet and a lot of manual DMs.
The workflow is his design end to end. An editor runs /announce, picks the right game from an IGDB search, and the bot posts a rich embed — cover art, trailer, summary — with voting buttons for the rest of the staff. Once there’s enough signal, /close locks the poll, assigns a reviewer, and DMs them the review code and embargo date privately, converted to their own timezone automatically by Discord’s own timestamp formatting. /submit closes the loop when the review’s actually done. /todayinhistory is the one purely-for-fun command — top-rated games released on this date in past years, filtered down to real releases rather than every platform re-issue.
Our part was infrastructure, not features: a Dockerfile and a Gitea Actions workflow so it builds and deploys like the rest of this stack, and — once it was clear a single db.json file was the wrong shape for something a redeploy could clobber — a migration to SQLite, rebuilding better-sqlite3 from source in the Alpine image since there’s no prebuilt binary for that platform/Node combination.