A Discord bot for EchoVRCE that polls the public match status API and posts live embeds showing:
- Combat queue — number of players currently searching for a Combat match
- Active matches — one pinned embed per live Combat game with team rosters, match time, region, and an echo.taxi join link
Embeds are edited in-place across restarts using message IDs persisted to state.json.
The bot can also optionally authenticate with Nakama for richer queue details if you provide Nakama credentials.
- Node.js v18 or later
- A Discord webhook URL
npm installCopy .env.example to .env and fill in your values:
cp .env.example .env| Variable | Required | Description |
|---|---|---|
DISCORD_WEBHOOK_URL |
Yes | Webhook URL for the target channel |
DISCORD_BOT_TOKEN |
Optional | Bot token — enables automatic message pinning |
POLL_INTERVAL_MS |
Optional | Poll frequency in ms (default: 10000) |
FILTER_GUILD_ID |
Optional | Restrict embeds to one guild/group ID |
NAKAMA_URL |
Optional | Nakama base URL (no trailing slash, no /v2) |
NAKAMA_HTTP_KEY |
Optional | Nakama runtime http key for account RPCs |
NAKAMA_USERNAME |
Optional | Bot account username for Nakama auth |
NAKAMA_PASSWORD |
Optional | Bot account password for Nakama auth |
When all four Nakama values are set, the bot authenticates with Nakama and uses the authenticated API path. If auth fails, it automatically falls back to the public endpoint.
In your Discord channel: Settings → Integrations → Webhooks → New Webhook → copy the URL.
Create a bot at discord.com/developers/applications, invite it to your server with the Manage Messages permission, and set DISCORD_BOT_TOKEN.
node bot.jsOr on Windows, double-click start-bot.bat.
docker compose up -dThis uses the local Dockerfile and mounts ./data for persistent state.json.
The repo includes a render.yaml for one-click deployment as a Background Worker:
- Push the repo to GitHub
- Go to render.com → New → Blueprint → connect your repo
- Set the required env vars in the Render dashboard
Free tier Background Workers run 24/7 with no sleep.
Every POLL_INTERVAL_MS the bot fetches https://g.echovrce.com/status/matches (public, no auth) and:
- Reads
active_matchmaking_countsto get the number of players queuing for Combat - Filters
labelsfor active public Combat matches (optionally byFILTER_GUILD_ID) - Posts or edits pinned Discord embeds for the queue count and each active match
- Deletes embeds for matches that have ended
Console output is change-driven — counts are only logged when the queue size or number of active matches changes.