1. Discord Bot für Musik

1.1. Einführung

Über Discord vernetzen sich zahlreiche Menschen miteinander. Diese können sich über Instant-Messages, Video- und Sprachkonferenzen in sogenannten Servern unterhalten. Mit Hilfe von Bots können die Funktionen dieser Server erweitert werden. Ziel dieses Projekts ist es sich mit den Discord Bots auseinanderzusetzen und einen eigenen zu erstellen, der Musik abspielen kann, indem eine URL zu einem Youtube Video bereitgestellt wird. Diesen werden wir mit Python programmieren.

1.2. Discord

Discord-Nutzer können teil eines Servers werden oder eigene Server erstellen. Diese bestehen aus Sprach-, Text- und Informationskanälen. Um diese Server nutzerfreundlicher zu gestalten, kann jeder Serveradministrator Bots erstellen oder bereits bestehende einbinden. Diese bieten zahlreiche Funktionen, so kann ein Bot beispielsweise die Informationskanäle automatisch füllen, neue Mitglieder grüßen oder auf Nachrichten reagieren.

1.3. Erstellung des Bots

Um einen neuen Bot zu erstellen, wird ein Discord Account benötigt. Man kann sich kostenlos bei https://discord.com/ registrieren. Für den Bot muss eine Application erstellt werden. Dies wird auf https://discord.com/developers getan, indem man auf „New Application“ drückt.

_images/discord_application.jpg

Anschließend wird der Application ein Bot hinzugefügt und diesem werden die richtigen Rechte zugewiesen. Um diesen zu erstellen, muss auf der linken Seite auf „Bot“ geklickt werden.

_images/discord_app_bot.jpg

Da wir testen, geben wir dem Bot Administrator-Rechte und zusätzlich alle Gateway Intents.

_images/discord_gateway_intents.jpg

Wir vermerken uns außerdem den Token, da dieser die ID des Bots ist und für die Programmierung benötigt wird. Der erstellte Bot kann nun einem Server zugeordnet werden. Wenn kein Server vorhanden ist, muss einer erstellt werden. Für die Zuordnung zu einem Server muss im Discord Developer auf „OAuth2“ geklickt werden. Dort wird eine URL für die Zuweisung generiert. Dafür muss „bot“ und „Administrator“ ausgewählt werden. Anstelle direkt „Administrator“ auszuwählen, können bereits die benötigten Berechtigungen ausgewählt werden. Für einen Musik-Bot wären dies alle „Text-Permissions“ sowie alle „Voice-Permissions“ ausgenommen der Video Berechtigung. Für reine Testzwecke ist „Administrator“ jedoch die beste Wahl.

_images/discord_bot_url.jpg

1.4. Code

Damit der folgende Code funktioniert müssen folgende Python Bibliotheken installiert werden:

  • PyNaCl

    • Eine Netzwerk- und Cryptographie Bibliothek, die es dem Bot erlaubt, einem Sprachkanal beizutreten

  • yt_dlp

  • discord.py

  • python-dotenv

Außerdem muss die Software ffmpeg installiert und im System als Pfadvariable hinterlegt werden. Binaries für verschiedene Systeme können hier gefunden werden: https://ffmpeg.org/download.html

Folgende Bibliotheken müssen importiert werden:

import discord
import os
import asyncio
import yt_dlp
from dotenv import load_dotenv
  1. discord Libary: API wrapper für Discord

  2. os Libary: sorgt dafür dass das Programm auf allen System funktioniert

  3. asyncio Libary: benutzen wir, damit der Bot in mehreren Sprachkanälen asynchron Musik abspielen kann

  4. yt_dlp Libary: lädt Videos und Audio Dateien von Youtube herunter

  5. dotenv Libary: liest .env Dateien ein

In einer .env Datei muss der Token folgendermaßen hinterlegt werden:

discord_token=TOKEN

Eine Beispielsdatei kann im Projekt gefunden werden.

Diese Datei wird eingelesen und aus ihr wird der Token in die dementsprechende Variable eingefügt. Anschließend wird ein Client erstellt, der sich mit Discord verbinden kann und die benötigten Gateway Intents besitzt.

load_dotenv()
TOKEN = os.getenv('discord_token')
intents = discord.Intents.default()
intents.message_content = True
intents.voice_states = True

Wenn der Bot bereit ist, wird die Nachricht auf der Konsole ausgegeben.

@client.event
async def on_ready():
    print(f'{client.user} is now playing')

Wenn ein Kommando im Discord Server eingegeben wird wird folgender Code aufgerufen:

@client.event
async def on_message(message):
    if message.content.startswith('!play'):
        try:
            voice_client = await message.author.voice.channel.connect()
            voice_clients[voice_client.guild.id] = voice_client
        except Exception as e:
            print(e)

        try:
            url = message.content.split()[1]
            loop = asyncio.get_event_loop()
            data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=False))
            song = data['url']
            player = discord.FFmpegOpusAudio(source=song, **ffmpeg_options)

            voice_clients[message.guild.id].play(player)

        except Exception as e:
            print(e)

Wenn der Bot den Befehl !play Youtube-URL erhält, betritt dieser den Sprachkanal, in dem der User sich gerade befindet. Anschließend wird die Musik heruntergeladen und die Musik abgespielt. Die Libary asyncio wird verwendet, damit der Bot noch auf weitere Kommandos reagieren kann, während er Musik abspielt.

Die weiteren Befehle !pause, !resume, !stop werden ähnlich implementiert:

if message.content.startswith("!pause"):
    try:
        voice_clients[message.guild.id].pause()
        except Exception as e:
            print(e)

    if message.content.startswith("!resume"):
        try:
            voice_clients[message.guild.id].resume()
        except Exception as e:
            print(e)

    if message.content.startswith("!stop"):
        try:
            voice_clients[message.guild.id].stop()
            await voice_clients[message.guild.id].disconnect()
        except Exception as e:
            print(e)

Der Befehl !stop bewirkt, dass der Voice Client gestoppt wird und der Bot den Sprachkanal verlässt.

Zuletzt werden die Events mit dem Bot verknüpft.

client.run(TOKEN)

1.5. Fazit

Ein Discord Bot ist ein hilfreiches Tool, um Discord Server zu erweitern und kann dazu genutzt werden, um in die Programmierung einzusteigen. Es gibt zahlreiche Tutorials, die die unterschiedlichen Funktionen implementieren.

1.6. Literatur

Python os library docs: https://docs.python.org/3/library/os.html discord.py library docs: https://discordpy.readthedocs.io/en/stable/ Python asyncio library docs: https://docs.python.org/3/library/asyncio.html yt_dlp library docs: https://github.com/yt-dlp/yt-dlp python-dotenv library docs: https://pypi.org/project/python-dotenv/ Discord: https://discord.com/ Discord-Developer: https://discord.com/developers Real Python Tutorial: https://realpython.com/how-to-make-a-discord-bot-python/