musicbot
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| musicbot [2025/09/18 23:38] – [🔐 Insert Your Bot Token] miko | musicbot [2025/11/25 16:37] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== 🎵 Ambient Lo-Fi Discord Music Bot – Installation & Usage ====== | + | ====== 🎵 Discord Music Bot – Installation & Usage ====== |
| This bot plays ambient lo-fi music automatically in your Discord voice channel. It starts with shuffle, continues playing without stopping, and can be controlled via simple commands. | This bot plays ambient lo-fi music automatically in your Discord voice channel. It starts with shuffle, continues playing without stopping, and can be controlled via simple commands. | ||
| Line 17: | Line 17: | ||
| ===== 🔐 Insert Your Bot Token ===== | ===== 🔐 Insert Your Bot Token ===== | ||
| - | Open `bot.py` and replace: | + | Open `.env` and replace: |
| - | < | + | < |
| with your actual Discord bot token. | with your actual Discord bot token. | ||
| Line 41: | Line 41: | ||
| Copy the generated URL and open it in your browser to invite the bot. | Copy the generated URL and open it in your browser to invite the bot. | ||
| - | ===== 🚀 Starting the Bot ===== | + | ===== 🚀 Bot ===== |
| - | To start manually: | + | Now available on github! |
| - | `python3 ./bot.py` | + | |
| - | Or set up a systemd service: | + | [[https://github.com/JoranJix/discord-musicbot|discord-musicbot]] |
| - | + | ||
| - | < | + | |
| - | sudo adduser musikbot | + | |
| - | sudo chown -R musikbot: | + | |
| - | </ | + | |
| - | Autostart on server start | + | |
| - | < | + | |
| - | sudo nano / | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | [Unit] | + | |
| - | Description=Discord Music Bot | + | |
| - | After=network.target | + | |
| - | + | ||
| - | [Service] | + | |
| - | ExecStart=/ | + | |
| - | WorkingDirectory=/ | + | |
| - | Restart=always | + | |
| - | User=musikbot | + | |
| - | + | ||
| - | [Install] | + | |
| - | WantedBy=multi-user.target | + | |
| - | </ | + | |
| - | + | ||
| - | Enable and start the service: | + | |
| - | `sudo systemctl daemon-reload` | + | |
| - | `sudo systemctl enable musicbot` | + | |
| - | `sudo systemctl start musicbot` | + | |
| - | + | ||
| - | ===== 🎧 Discord Commands ===== | + | |
| - | * `!join` – Bot joins your voice channel and starts shuffle playback | + | |
| - | * `!leave` – Bot leaves the voice channel | + | |
| - | * `!list` – Lists all available MP3 files | + | |
| - | * `!play [filename]` – Plays a specific file or a random one if none is given | + | |
| - | * `!next` – Skips to the next track | + | |
| - | * `!shuffle` – Shuffles the playlist and starts playback | + | |
| - | * `!pause` – Pauses playback | + | |
| - | * `!resume` – Resumes playback | + | |
| - | * `!stop` – Stops playback | + | |
| - | * `!help` – Displays all available commands | + | |
| - | + | ||
| - | ===== 🧠 Notes ===== | + | |
| - | * The bot plays continuously without stopping after each track | + | |
| - | * Volume is set to 100% | + | |
| - | * Make sure the bot has “Speak” permissions in the voice channel | + | |
| - | * Works best in standard voice channels (not Stage Channels) | + | |
| - | + | ||
| - | ===== 📂 Folder Structure ===== | + | |
| - | < | + | |
| - | /var/www/mbot/ | + | |
| - | ├── bot.py | + | |
| - | ├── music/ | + | |
| - | │ | + | |
| - | │ | + | |
| - | </code> | + | |
| - | ===== 📂 bot.py ===== | + | |
| - | <file bot.py> | + | |
| - | import | + | |
| - | from discord.ext import commands | + | |
| - | import os | + | |
| - | import random | + | |
| - | + | ||
| - | intents = discord.Intents.default() | + | |
| - | intents.message_content = True | + | |
| - | intents.members = True | + | |
| - | intents.guilds = True | + | |
| - | + | ||
| - | bot = commands.Bot(command_prefix=" | + | |
| - | + | ||
| - | MUSIC_DIR = " | + | |
| - | playlist = [] | + | |
| - | current_index = -1 | + | |
| - | + | ||
| - | @bot.event | + | |
| - | async def on_ready(): | + | |
| - | print(f" | + | |
| - | + | ||
| - | def play_next_track(ctx): | + | |
| - | global playlist, current_index | + | |
| - | vc = ctx.voice_client | + | |
| - | if not vc or not playlist: | + | |
| - | return | + | |
| - | + | ||
| - | current_index = (current_index + 1) % len(playlist) | + | |
| - | filepath = os.path.join(MUSIC_DIR, | + | |
| - | source = discord.FFmpegPCMAudio(filepath, | + | |
| - | + | ||
| - | def after_playing(error): | + | |
| - | if error: | + | |
| - | print(f" | + | |
| - | else: | + | |
| - | play_next_track(ctx) | + | |
| - | + | ||
| - | vc.play(source, | + | |
| - | + | ||
| - | async def start_shuffle(ctx): | + | |
| - | global playlist, current_index | + | |
| - | vc = ctx.voice_client | + | |
| - | + | ||
| - | playlist = [f for f in os.listdir(MUSIC_DIR) if f.endswith(" | + | |
| - | if not playlist: | + | |
| - | await ctx.send(" | + | |
| - | return | + | |
| - | + | ||
| - | random.shuffle(playlist) | + | |
| - | current_index = 0 | + | |
| - | filepath = os.path.join(MUSIC_DIR, | + | |
| - | source = discord.FFmpegPCMAudio(filepath, | + | |
| - | + | ||
| - | def after_playing(error): | + | |
| - | if error: | + | |
| - | print(f" | + | |
| - | else: | + | |
| - | play_next_track(ctx) | + | |
| - | + | ||
| - | vc.stop() | + | |
| - | vc.play(source, | + | |
| - | await ctx.send(f" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def join(ctx): | + | |
| - | member = ctx.guild.get_member(ctx.author.id) | + | |
| - | if member and member.voice and member.voice.channel: | + | |
| - | channel = member.voice.channel | + | |
| - | await channel.connect() | + | |
| - | await ctx.send(f" | + | |
| - | await start_shuffle(ctx) | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def leave(ctx): | + | |
| - | if ctx.voice_client: | + | |
| - | await ctx.voice_client.disconnect() | + | |
| - | await ctx.send(" | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def list(ctx): | + | |
| - | files = [f for f in os.listdir(MUSIC_DIR) if f.endswith(" | + | |
| - | if not files: | + | |
| - | await ctx.send(" | + | |
| - | else: | + | |
| - | msg = " | + | |
| - | await ctx.send(f" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def play(ctx, filename=None): | + | |
| - | vc = ctx.voice_client | + | |
| - | global playlist, current_index | + | |
| - | + | ||
| - | if not vc: | + | |
| - | await ctx.send(" | + | |
| - | return | + | |
| - | + | ||
| - | if filename: | + | |
| - | filepath = os.path.join(MUSIC_DIR, | + | |
| - | if not os.path.isfile(filepath): | + | |
| - | await ctx.send(" | + | |
| - | return | + | |
| - | playlist = [filename] | + | |
| - | current_index = 0 | + | |
| - | else: | + | |
| - | playlist = [f for f in os.listdir(MUSIC_DIR) if f.endswith(" | + | |
| - | if not playlist: | + | |
| - | await ctx.send(" | + | |
| - | return | + | |
| - | current_index = random.randint(0, | + | |
| - | + | ||
| - | filepath = os.path.join(MUSIC_DIR, | + | |
| - | source = discord.FFmpegPCMAudio(filepath, | + | |
| - | + | ||
| - | def after_playing(error): | + | |
| - | if error: | + | |
| - | print(f" | + | |
| - | else: | + | |
| - | play_next_track(ctx) | + | |
| - | + | ||
| - | vc.stop() | + | |
| - | vc.play(source, | + | |
| - | await ctx.send(f" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def next(ctx): | + | |
| - | if ctx.voice_client: | + | |
| - | play_next_track(ctx) | + | |
| - | await ctx.send(" | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def shuffle(ctx): | + | |
| - | if ctx.voice_client: | + | |
| - | await start_shuffle(ctx) | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def pause(ctx): | + | |
| - | if ctx.voice_client and ctx.voice_client.is_playing(): | + | |
| - | ctx.voice_client.pause() | + | |
| - | await ctx.send(" | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def resume(ctx): | + | |
| - | if ctx.voice_client and ctx.voice_client.is_paused(): | + | |
| - | ctx.voice_client.resume() | + | |
| - | await ctx.send(" | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def stop(ctx): | + | |
| - | if ctx.voice_client and ctx.voice_client.is_playing(): | + | |
| - | ctx.voice_client.stop() | + | |
| - | await ctx.send(" | + | |
| - | else: | + | |
| - | await ctx.send(" | + | |
| - | + | ||
| - | @bot.command() | + | |
| - | async def help(ctx): | + | |
| - | help_text = ( | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | ) | + | |
| - | await ctx.send(help_text) | + | |
| - | + | ||
| - | bot.run(" | + | |
| - | </ | + | |
| - | ===== 🛟 Support & Extensions ===== | + | |
| - | You can expand the bot anytime – with volume control, queue management, or even a web interface. For questions or ideas, feel free to reach out! | + | |
musicbot.1758238685.txt.gz · Last modified: (external edit)
