IT Projekte / Home Lab / Smart Home / Games

Allgemein, Discord

Discord Bot – Cogs verwenden 2023

In diesem Beitrag zeige ich Dir, wie Du Cogs in Deinem Projekt einsetzen und nutzen kannst. Dein Bot kann auf das Beitreten von Nutzern mit einer Nachricht im Systemchannel oder einem speziell definierten Channel reagieren. Ebenfalls kann Dein Bot auch eine Nachricht direkt an das neue Mitglied senden.

Du benötigst Folgendes:

  • Einen Discord Account
  • Einen Discord Server
  • Einen Discord Bot

Erstelle Deinen eigenen Discord Server
Lege Deinen eigenen Discord Bot an

1. Ordner erstellen

Erstelle einen neuen Ordner, in dem Du Deine Cogs ablegen willst.

Disocrd Bot Cogs - Ordner anlegen
Disocrd Bot Cogs – Ordner anlegen

Lege hier eine neue Python-Datei an. Diese muss wie das Modul / die Klasse heißen.

./cogs/welcome.py

2. Script schreiben

Nun möchtest Du zum Beispiel eine Willkommens-Nachricht in einen bestimmten Channel senden, wenn ein neuer Nutzer den Server betritt. Ebenfalls möchtest Du vielleicht diesem Nutzer eine persönliche Nachricht direkt zukommen lassen. Eine Nachricht, wenn der Nutzer den Server verlässt oder auch gebannt wurde.

Zu Beginn importiere wieder Discord und dieses Mal die commands über die discord.ext, da in einem Cog Du den Bot nicht direkt ansprechen kannst.

import discord
from discord.ext import commands

Lege eine Klasse an, welcher commands.Cog mit übergeben wird. Durch diese Klasse wird ein Cog erstellt, welcher wiederum als ein Modul dem Bot hinzugefügt werden kann.

class Welcome(commands.Cog):

2.1 Die Self Variable

Um Dein Cog später nutzen und ausführen zu können, benötigst Du eine __init__ Methode, welche beim Laden des Cogs aufgerufen wird. Dieser Methode übergibst Du einmal self und einmal bot. Self steht hier für die Klasse selbst und repräsentiert diese, während mit bot Dein Bot discord.Bot oder auch discord.ext.commands.Bot gemeint ist. Alle Methoden innerhalb Deiner Klasse benötigen zusätzlich self, da self die Klasse selbst ist und Du hier die Verknüpfung zu Deinem Bot hinterlegt hast.

def __init__(self, bot):
    self.bot = bot

2.2 Erstelle Deine Commands

Da Du Dich nun in einem Cog bist und hier die Commands ausführen möchtest, kannst Du nicht @bot.command() nutzen, sondern musst auch hier auf @commands.command() wechseln. Darüber hinaus müssen Deine Commands in Deiner Cog Klasse sich befinden, ansonsten sind sie nutzlos, da sie nicht angesprochen, geladen werden können.

3. Welcome Message

Erstelle eine Begrüßungsnachricht, wenn ein neuer Nutzer Deinen Discord Server betritt.

3.1 Intents anfragen

Intents oder auch Intentionen erlauben es Deinem Bot, spezielle Events mitzubekommen. Du kannst mit
bot = discord.Bot(intents=discord.Intents.all())
direkt alle Intentionen erlauben, bei Deinem Server anzufragen. Alternativ kannst Du auch nur nach bestimmten fragen.

Discord unterscheidet Deine Intentionen und definiert die members, presences und message_content als privilegierte Intentionen. Zum Beispiel, wenn ein Nutzer Deinem Server beitritt oder Nachrichten versendet. Diese müssen in Deinem Developer Portal für Deinen Bot erlaubt werden.

Wenn Dein Bot auf 100 Servern vertreten ist, dann wirst Du Deinen Bot für die privilegierten Intentionen verifizieren müssen, um die entsprechenden Funktionen am Laufen zu halten und auf weiteren Servern eingeladen zu werden.

Damit Du jetzt die entsprechenden Daten erhalten kannst, erlaube zu Beginn alle Privileged Gateway Intents. Wenn Du Deinen Bot weiter ausgebaut hast und diesen produktiv einsetzen möchtest, solltest Du Deine Berechtigungen und Intents überarbeiten.

Discord Bot - aktiviere alle Privileged Gateway Intents
Discord Bot – aktiviere alle Privileged Gateway Intents

3.2 Event Handler hinzufügen

Nachdem Du die privilegierten Intentionen für die Mitglieder gesetzt hast, kannst Du das entsprechende Event erstellen, welches Deinen Bot darüber informiert, wenn ein neuer Nutzer Deinem Server beigetreten ist.

Hierzu wird das on_member_join Event genutzt. Mithilfe des member Objektes, welches der Funktion mitgegeben wird, kann auch dem neuen Mitglied eine private Nachricht zugesendet werden. Zum Beispiel mit einem herzlichen Willkommen, und der Bitte auf dem Channel Rollen oder Regeln aktiv zu werden.

Für die Nutzung innerhalb der so eben neu angelegten welcome-Datei, welche eine Cog Klasse beinhaltet, sieht das dann wie folgt aus:

@commands.Cog.listener()
    async def on_member_join(self, member):
        # send message to selected system channel
        channel = member.guild.system_channel
        if channel is not None:
            await channel.send(f'Welcome {member.mention}.')

Wenn Du die Nachricht nicht in den Systemchannel senden möchtest, sondern in einen von Dir festgelegten Channel. Dann musst Du einmal den Link des Channels kopieren und die Guild als auch die Channel-ID im Integer als Zahl in folgende Funktion einfügen:

@commands.Cog.listener()
    async def on_member_join(self, member):

        # Send message to specific welcome channel
        # copy link from channel
        channel = self.bot.get_guild(int(GUILD)).get_channel(int(CHANNEL_WELCOME))
        if channel is not None:
            await channel.send(f'Welcome {member.mention}.')

Zum Schluss muss noch Dein Cog ein setup bekommen, in dem es dem Bot hinzugefügt wird.

def setup(bot): # this is called by Pycord to setup the cog
    bot.add_cog(Welcome(bot)) # add the cog to the bot

Die Welcome Datei:

# -------------------------------------------------------------------
# created by Frederic Kohl
# 31.03.2023
#
# sources
# https://guide.pycord.dev/popular-topics/cogs (31.03.2023 08:40)
# https://guide.pycord.dev/getting-started/more-features (31.03.2023 11:32)
# https://guide.pycord.dev/Popular-Topics/intents (31.03.2023 11:30)
# https://docs.pycord.dev/en/stable/ext/commands/cogs.html#quick-example (31.03.2023 14:05)
# https://stackoverflow.com/questions/64147556/discord-py-on-member-join-not-working-no-error-message (31.03.2023 14:28)
# https://realpython.com/how-to-make-a-discord-bot-python/#welcoming-new-members (31.03.2023 14:47)
# -------------------------------------------------------------------

from discord.ext import commands


# create a class for our cog that inherits from commands.Cog. This is a module that can be added to the bot
class Welcome(commands.Cog):
    # this is called if the cog is loaded. Set the bot available in the cog with self
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_member_join(self, member):
        # send message to selected system channel
        channel = member.guild.system_channel
        if channel is not None:
            await channel.send(f'Welcome {member.mention}.')




# this is called by Pycord to set up the cog
def setup(bot):
    # add the cog to the bot
    bot.add_cog(Welcome(bot))

4. Bot Cogs laden

Jetzt musst Du Deinen Cog oder Deine Cogs noch in Deiner Main Datei, mit Deinem Bot laden. Das machst Du mit einem bot.load_extension() und der Angabe des Pfades zu der jeweiligen Datei. Beachte, dabei wird aus cogs/welcome.py nur noch cogs.welcome. Der Slash wird mit einem Punkt ersetzt und das .py Deiner Datei entfällt.

bot.load_extension("cogs.welcome")

Die Main Datei sieht wie folgt aus:

# -------------------------------------------------------------------
# created by Frederic Kohl
# 28.03.2023
#
# sources
# https://guide.pycord.dev/getting-started/creating-your-first-bot (28.03.2023 20:40)
# https://guide.pycord.dev/Popular-Topics/intents (31.03.2023 11:30)
# https://stackoverflow.com/questions/64147556/discord-py-on-member-join-not-working-no-error-message (31.03.2023 14:28)
# -------------------------------------------------------------------

import discord
import os
from dotenv import load_dotenv

# load all the variables from the env file
load_dotenv()

# select all intents. Fix this at the end and specify
intents = discord.Intents.all()
intents.members = True

# add the intents to the bot
bot = discord.Bot(intents=intents)

bot.load_extension("cogs.welcome")


@bot.event
async def on_ready():
    print(f"{bot.user} is ready and online!")


@bot.slash_command(name="hello", description="Say hello to the bot")
async def say_hello(ctx):
    await ctx.respond("Hey!")

# run the bot with the token
bot.run(os.getenv('TOKEN'))

5. Willkommens-Nachricht

Wie Du sehen kannst, wurde eine Nachricht im entsprechendem Channel gesendet. Der System-Channel wird in den Servereinstellungen in der Übersicht unter Systembenachrichtigungen eingestellt.

Discord Bot Cogs - Willkommen Nachricht
Discord Bot Cogs – Willkommen Nachricht

6. Private Willkommens-Nachricht senden

Jetzt möchten wir dem neun Nutzer noch eine Willkommens-Nachricht zukommen lassen, welche ihm vielleicht auch weiter Anweisungen gibt.

Füge folgende Zeilen zu Deiner async def on_member_join(self, member): Methode hinzu:

await member.create_dm()
await member.dm_channel.send(f'Hey {member.name}, welcome to my Discord server! Please go to the channel and assign yourself some roles.')

Komplette Datei:

# -------------------------------------------------------------------
# created by Frederic Kohl
# 31.03.2023
#
# sources
# https://guide.pycord.dev/popular-topics/cogs (31.03.2023 08:40)
# https://guide.pycord.dev/getting-started/more-features (31.03.2023 11:32)
# https://guide.pycord.dev/Popular-Topics/intents (31.03.2023 11:30)
# https://docs.pycord.dev/en/stable/ext/commands/cogs.html#quick-example (31.03.2023 14:05)
# https://stackoverflow.com/questions/64147556/discord-py-on-member-join-not-working-no-error-message (31.03.2023 14:28)
# https://realpython.com/how-to-make-a-discord-bot-python/#welcoming-new-members (31.03.2023 14:47)
# -------------------------------------------------------------------

from discord.ext import commands


# create a class for our cog that inherits from commands.Cog. This is a module that can be added to the bot
class Welcome(commands.Cog):
    # this is called if the cog is loaded. Set the bot available in the cog with self
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_member_join(self, member):
        # send message to selected system channel
        channel = member.guild.system_channel
        if channel is not None:
            await channel.send(f'Welcome {member.mention}.')

        # create and send private message to new member
        await member.create_dm()
        await member.dm_channel.send(f'Hey {member.name}, welcome to my Discord server! Please go to the channel and '
                                     f'assign yourself some roles.')


# this is called by Pycord to set up the cog
def setup(bot):
    # add the cog to the bot
    bot.add_cog(Welcome(bot))
Discord Bot Cogs - Private Nachricht
Discord Bot Cogs – Private Nachricht