Skip to content

Repository files navigation

AIO Bot Manager

A desktop manager app for an all-in-one Discord bot — moderation, music (YouTube / Spotify / SoundCloud), role-based rank, automod, welcome messages, custom commands, reaction roles, and a web dashboard + webhook relay, all in one server. The manager app is the "control panel": paste your bot token, hit Start, and watch it come online with a live console and status lights.

It ships as source (Electron + Node.js), with instructions to package it into a sideloadable Windows app — see PACKAGING.md for the Add-AppxPackage -Register route.

Features

Category Commands
🛡️ Moderation /ban /kick /timeout /warn /warnings /clearwarnings /purge /lock /unlock /slowmode /tempban /nuke /massrole
📣 Server tools /announce /embed /say /autorole
🎶 Music /play (YouTube, Spotify, or SoundCloud links, or a plain search) /playnext /skip /skipvote /stop /pause /resume /queue /nowplaying /loop /volume /shuffle /seek /remove /clearqueue /autoplay /filter /247 /join /leave
⚙️ Automod /automod toggle /automod antiinvite /automod antispam /automod wordfilter add/remove/list
🎖️ Role rank /rank /leaderboard — based on a member's roles & permissions, not message-count XP
👋 Welcome / leave /welcome enable/disable/test /leavemessage enable/disable
📝 Logging /logging enable/disable — bans, kicks, timeouts, warns, edits, deletes
🎭 Bot identity /setname /setavatar /setnickname /status — rename, re-avatar, or go invisible on the fly (owner-only)
🔗 Webhooks & dashboard /webhook create/list/delete (native Discord webhooks) + a local relay and full web dashboard (see below)
💬 Custom commands /customcommand add/remove/list — simple text auto-responses
🎭 Reaction roles /reactionrole add/remove
🎉 Fun & utility /8ball /coinflip /dice /poll /afk /snipe /userinfo /serverinfo /avatar /ping /help

Note on Spotify: Spotify's API doesn't allow third-party apps to stream audio directly. Spotify links are resolved to their track/artist/album metadata, then the matching audio is streamed from YouTube or SoundCloud — this is how essentially all Discord music bots handle Spotify links.

Making the bot look offline

Set Status to Invisible in the desktop app's Configuration tab (or run /status presence:Invisible, or use the web dashboard's Identity tab). The bot keeps running exactly as normal — it just won't show up as online in the member list. This choice is saved and re-applied automatically every time the bot restarts, so you don't need to set it again.

Renaming the bot

  • /setnickname — changes the bot's display name in the current server only. Not rate-limited, so use this for everyday tweaks.
  • /setname — changes the bot's actual Discord username everywhere. Discord only allows a couple of these per hour, so save it for real rebrands.
  • /setavatar — changes the bot's avatar from an image URL.

All three (plus presence) are owner-only and also available from the web dashboard's Identity tab if you'd rather use a browser.

The web dashboard

While the bot is running, it also serves a small password-protected web control panel — Overview (server list + live status), Servers (edit welcome/automod/autorole/logging and custom commands per server), Identity (rename/re-avatar/change presence), and a webhook test tool. Locally it's at http://localhost:3939 (or your WEBHOOK_PORT); the Open Web Dashboard button on the desktop app's Overview tab opens it directly. Set DASHBOARD_PASSWORD in Configuration to unlock it — it stays locked otherwise.

Deploying the bot to Railway gives you this same dashboard at a public HTTPS URL instead — see RAILWAY.md.

Quick start (development)

npm install
npm start

Want the bot running 24/7 without keeping your PC on? See RAILWAY.md — deploys just the bot/ folder, no Electron, and gives you the same web dashboard at a public URL.

The manager window opens. Go to Configuration, fill in your bot token and client ID (see below for where to get them), save, then press Start Bot in the sidebar.

Closing the window minimizes AIO Bot Manager to the system tray rather than quitting — that way your Discord bot keeps running in the background. Right-click the tray icon to stop the bot or quit fully.

Setting up a Discord bot application

  1. Go to the Discord Developer PortalNew Application.
  2. Bot tab → Reset Token → copy it into the manager's Bot Token field.
  3. On the same Bot tab, enable these under Privileged Gateway Intents:
    • Server Members Intent
    • Message Content Intent (Required for automod, custom commands, and AFK detection.)
  4. OAuth2 → General → copy the Client ID into the manager's Client ID field.
  5. Use Overview → Copy Invite Link in the app (or OAuth2 → URL Generator with the bot and applications.commands scopes) to invite it to your server.

If you set a Dev Guild ID in Configuration, slash commands register instantly to that one server — great while testing. Leave it blank for normal use; global commands can take up to an hour to first appear after a fresh deploy, but work in every server the bot joins after that.

The webhook relay

While the bot is running, a small local web server listens on the port you set (default 3939) so anything on your PC — a script, a scheduled task, a tool like Zapier/IFTTT if it can reach your machine — can post a message into a Discord channel:

curl -X POST http://localhost:3939/notify \
  -H "Content-Type: application/json" \
  -H "x-webhook-secret: YOUR_SECRET" \
  -d '{"channelId":"123456789012345678","content":"Hello from outside Discord!"}'

You can also send a rich embed instead of plain content:

{ "channelId": "123...", "embed": { "title": "Deploy finished", "description": "Build #42 passed ✅", "color": "#3ecf8e" } }

This is separate from /webhook create, which creates a native Discord webhook URL (posts directly to Discord's own webhook endpoint from anywhere on the internet, no bot process required) — use whichever fits: native Discord webhooks for public/internet-facing integrations, the local relay for anything already running on the same machine as the bot.

Project structure

main.js              Electron main process (window, tray, bot process control)
preload.js            Safe bridge between the UI and main process
renderer/             The desktop manager's UI (HTML/CSS/JS)
bot/
  index.js            Bot entry point (also the Railway start command)
  package.json         Standalone dependency list for deploying just this folder
  railway.json          Explicit Railway build/start config
  Dockerfile             Container build Railway (and any Docker host) picks up automatically
  deploy-commands.js  Registers slash commands with Discord
  commands/           One file per command category (each exports an array)
    identity.js          setname / setavatar / setnickname / status
    fun.js               8ball, coinflip, dice, poll, afk, snipe
    autorole.js          Auto-role on join
    rolerank.js           /rank & /leaderboard — role/permission-based, not XP
    moderationExtra.js  tempban, nuke, announce, embed, say, massrole
    musicExtra.js        247, seek, autoplay, filter, playnext, remove, clearqueue, skipvote
  events/             Discord.js event listeners
  handlers/           Command/event loaders, automod checks, temp-ban sweeper
  music/              DisTube setup (YouTube/Spotify/SoundCloud)
  web/                Web dashboard (public/) + the REST API + webhook relay, one Express server
  utils/              Database, embeds, logger, permissions
  data/               JSON "database" files (created at runtime, git-ignored)
packaging/            AppxManifest.xml, Assets/, register.ps1 — see PACKAGING.md
RAILWAY.md             Deploying the bot (headless) to Railway

Configuration lives in a single .env file at the project root (see .env.example); the manager app's Configuration tab reads and writes it for you, so you rarely need to open it directly. On Railway, you set the same variables in their dashboard instead — see RAILWAY.md.

Troubleshooting

  • "Cannot connect to the voice channel after 30 seconds" — this project already forces IPv4 DNS resolution at startup (bot/index.js), which fixes the vast majority of cases; this error is almost always caused by Docker/WSL2/cloud networking resolving Discord's voice servers over IPv6 and then failing the UDP handshake. If you still see it:
    • Running under WSL2: try running the bot with Windows-native Node.js instead (WSL2's default NAT networking has known UDP quirks). See the WSL tutorial in this project's chat history, or just run it from a normal Windows PowerShell.
    • Running on Railway or another host: this should just work, since it's outbound-only UDP traffic; if it doesn't, check that host's network/firewall policies.
  • Want lower CPU usage for voice encoding — this project uses opusscript by default because it's pure JavaScript and never needs a compiler, so npm install just works on a fresh machine. If you'd like the faster native encoder instead: npm uninstall opusscript && npm install @discordjs/opus (requires Python + a C++ compiler toolchain to build if no prebuilt binary matches your Node version).
  • No audio plays / "no engine could handle this URL" — make sure ffmpeg-static installed correctly (npm ls ffmpeg-static); it bundles its own ffmpeg binary so you shouldn't need one on your system PATH.
  • Slash commands don't show up — set DEV_GUILD_ID in Configuration for instant registration while testing; without it, global commands can take up to an hour after the first deploy.
  • Leveling / automod / welcome messages don't fire — double-check the Server Members Intent and Message Content Intent are turned on in the Developer Portal (step 3 above). The bot can't read message content or see full member info without them.
  • The bot won't start from the manager app — check the Console tab for the actual error; the most common cause is an invalid or expired bot token.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages