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.
Inhaltsverzeichnis
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.
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.
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.
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))
Quellen:
- https://guide.pycord.dev/popular-topics/cogs (31.03.2023 09:12)
- 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://github.com/TeamMai/Mai/blob/dev/cogs/Invites/Invites.py (31.03.2023 12:52)
Titelbild von Discord