14 KiB
███████╗██╗ ██╗██████╗ ██████╗ ██╗ ██╗
╚══███╔╝╚██╗ ██╔╝██╔══██╗██╔═══██╗╚██╗██╔╝
███╔╝ ╚████╔╝ ██████╔╝██║ ██║ ╚███╔╝
███╔╝ ╚██╔╝ ██╔══██╗██║ ██║ ██╔██╗
███████╗ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗
╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
A feature-rich Discord bot paired with a sleek Next.js dashboard
✦ Overview
ZyroX is a fully-featured Discord bot with a modern web dashboard for managing everything from antinuke to music. Built on discord.py v2, FastAPI, and Next.js 14 with Tailwind CSS.
ZyroX-CV2-With-Dashboard/
├── 🤖 bot/ Python Discord bot + FastAPI backend
│ ├── api/ Dashboard REST API (FastAPI)
│ ├── cogs/ All bot features (commands, events, antinuke, automod…)
│ ├── core/ Bot client, context, cog base
│ ├── utils/ Shared utilities (emoji, tools, sync, ngrok tunnel…)
│ ├── games/ Standalone game modules
│ ├── assets/ Fonts, backgrounds, GIFs
│ └── CodeX.py Entry point
│
└── 🌐 dashboard/ Next.js frontend
├── app/ App Router pages & API routes
├── components/ Reusable UI components
├── hooks/ Custom React hooks
├── lib/ API helpers & utilities
└── types/ TypeScript type definitions
✦ Features
|
🛡️ Security
|
🎵 Music
|
|
⚙️ Management
|
🌐 Dashboard
|
|
🎉 Engagement
|
🔧 Developer
|
✦ Prerequisites
| Requirement | Version / Notes |
|---|---|
| Python | 3.10 or higher |
| Node.js | 18 or higher |
| Lavalink node | v4 |
| Discord bot token | — |
| Discord OAuth app | for dashboard login |
| ngrok account (free) | for HTTPS tunnel |
✦ Bot Setup
1 — Clone the repo
git clone https://github.com/RayExo/ZyroX-CV2-With-Dashboard
cd ZyroX-CV2-With-Dashboard/bot
2 — Create a virtual environment and install dependencies
python -m venv .venv
# Windows
.venv\Scripts\activate
# Linux / macOS
source .venv/bin/activate
pip install -r requirements.txt
3 — Configure the environment
Copy .env.example to .env and fill in the values:
# ── Core ──────────────────────────────────────────────────────────
TOKEN = your_discord_bot_token
brand_name = 'ZyroX'
# ── Lavalink ──────────────────────────────────────────────────────
LAVALINK_HOST = "lava-v4.ajieblogs.eu.org"
LAVALINK_PASSWORD = "your_password"
LAVALINK_SECURE = "true" # true = HTTPS (no port needed)
LAVALINK_PORT = "" # only needed when LAVALINK_SECURE=false
# ── Emoji Sync ────────────────────────────────────────────────────
EMOJI_SYNC = "true" # auto-uploads & patches emoji.py on startup
# ── API / Dashboard Backend ───────────────────────────────────────
API_ENABLED = "true"
API_PORT = "8000"
DASHBOARD_API_KEY = "change_this_to_a_strong_secret"
# ── HTTPS Tunnel (ngrok) ──────────────────────────────────────────
TUNNEL_ENABLED = "true"
NGROK_AUTHTOKEN = "your_ngrok_authtoken"
NGROK_DOMAIN = "xxxx-xxxx-xxxx.ngrok-free.app"
# ── Webhooks ──────────────────────────────────────────────────────
WEBHOOK_URL = "https://discord.com/api/webhooks/..."
4 — Run the bot
python CodeX.py
✦ Dashboard Setup
1 — Install dependencies
cd dashboard
npm install
2 — Configure the environment
Copy .env.example to .env.local and fill in the values:
NEXT_PUBLIC_API_URL = https://xxxx.ngrok-free.app/api/v1
NEXT_PUBLIC_DASHBOARD_API_KEY = your_shared_api_key
NEXTAUTH_URL = http://localhost:3000
NEXTAUTH_SECRET = a_long_random_string
DISCORD_CLIENT_ID = your_discord_oauth_client_id
DISCORD_CLIENT_SECRET = your_discord_oauth_client_secret
NEXT_PUBLIC_ADMIN_IDS = your_discord_user_id
NEXT_PUBLIC_BRAND_NAME = "ZyroX"
NEXT_PUBLIC_BRAND_NAME_WORD = "ZX"
3 — Run locally
npm run dev
✦ Environment Reference
Bot — bot/.env
| Variable | Default | Description |
|---|---|---|
TOKEN |
— | Discord bot token |
LAVALINK_HOST |
— | Lavalink server hostname (no protocol) |
LAVALINK_PASSWORD |
— | Lavalink password |
LAVALINK_SECURE |
true |
true = HTTPS, false = HTTP |
LAVALINK_PORT |
(empty) | Port — only needed when LAVALINK_SECURE=false |
EMOJI_SYNC |
true |
Run application emoji sync on startup |
API_ENABLED |
true |
Start the FastAPI dashboard backend |
API_PORT |
8000 |
Port the backend listens on |
DASHBOARD_API_KEY |
— | Shared secret between bot API and dashboard |
WEBHOOK_URL |
— | Discord webhook for command logs |
TUNNEL_ENABLED |
true |
Expose the API over HTTPS via ngrok |
NGROK_AUTHTOKEN |
— | ngrok auth token |
NGROK_DOMAIN |
— | Reserved static domain (e.g. xxxx.ngrok-free.app) |
Dashboard — dashboard/.env.local
| Variable | Description |
|---|---|
NEXT_PUBLIC_API_URL |
Full URL to the bot's FastAPI backend (use ngrok URL in production) |
NEXT_PUBLIC_DASHBOARD_API_KEY |
Must match DASHBOARD_API_KEY in the bot |
NEXTAUTH_URL |
Your dashboard's public URL |
NEXTAUTH_SECRET |
Random secret for NextAuth session signing |
DISCORD_CLIENT_ID |
Discord OAuth2 client ID |
DISCORD_CLIENT_SECRET |
Discord OAuth2 client secret |
NEXT_PUBLIC_ADMIN_IDS |
Comma-separated Discord user IDs with admin access |
NEXT_PUBLIC_BRAND_NAME |
Bot name shown in the dashboard UI |
NEXT_PUBLIC_BRAND_NAME_WORD |
Short abbreviation shown in the dashboard |
✦ HTTPS Tunnel (ngrok)
The bot uses pyngrok to expose the API over HTTPS — no system installs needed, works on Pterodactyl and any Python host.
With a free ngrok static domain the URL never changes between restarts.
One-time setup:
# 1. Sign up free at https://ngrok.com
# 2. Get your authtoken: https://dashboard.ngrok.com/get-started/your-authtoken
# 3. Reserve a static domain: https://dashboard.ngrok.com/domains
Add to bot/.env:
TUNNEL_ENABLED = "true"
NGROK_AUTHTOKEN = "your_token"
NGROK_DOMAIN = "xxxx.ngrok-free.app"
On every startup the console prints:
◈ Tunnel: API is live at https://xxxx.ngrok-free.app
↳ set NEXT_PUBLIC_API_URL=https://xxxx.ngrok-free.app/api/v1
✦ Deployment
🤖 Bot — any Python host
- Upload the entire
bot/folder to your host (Pterodactyl, Render, Railway, Fly.io, VPS…) - Set the start command to
python CodeX.py - Add all environment variables
- pyngrok downloads the ngrok binary automatically on first run — no extra steps
Recommended free/cheap hosts: Render · Railway · Fly.io · VPS
⭐ NexioHost — Premium bot hosting, built for Discord bots. Fast, reliable, and affordable.
🌐 Dashboard — Vercel
- Go to vercel.com → Add New Project → connect your GitHub repo
- Set root directory to
dashboard/ - Add all environment variables under Settings → Environment Variables
- Add the OAuth redirect URI in Discord Developer Portal:
https://your-app.vercel.app/api/auth/callback/discord - Hit Deploy — done ✓
✦ Emoji Sync
Runs automatically on startup when EMOJI_SYNC=true:
★ Starting Application Emoji Sync — 144 unique emojis found in emoji.py
◈ Found 144 templates | Application hosts 202 emojis
↑ Uploading: ztick (not in application emojis)
✔ Uploaded: ztick [saved as ID: 1234567890]
✔ emoji.py patched in-place to reflect current API state.
★ Restarting bot to load updated emoji IDs...
| Event | Action |
|---|---|
| New emoji found | Uploaded to application, ID written to emoji.py |
| Stale ID detected | emoji.py patched automatically |
| No changes | Sync completes instantly, no restart |
| After any patch | Bot restarts itself so fresh IDs are live |
✦ Troubleshooting
| Problem | Fix |
|---|---|
| Bot fails to start | Check TOKEN is set and bot has correct gateway intents |
| Music not working | Verify LAVALINK_HOST, LAVALINK_SECURE, and LAVALINK_PORT |
| Dashboard auth error | Check Discord OAuth client ID/secret and redirect URI |
| Dashboard can't load data | Confirm API_ENABLED=true, bot is running, NEXT_PUBLIC_API_URL is correct |
| Emojis showing as plain text | Run with EMOJI_SYNC=true once to upload and patch IDs |
| CORS errors from dashboard | Make sure your Vercel URL is in the CORS origins list or add it via CORS_ORIGINS env var |
| Tunnel not starting | Check NGROK_AUTHTOKEN is valid — get it from dashboard.ngrok.com |
| Tunnel URL changes on restart | Set NGROK_DOMAIN to your reserved static domain |
✦ Security
- Never commit
.envfiles —.gitignorealready covers them - Use a strong, unique
NEXTAUTH_SECRETandDASHBOARD_API_KEY - Rotate any secret that gets accidentally exposed
- The bot API is always behind an API key — never expose it without one