
A multi-purpose Discord bot built with inspiration from the University of Michigan EECS 370 course Discord server. Adapted from zombbblob.
DISCORD_TOKEN in your .env.bot and applications.commands scopes, and grant the permissions the bot needs: Manage Roles, Manage Channels, Create Invite, Add Reactions, Send Messages.Note: Slash commands are registered globally on startup, so they can take up to an hour to propagate the first time.
Server-specific IDs: The default role IDs (reaction roles) and invite channel ID target the original EECS 370 server. When self-hosting, override them in
.env(see below), or those features will not work / will link to the wrong server.
corepack enable
yarn install
Copy .env.example to .env and fill in your values:
cp .env.example .env
| Variable | Required | Description |
|---|---|---|
DISCORD_TOKEN |
Yes | Bot token from the Discord Developer Portal |
ROLE_MESSAGE_CHANNEL |
No | Channel ID of the reaction-role message, used to prefetch it at startup |
ROLE_MESSAGE_ID |
No | Message ID users react to for roles (🖥️ = Student, 🎓 = Student Alum); unset disables reaction roles |
STUDENT_ROLE_ID |
No | Role granted for 🖥️ (defaults to the EECS 370 server’s role) |
STUDENT_ALUM_ROLE_ID |
No | Role granted for 🎓 (defaults to the EECS 370 server’s role) |
INVITE_CHANNEL_ID |
No | Channel /invite creates invites for (defaults to the EECS 370 server) |
STATIC_INVITE_URL |
No | Invite returned by /invite with no arguments |
DB_PATH |
No | SQLite database path (defaults to db/casino.db) |
yarn dev
yarn build
yarn start
Or in one step: yarn prod.
yarn test
| Script | Description |
|---|---|
yarn dev |
Run from source with live reload (tsx watch) |
yarn build |
Compile TypeScript to dist/ |
yarn start |
Run the compiled bot |
yarn prod |
Build, then start |
yarn test |
Run the test suite (node:test via tsx) |
yarn typecheck |
Typecheck all sources and tests without emitting |
yarn lint |
Lint with ESLint (yarn lint:fix to auto-fix) |
yarn format |
Format with Prettier (yarn format:check to verify) |
yarn db:reset |
Delete the casino database (destructive) |
Casino state (balances, jobs, bonus and work timestamps) is stored in a SQLite database at db/casino.db, created automatically on first run. The database uses WAL journal mode, so casino.db-wal and casino.db-shm sidecar files will appear alongside it. The db/ directory is gitignored. To wipe all casino state, run yarn db:reset (destructive, cannot be undone).
Command names are derived from the file basenames in src/commands/, lowercased.
| Command | Description |
|---|---|
/help |
Prints the help menu |
/ping |
Checks the bot is responsive |
/sourcecode |
Links to this repository |
/gpr |
Grass privileges revoked |
| Command | Description |
|---|---|
/coursenotes |
Link to the unofficial course notes |
| Command | Description |
|---|---|
/invite [n] |
Generate an invite link with optional limited uses (1-100) |
| Command | Description |
|---|---|
/send <channel> <message> |
Send a message as the bot |
/reply <message_link> <reply_text> |
Reply to a message as the bot |
/react <message_link> <emoji> |
React to a message as the bot |
/create <semester-year> |
Create a semester category with channels (e.g. F23) |
| Command | Description |
|---|---|
/joincasino |
Join the casino |
/leavecasino |
Leave the casino (cannot be undone) |
/getjob |
Get assigned a random job for coin income |
/work |
Earn your hourly paycheck (1h cooldown) |
/bonus |
Claim a one-time starting bonus (random 500-1499 coins) |
/coins [user] |
Check your or another user’s balance |
/dice <bet> |
Roll dice against the house (30s cooldown) |
/roshambo <bet> |
Play rock paper scissors (30s cooldown) |
/coinflip <bet> |
Flip a coin, heads or tails (30s cooldown) |
Game rules: games pay out your bet amount on a win and take it on a loss; ties return the bet. Dice pays 2x on a winning double and 4x on winning double sixes.
src/
├── index.ts # Client setup, command/event loader, interaction dispatch
├── config.ts # Environment-derived configuration
├── db.ts # SQLite persistence layer (better-sqlite3)
├── types.ts # Command interfaces
├── lib/ # Pure, unit-tested game/validation/formatting logic
├── commands/ # Slash commands (filename = command name)
└── events/ # Event handlers (directory name = Discord event)
test/ # node:test suites
A-Bot is open source — contributions are welcome! See CONTRIBUTING.md for the development workflow.
MIT © Ryan Ramboer