| --- |
| title: ROI Bet Tracking Bot |
| emoji: 📈 |
| colorFrom: blue |
| colorTo: green |
| sdk: docker |
| app_port: 7860 |
| short_description: Discord bet tracker with per-user ROI stats. |
| --- |
| |
| # ROI Bet Tracking Discord Bot |
|
|
| A Discord bot for manually tracking bets and ROI per user. Each Discord user gets their own independent bet history, sport-tagged analytics, exports, and summary charts. |
|
|
| ## Features |
|
|
| - `/bet` logs one bet privately using sportsbook and sport dropdowns |
| - `/bulkadd` logs multiple bets privately for one sportsbook and one sport |
| - `/editbet` updates an open bet privately |
| - `/deletebet` soft deletes a bet privately without wiping audit history |
| - `/resolve` grades a bet as `win`, `loss`, or `void` |
| - `/resolveall` grades multiple bet IDs to the same result |
| - `/bankroll` manages starting bankroll and unit settings |
| - `/roi` posts a public trend-first ROI view with filters and chart |
| - `/bets` posts a public filtered ledger with pagination |
| - `/summary` posts a public record-first summary with chart |
| - `/books` shows ROI and win rate by sportsbook |
| - `/sports` shows ROI and win rate by sport |
| - `/export` exports a filtered CSV of a user’s bets privately |
| - `/commands` posts a public command reference embed |
| - `/welcome` posts a public welcome embed and tags everyone for admins only |
| - CockroachDB / Postgres-compatible persistence via `DATABASE_URL` |
| - Docker-ready for Hugging Face Spaces |
|
|
| ## Setup |
|
|
| 1. Install dependencies: |
|
|
| ```powershell |
| npm.cmd install |
| ``` |
|
|
| 2. Copy `.env.example` to `.env` and add your bot config: |
|
|
| ```env |
| DISCORD_TOKEN=your_token_here |
| GUILD_ID=optional_guild_id |
| DATABASE_URL=postgresql://username:password@host:26257/database?sslmode=require |
| ADMIN_ROLE_NAME=Admin |
| ``` |
|
|
| 3. Start the bot: |
|
|
| ```powershell |
| npm.cmd start |
| ``` |
|
|
| ## Notes |
|
|
| - Node.js 24+ is required. |
| - The bot stores data in your remote CockroachDB database. |
| - `/welcome` is restricted to members with the Discord role name set in `ADMIN_ROLE_NAME`. |
| - If `GUILD_ID` is set, slash commands register to that guild for faster updates. Otherwise they register globally. |
| - Set `DATABASE_URL`, `DISCORD_TOKEN`, and `ADMIN_ROLE_NAME` as Hugging Face Space secrets. |
| - The Docker Space exposes a tiny health endpoint on port `7860` while the Discord bot runs in the same container. |
|
|
| ## Hugging Face Deployment |
|
|
| 1. Create a new Hugging Face Space using the `Docker` SDK. |
| 2. Push this repository to that Space. |
| 3. Add these Space secrets: |
| - `DISCORD_TOKEN` |
| - `DATABASE_URL` |
| - `ADMIN_ROLE_NAME` |
| - `GUILD_ID` (optional) |
| 4. Let the Space build and start. |
|
|
| The app will create and backfill its tables automatically on startup if they do not exist yet. |
|
|
| ## Bet Input Tips |
|
|
| The `/bet` command requires sportsbook and sport dropdowns first, then the modal asks for: |
|
|
| ```text |
| prop: Luka Doncic over 29.5 points |
| odds: -115 |
| stake: $25 |
| ``` |
|
|
| The `/bulkadd` modal accepts one bet per line in this format: |
|
|
| ```text |
| Bryan Rocchio 1+ HR | +1450 | $5 |
| 3 leg parlay | +1452 | $5 |
| ``` |
|
|
| ## Oracle Cloud Always Free Deployment |
|
|
| This bot is a good fit for an Oracle Cloud Always Free Ubuntu VM because it: |
|
|
| - runs on Node.js `24+` |
| - uses your remote CockroachDB/Postgres-compatible database |
| - does not require local persistent bet storage |
|
|
| Recommended deployment shape: |
|
|
| - Oracle Compute VM with Ubuntu LTS |
| - native Node runtime |
| - `systemd` for auto-restart and boot persistence |
| - SSH exposed publicly on port `22` only |
|
|
| Deployment assets included in this repo: |
|
|
| - `docs/oracle-always-free.md` |
| - `deploy/oracle/roibot.service` |
| - `deploy/oracle/roibot.env.example` |
|
|
| ## Market Scanner |
|
|
| Market scanning is admin-controlled and built into the same long-running bot process. |
|
|
| - `/scanstatus` shows scanner health and last-run information |
| - `/scanrun` runs the Circa disagreement scanner manually |
| - `/scanreport` posts the morning discrepancy and width reports on demand |
| - `/circatest` previews Circa OCR parsing |
|
|
| Environment variables for scanner features: |
|
|
| - `ODDS_API_KEY` |
| - `ODDS_API_BASE_URL` |
| - `ODDS_API_SPORT_KEY` |
| - `ODDS_API_REGIONS` |
| - `ODDS_API_MARKETS` |
| - `CIRCA_DROPBOX_URL` (public shared folder link) |
| - `SCAN_REPORT_CHANNEL_ID` |
| - `SCAN_ALERT_CHANNEL_ID` |
| - `SCAN_MORNING_TIME` |
| - `SCAN_TIMEZONE` |
| - `SCAN_MIN_BOOKS` |
| - `SCAN_DISAGREEMENT_THRESHOLD` |
| - `SCAN_ALERT_COOLDOWN_MINUTES` |
| - `SCAN_FREQUENCY_MINUTES` |
|
|