A Discord bot built with discord.py that lets users create and manage temporary voice channels in their server. All responses use Discord's Components V2 — no legacy embeds.
Developer: itsfizys
Support Server: AeroX Development
- Per-server configuration — settings in one server never affect another
- Automatically creates a temporary voice channel when a user joins the "Join to Create" channel
- Automatically deletes temporary channels when they become empty
- Persistent button interface — control your VC without typing commands
- Per-channel owner controls: lock, hide, rename, limit, bitrate, claim, transfer, permit/reject
- SQLite database via
aiosqlitefor persistent storage - Cooldowns, permission checks, and guild-only enforcement on all commands
- All UI built with Components V2 — no legacy embeds
- Python 3.11+
discord-py >= 2.7.1aiosqlite >= 0.22.1
Install dependencies:
pip install -r requirements.txtgit clone https://github.com/AeroXDevs/VoiceMaster-Bot.git
cd VoiceMaster-BotOpen config.py and set your values:
TOKEN = "YOUR_BOT_TOKEN_HERE"
PREFIX = "!"
DATABASE_PATH = "database/aerox.db"DATABASE_PATH can also be set via the DATABASE_PATH environment variable — it takes priority over config.py.
In the Discord Developer Portal, enable:
- Server Members Intent — required to detect voice state changes
- Message Content Intent — required to process prefix commands
python aerox.pyaerox-voicemaster/
├── aerox.py # Bot entry point — AeroxContext, Aerox bot class, startup
├── config.py # Token, prefix, database path
├── emojis.py # All emoji constants — customise button/UI emojis here
├── logger.py # Colorful ANSI console logger
├── pyproject.toml # Project metadata and dependencies
│
├── commands/
│ ├── voicemaster.py # All Join2Create commands, listeners, and button interface
│ └── help.py # Interactive help command (Components V2)
│
├── database/
│ ├── __init__.py # SQLitePool wrapper — execute, fetchrow, fetch, fetchval
│ └── aerox.db # SQLite database (auto-created on first run)
│
└── utilities/
├── __init__.py # Utilities package init
├── checks.py # guild_only, has_perms, bot_has_perms, cooldown
├── converters.py # DiscordRole, DiscordMember converters
└── decorators.py # Custom command decorators
All button and UI emojis are defined in emojis.py. You can swap any of them for custom Discord emojis or different Unicode characters without touching the command logic.
LOCK = "🔒" # Lock button
UNLOCK = "🔓" # Unlock button
GHOST = "👻" # Hide button
REVEAL = "👁️" # Reveal button
CLAIM = "🎤" # Claim button
DISCONNECT = "🔌" # Disconnect button
INFO = "ℹ️" # Info button
INCREASE = "➕" # Increase limit button
DECREASE = "➖" # Decrease limit buttonTo use a custom Discord emoji, replace the value with the emoji string in the format <:name:id> or <a:name:id> for animated.
Default prefix: !
The main command group is join2create — aliases: j2c, vm.
| Command | Aliases | Description |
|---|---|---|
!help |
!h, !cmds, !commands |
Show the interactive help panel |
!join2create |
!j2c, !vm |
Show Join2Create info and popular commands |
| Command | Description |
|---|---|
!join2create setup |
Create the join channel and category |
!join2create sendinterface |
Send the persistent button control panel |
!join2create reset |
Reset all settings and delete temp channels |
!join2create category [category] |
Set the category for temporary voice channels |
| Command | Description |
|---|---|
!join2create lock |
Lock your voice channel |
!join2create unlock |
Unlock your voice channel |
!join2create ghost |
Hide your voice channel from others |
!join2create unghost |
Reveal your voice channel |
!join2create claim |
Claim an inactive voice channel |
!join2create name <name> |
Rename your voice channel |
!join2create limit <number> |
Set user limit (0 = no limit, max 99) |
!join2create bitrate <kbps> |
Set bitrate (8–384 kbps) |
!join2create status [text] |
Set or clear a channel status |
!join2create configuration |
View current channel info |
| Command | Description |
|---|---|
!join2create permit <member/role> |
Allow a member or role to join |
!join2create reject <member/role> |
Block a member or role from joining |
!join2create transfer <member> |
Transfer channel ownership |
!join2create disconnect <member> |
Disconnect a member from your channel |
!join2create role <role> |
Assign a role to channel members |
Requires Manage Guild permission.
| Command | Description |
|---|---|
!join2create default |
View current default settings |
!join2create default name <name> |
Set default channel name ({user} = display name) |
!join2create default limit <number> |
Set default user limit |
!join2create default bitrate <kbps> |
Set default bitrate |
!join2create default region [region] |
Set default voice region |
After running !join2create sendinterface, users get a persistent button panel in the channel:
| Button | Action |
|---|---|
| 🔒 Lock | Lock the channel |
| 🔓 Unlock | Unlock the channel |
| 👻 Hide | Hide the channel |
| 👁 Reveal | Reveal the channel |
| 🎤 Claim | Claim an inactive channel |
| 🔌 Disconnect | Remove a member via dropdown |
| ℹ️ Info | View channel information |
| ➕ Increase | Increase user limit by 1 |
| ➖ Decrease | Decrease user limit by 1 |
| Permission | Reason |
|---|---|
| View Channels | Monitor voice events |
| Send Messages | Send command responses |
| Manage Channels | Create and delete temporary voice channels |
| Move Members | Move users into their new temp channel |
| Manage Roles | Assign permissions in temp channels |
Join the support server for help, bug reports, and updates:
discord.gg/aerox