Wie man einen Discord-Bot mit Node.js erstellt

0 Aktien
0
0
0
0

Einführung

Discord ist eine Chat-App, die es Millionen von Nutzern weltweit ermöglicht, in Communities, sogenannten Gilden oder Servern, Nachrichten und Sprachchats auszutauschen. Discord bietet zudem eine umfangreiche API, mit der Entwickler leistungsstarke Discord-Bots erstellen können. Bots können vielfältige Aktionen ausführen, wie z. B. Nachrichten an Server senden, Nutzern Direktnachrichten schreiben, Server moderieren und Audio in Sprachchats abspielen. Dadurch können Entwickler leistungsstarke Bots mit erweiterten und komplexen Funktionen erstellen, beispielsweise Moderationstools oder Spiele. Der Dyno Tool Bot beispielsweise wird von Millionen von Communities genutzt und bietet nützliche Funktionen wie Spamschutz, einen Musikplayer und weitere hilfreiche Features. Wer lernt, Discord-Bots zu entwickeln, kann eine Vielzahl von Funktionen implementieren, die täglich von Tausenden von Nutzern verwendet werden.

In diesem Tutorial erstellen Sie einen Discord-Bot von Grund auf mit Node.js und der Discord.js-Bibliothek. Diese ermöglicht es Nutzern, direkt mit der Discord-API zu interagieren. Sie richten ein Profil für den Bot ein, beschaffen Authentifizierungstoken und programmieren ihn so, dass er Befehle mit Nutzerargumenten verarbeitet.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie Folgendes:

  • Node.js ist auf Ihrem Entwicklungsrechner installiert.
  • Ein Texteditor Ihrer Wahl, z. B. Visual Studio Code, Atom, Sublime oder Nano.
  • Ein kostenloser Discord-Account mit verifizierter E-Mail-Adresse und ein kostenloser Discord-Server, den Sie zum Testen Ihres Discord-Bots verwenden werden.

Schritt 1 – Den Discord-Bot einrichten

In diesem Schritt verwenden Sie die grafische Benutzeroberfläche (GUI) für Entwickler von Discord, um den Discord-Bot zu starten und das Bot-Token zu erhalten, das Sie dann an Ihre Anwendung übergeben.

Um einen Bot auf der Discord-Plattform zu registrieren, verwenden Sie das Discord-App-Dashboard. Hier können Entwickler Discord-Apps, einschließlich Discord-Bots, erstellen.

Klicken Sie zunächst auf „Neue Anwendung“. Discord fordert Sie auf, einen Namen für Ihre neue Anwendung einzugeben. Klicken Sie anschließend auf „Erstellen“, um die Anwendung zu erstellen.

Hinweis: Der Name Ihrer App ist unabhängig vom Namen des Bots, und der Bot muss nicht den Namen der App tragen.

Öffnen Sie nun Ihr App-Dashboard. Um einen Bot zu Ihrer App hinzuzufügen, gehen Sie in der linken Navigationsleiste auf den Tab „Bot“.

Klicken Sie auf die Schaltfläche „Bot hinzufügen“, um einen Bot zur App hinzuzufügen. Bestätigen Sie die Abfrage mit „Ja, machen!“. Anschließend gelangen Sie zu einem Dashboard mit Details zum Bot-Namen, dem Authentifizierungstoken und Ihrem Profilbild.

Hier im Dashboard können Sie den Namen Ihres Bots oder Ihr Profilbild ändern. Außerdem müssen Sie das Bot-Authentifizierungstoken kopieren. Klicken Sie dazu auf „Token anzeigen“ und kopieren Sie das angezeigte Token.

Warnung: Geben Sie Ihr Bot-Token niemals weiter und laden Sie es nicht hoch, da es jedem ermöglicht, sich in Ihren Bot einzuloggen.

Um den Bot zur Discord-Community hinzuzufügen und ihn zu testen, müssen Sie nun eine Einladung erstellen. Gehen Sie dazu im App-Dashboard unter dem Tab „OAuth2“ auf die Seite „URL-Generator“. Scrollen Sie nach unten und wählen Sie unter „Bereiche“ den Bot aus, um eine Einladung zu erstellen. Sie müssen außerdem Berechtigungen festlegen, um die Aktionen Ihres Bots in den Communities zu steuern. Wählen Sie für dieses Tutorial „Administrator“ aus. Dadurch kann Ihr Bot fast alle Aktionen in der Gilde ausführen. Kopieren Sie den Link mit der Schaltfläche „Kopieren“.

Füge den Bot anschließend dem Server hinzu. Folge dazu dem Einladungslink, den du erstellt hast. Du kannst den Bot zu jedem Server hinzufügen, der dir gehört oder für den du Administratorrechte besitzt (siehe Dropdown-Menü).

Klicken Sie nun auf „Weiter“. Aktivieren Sie das Kontrollkästchen neben „Administrator“, um dem Bot Administratorrechte zu erteilen. Klicken Sie anschließend auf „Autorisieren“. Discord fordert Sie auf, ein CAPTCHA zu lösen, bevor der Bot dem Server beitreten kann. Der Discord-Bot wird nun in der Mitgliederliste des Servers, dem Sie ihn hinzugefügt haben, als offline angezeigt.

Sie haben erfolgreich einen Discord-Bot erstellt und ihn einem Server hinzugefügt. Als Nächstes schreiben Sie ein Programm, um sich beim Bot anzumelden.

Schritt 2 – Erstellen Sie Ihr Projekt

In diesem Schritt richten Sie die anfängliche Codierungsumgebung ein, in der Sie Ihren Bot erstellen und programmatisch in den Bot einsteigen.

Zuerst müssen Sie einen Projektordner und die notwendigen Projektdateien für den Roboter einrichten.

Erstellen Sie Ihren Projektordner:

mkdir discord-bot

Wechseln Sie in den von Ihnen erstellten Projektordner:

cd discord-bot

Erstellen Sie anschließend mit Ihrem Texteditor eine Datei namens config.json, um das Authentifizierungspasswort Ihres Bots zu speichern:

nano config.json

Fügen Sie anschließend den folgenden Code in die Konfigurationsdatei ein und ersetzen Sie den markierten Text durch das Authentifizierungstoken Ihres Bots:

{
"BOT_TOKEN": "YOUR BOT TOKEN"
}

Datei speichern und beenden.

Als Nächstes erstellen Sie eine package.json-Datei, die die Details Ihres Projekts und Informationen zu den verwendeten Abhängigkeiten speichert. Sie erstellen eine package.json-Datei, indem Sie den folgenden npm-Befehl ausführen:

npm init

npm wird Sie nach verschiedenen Details zu Ihrem Projekt fragen.

Nun installieren Sie das Paket discord.js, das Sie für die Interaktion mit der Discord-API benötigen. Sie können discord.js über npm mit folgendem Befehl installieren:

npm install discord.js

Nachdem Sie die Konfigurationsdatei eingerichtet und die erforderlichen Abhängigkeiten installiert haben, können Sie mit der Entwicklung Ihres Bots beginnen. In einer realen Anwendung würde ein großer Bot auf viele Dateien verteilt sein, aber in diesem Tutorial befindet sich Ihr Bot-Code in einer einzigen Datei.

Erstellen Sie zunächst eine Datei namens index.js im Ordner discord-bot für den Code:

nano index.js

Beginnen Sie mit der Programmierung des Bots, indem Sie die discord.js-Abhängigkeit und eine Konfigurationsdatei mit dem Bot-Token einbinden:

const Discord = require("discord.js");
const config = require("./config.json");

Fügen Sie anschließend die nächsten beiden Codezeilen hinzu:

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.login(config.BOT_TOKEN);

Speichern Sie Ihre Datei und beenden Sie das Programm.

Die erste Codezeile erstellt einen neuen Discord-Client und weist ihn dem festen Client zu. Dieser Client dient unter anderem der Interaktion mit der Discord-API und der Benachrichtigung von Discord über Ereignisse wie neue Nachrichten. Der Client repräsentiert den Discord-Bot. Das dem Client-Konstruktor übergebene Objekt legt die Gateway-Intents Ihres Bots fest. Dadurch wird bestimmt, auf welche WebSocket-Ereignisse Ihr Bot reagiert. Hier wurden GUILDS und GUILD_MESSAGES angegeben, damit der Bot Nachrichtenereignisse in den Foren empfangen kann.

Die zweite Codezeile verwendet die clientseitige Anmeldemethode, um sich beim erstellten Discord-Bot anzumelden. Als Passwort dient das Passwort aus der Datei `config.json`. Das Token teilt der Discord-API mit, zu welchem Bot die Anwendung gehört und dass Sie zur Nutzung des Bots berechtigt sind.

Führen Sie nun die Datei index.js mit Node aus:

node index.js

Der Status deines Bots ändert sich auf dem Discord-Server, dem du ihn hinzugefügt hast, zu „online“.

Sie haben erfolgreich eine Entwicklungsumgebung eingerichtet und den grundlegenden Code für die Anmeldung bei Ihrem Discord-Bot erstellt. Als Nächstes werden Sie Benutzerbefehle verarbeiten und Ihren Bot Aktionen wie das Senden von Nachrichten ausführen lassen.

Schritt 3 – Bearbeitung des ersten Befehls des Benutzers

In diesem Schritt erstellen Sie einen Bot, der Benutzerbefehle verarbeiten kann. Sie führen Ihren ersten Ping-Befehl aus, der mit einem “Ping” und der benötigten Zeit zur Beantwortung des Befehls antwortet.

Zunächst müssen Sie die von Nutzern gesendeten Nachrichten erkennen und empfangen, um Befehle verarbeiten zu können. Mithilfe der `on`-Methode im Discord-Client erhalten Sie eine Benachrichtigung über neue Ereignisse. Die `on`-Methode benötigt zwei Argumente: den Namen des Ereignisses, auf das gewartet werden soll, und eine Funktion, die bei jedem Eintreten dieses Ereignisses ausgeführt wird. Mit dieser Methode können Sie auf die Ereignisnachricht warten – dies geschieht jedes Mal, wenn eine Nachricht an ein Forum gesendet wird, für das der Bot die Berechtigung hat, Nachrichten zu lesen. Sie erstellen also eine Funktion, die bei jedem Senden einer Nachricht ausgeführt wird, um Befehle zu verarbeiten.

Öffnen Sie zunächst Ihre Datei:

nano index.js

Fügen Sie folgenden Code in Ihre Datei ein:

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) { 
}); 
client.login(config.BOT_TOKEN);

Diese Funktion, die beim `messageCreate`-Ereignis ausgeführt wird, nimmt die Nachricht als Parameter entgegen. Die Nachricht ist eine Discord.js-Nachrichteninstanz, die Informationen über die gesendete Nachricht und Methoden zur Beantwortung durch den Bot enthält.

Fügen Sie nun die folgende Codezeile zu Ihrer Befehlssteuerungsfunktion hinzu:

...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...

Diese Zeile prüft, ob der Absender der Nachricht ein Bot ist, und bricht gegebenenfalls die Verarbeitung des Befehls ab. Dies ist wichtig, da Bot-Nachrichten im Allgemeinen weder verarbeitet noch beantwortet werden sollten. Bots benötigen üblicherweise keine Informationen von anderen Bots; das Ignorieren ihrer Nachrichten spart daher Rechenleistung und verhindert zufällige Antworten.

Jetzt schreibst du einen Controller-Befehl. Dazu ist es hilfreich, das typische Format eines Discord-Befehls zu kennen. Normalerweise besteht ein Discord-Befehl aus drei Teilen in dieser Reihenfolge: einem Präfix, einem Befehlsnamen und (manchmal) Befehlsargumenten.

  • Präfix: Ein Präfix kann beliebig sein, ist aber üblicherweise ein Satzzeichen oder eine abstrakte Formulierung, die normalerweise nicht am Anfang einer Nachricht steht. Wenn Sie das Präfix am Anfang einer Nachricht eingeben, versteht der Bot, dass dieser Befehl von einem Bot verarbeitet werden soll.
  • Befehlsname: Der Name des Befehls, den der Benutzer verwenden möchte. Dies bedeutet, dass der Bot mehrere Befehle mit unterschiedlichen Funktionen unterstützen kann und es Benutzern ermöglicht, zwischen diesen durch Angabe eines anderen Befehlsnamens zu wählen.
  • Argumente: Falls der Befehl zusätzliche Informationen vom Benutzer benötigt oder verwendet, kann der Benutzer nach dem Befehlsnamen Argumente angeben, wobei die einzelnen Argumente durch ein Leerzeichen getrennt werden.

Hinweis: Es gibt keine vorgeschriebene Befehlsstruktur, und Bots können Befehle nach Belieben verarbeiten. Die hier vorgestellte Struktur ist jedoch praktikabel und wird von der überwiegenden Mehrheit der Bots verwendet.

Um einen Befehlsparser zu erstellen, der dieses Format verarbeiten kann, fügen Sie der Nachrichtenverarbeitungsfunktion die folgenden Codezeilen hinzu:

...
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});
...

Sie fügen die erste Codezeile dem Wert “!” zu dem konstanten Präfix hinzu, das Sie als Roboterpräfix verwenden werden.

Die zweite Codezeile, die Sie hinzufügen, prüft, ob der Inhalt der Nachricht, die der Bot verarbeitet, mit dem von Ihnen festgelegten Präfix beginnt. Falls dies nicht der Fall ist, wird die Verarbeitung der Nachricht abgebrochen.

Nun müssen Sie den Rest der Nachricht in den Befehlsnamen und alle in der Nachricht enthaltenen Argumente umwandeln. Fügen Sie die folgenden hervorgehobenen Zeilen hinzu:

...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
});
...

Die erste Zeile hier dient dazu, das Präfix aus dem Nachrichteninhalt zu entfernen und das Ergebnis dem konstanten Befehlskörper zuzuweisen. Dies ist notwendig, da das Präfix nicht im analysierten Befehlsnamen enthalten sein soll.

Die zweite Zeile nimmt die Nachricht ohne Präfix und wendet die `split`-Methode mit Leerzeichen als Trennzeichen an. Dadurch wird die Nachricht in ein Array von Teilstrings aufgeteilt, wobei an jeder Stelle mit einem Leerzeichen eine Teilung erfolgt. Das Ergebnis ist ein Array, das den Befehlsnamen und gegebenenfalls die Argumente enthält. Dieses Array wird der Konstanten `args` zugewiesen.

Die dritte Zeile entfernt das erste Element aus dem `args`-Array (den Namen des angegebenen Befehls), wandelt es in Kleinbuchstaben um und weist es der Konstanten `command` zu. Dadurch wird der Befehlsname isoliert und nur die Argumente verbleiben im Array. Die `toLowerCase`-Methode wird verwendet, da Befehle in Discord-Bots üblicherweise nicht zwischen Groß- und Kleinschreibung unterscheiden.

Sie haben die Erstellung eines Befehlsparsers abgeschlossen, ein erforderliches Präfix implementiert und den Befehlsnamen sowie alle Argumente aus den Nachrichten abgerufen. Nun implementieren und generieren Sie den Code für spezifische Befehle.

Fügen Sie folgenden Code hinzu, um den Ping-Befehl zu starten:

...
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {

} 
});
...

Diese if-Anweisung prüft, ob der analysierte Befehlsname (der der Konstanten “command” zugewiesen wurde) mit “ping” übereinstimmt. Ist dies der Fall, möchte der Benutzer den Befehl „ping“ ausführen. Der spezifische Befehlscode wird in den if-Anweisungsblock eingefügt. Dieses Muster wird für alle weiteren auszuführenden Befehle wiederholt.

Jetzt können Sie den Befehlscode “ping” implementieren:

...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
...

Speichern Sie Ihre Datei und beenden Sie das Programm.

Sie fügen einen “Ping”-Befehlsblock hinzu, der die Differenz in Millisekunden zwischen der aktuellen Zeit – ermittelt mit der neuen Methode des Date-Objekts – und dem Zeitstempel der erstellten Nachricht berechnet. Diese Berechnung ermittelt die Zeit, die für die Verarbeitung der Nachricht und das Senden des “Pings” an den Bot benötigt wurde.

Die zweite Zeile beantwortet den Benutzerbefehl mithilfe der `reply`-Methode der Nachrichtenkonstante. Die `reply`-Methode sendet einen Ping an den Benutzer, der den Befehl aufgerufen hat (wodurch dieser benachrichtigt und die Nachricht für den angegebenen Benutzer hervorgehoben wird), gefolgt vom Inhalt, der als erstes Argument der Methode übergeben wurde. Sie geben ein Literalmuster an, das eine Nachricht und den berechneten Ping als Antwort enthält, die die `reply`-Methode verwenden soll.

Damit ist die Ausführung des Befehls “ping” beendet.

Starten Sie Ihren Bot mit folgendem Befehl (im selben Ordner wie index.js):

node index.js

Sie können nun den Befehl “!ping” auf jedem Kanal verwenden, den der Bot sehen und an den er Nachrichten senden kann, und erhalten daraufhin eine Antwort.

Sie haben erfolgreich einen Bot erstellt, der Benutzerbefehle verarbeiten kann, und Ihren ersten Befehl ausgeführt. Als Nächstes entwickeln Sie Ihren Bot weiter, indem Sie den Befehl „sum“ ausführen.

Schritt 4 – Den Befehl „Summe“ ausführen

Nun erweitern Sie Ihr Programm, indem Sie den Befehl “!sum” ausführen. Dieser Befehl nimmt beliebig viele Argumente entgegen, addiert sie und gibt die Summe aller Argumente an den Benutzer zurück.

Falls Ihr Discord-Bot noch läuft, können Sie den Prozess mit STRG + C beenden.

Öffnen Sie Ihre index.js-Datei erneut:

nano index.js

Sie verwenden einen else-if-Block, um die Ausführung des Befehls “!sum” zu starten. Nach der Überprüfung des Befehlsnamens “ping” wird geprüft, ob der Befehlsname “sum” entspricht. Der else-if-Block ist erforderlich, da immer nur ein Befehl gleichzeitig verarbeitet wird. Wenn das Programm also den Befehlsnamen “ping” findet, muss es den Befehl „sum“ nicht überprüfen. Fügen Sie die folgenden markierten Zeilen in Ihre Datei ein:

...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {

} 
});
...

Sie können nun den Code der “sum”-Anweisung ausführen. Der Code der “sum”-Anweisung gehört in den soeben erstellten else-if-Block. Fügen Sie nun folgenden Code hinzu:

...
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
...

Sie verwenden die `map`-Methode der Argumentliste, um mithilfe der Funktion `parseFloat` für jedes Element des `args`-Arrays eine neue Liste zu erstellen. Dadurch entsteht ein neues Array (der Konstanten `numArgs` zugewiesen), dessen Elemente ausschließlich Zahlen anstelle von Zeichenketten sind. Dies ermöglicht es Ihnen, später die Summe der Zahlen durch Addition zu berechnen.

In der zweiten Zeile wird die `reduce`-Methode der Konstanten `numArgs` aufgerufen. Diese Methode stellt eine Funktion bereit, die alle Elemente der Liste summiert. Die Summe aller Elemente in `numArgs` wird der Konstanten `sum` zugewiesen.

Anschließend verwenden Sie die Antwortmethode des Nachrichtenobjekts, um auf den Befehl des Benutzers mit einem tatsächlichen Muster zu antworten, das die Summe aller Argumente enthält, die der Benutzer an den Bot sendet.

Damit ist die Ausführung des Befehls “sum” beendet. Starten Sie nun den Bot mit folgendem Befehl (im selben index.js-Ordner):

node index.js

Sie können nun den Befehl “!sum” in jedem Kanal verwenden, den der Bot sehen und an den er Nachrichten senden kann.

Nachfolgend finden Sie die vollständige Version des index.js-Bot-Skripts:

const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
});
client.login(config.BOT_TOKEN);

An diesem Punkt haben Sie Ihren Discord-Bot durch Ausführen des Befehls „sum“ entwickelt.

Ergebnis

Sie haben erfolgreich einen Discord-Bot implementiert, der verschiedene Benutzerbefehle und Befehlsargumente verarbeiten kann. Um Ihren Bot zu erweitern, können Sie weitere Befehle ausführen oder andere Teile der Discord-API ausprobieren, um einen leistungsfähigeren Discord-Bot zu entwickeln.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte Ihnen auch gefallen