Worum geht es eigentlich?
Wer oder was IRC (Internet Relay Chat), ist für alle jüngeren Personen hier wohl eine Unbekannte. Da ich hier nun nicht alles komplett erläutern möchte, sage ich einfach mal IRC ist sowas wie der Uropa von Discord oder Slack. Es ist halt ein älteres jedoch auch extrem stabiles Chatprotokoll, dieses wird auf sog. IRC-Servern betrieben. Und eben diese gibt es noch, und gerade in gewissen Kreisen kommt man nur damit weiter.
Also wollen wir einfach mal einen Basis-Bot entwerfen, und diesmal mit node.js unter Linux.
Vorbereitungen
Für dieses kleine Experiemt wird generell ein beliebiges Linux mit installieren node (npm) benötigt. Generell würde ich die Nutzung von nvm unterstützen, da dies die Verwendung von node unter Linux unheimlich erleichtert.
Fangen wir mal an
Fangen wir einfach mal ganz einfach an. Und zwar erstellen wir eine Javascript Datei (z.B. bot.js) in einem neuen Ordner an. Die Namen von Datei und Ordner ist ohne belang, aber in diesen Beispiel gehen wir von bot.js aus.
touch bot.js
Somit wurde eine Datei (sofern Schreibrechte bestehen) im aktuell Verzeichnis angelegt. Je nachdem welchen Editor verwenden wollt, müsst ihr nun entsprechend die Datei darin öffnen. Oder ihr erledigt es elitär in der Shell. Dies geht relativ einfach mit den Editoren “vi” oder “nano” ich nutze am liebsten diesen, da dieser sogar noch etwas Highlighting beherrscht.
nano bot.js
Natürlich wird dann entsprechend die Datei zum bearbeiten geöffnet. Bevor wir irgendetwas machen können, legen wir eine Konfiguration im Kopf (oben) der Datei an. Einfach copy & paste und die Werte auf euren Testserver anpassen.
// Konfiguration anlegen
var config = {
channels: [
"#channel1",
"#channel2"
],
server: "irc.server.de",
port: 6667,
botName: "IchBinEinBot"
};
Somit hätten wir hier ein Objekt mit allen nötigen Informationen vorbereitet und können an den Aufbau der Verbindung arbeiten.
Jedoch installieren wir zuvor das npm Paket irc. Die dazugehörige Dokumentation könnt ihr hier finden.
Dies wird in eurem Arbeitsverzeichnis (Sofern node.js installiert ist, wir gehen hier von der Nutzung von nvm aus) mittels mit folgenden zwei befehlen bewerkstelligt.
nvm use 16
Die Ausgabe hierzu dürfte relativ simpel ausfallen. Wir nutzen in diesen Beispiel Version 16, das ganze würde wohl auch in Version 18 funktionieren, dies habe ich nun aber nicht getestet.

Da nun npm Einsatzbereit ist wird mit folgender Zeile in der Shell, das benötigte Paket selbst installiert.
npm install irc

Anschließend sollte der Inhalt eures Arbeitsverzeichnisses in etwa wie folgt aussehen.

Nun können wir weiter am Bot selber Arbeiten, wir öffnen wieder unsere bot.js mit dem Editor der Wahl. Und fügen nach dem zuvor angelegten Config-Objekt folgende Zeilen an.
// irc Library laden
var irc = require("irc");
var bot = new irc.Client(config.server, config.botName, {
channels: config.channels,
port: config.port
});
In Zeile 2 wird wie angekündigt die Library geladen, und diese steht uns nun im folgenden Scriptteil zur Verfügung.
In den Zeilen 4 bis 7 wird nun an sich eine Variable mit dem irc Client des npm Paketes erstellt. Der Methode irc.Client() übergeben wir zuerst die Adresse vom Server, gefolgt vom gewünschten Namen. Danach folgt ein Objekt mit den weiteren Angaben wie den Channels (Array) und dem ggf. abweichenden Port des IRC-Servers. Eine vollständige Liste aller möglichen Optionen kann der Dokumentation entlockt werden.
Somit wäre erschreckender weise bereits der Bärenteil erledigt. Sofern dies nun ausgeführt werden würde, würdet ihr beobachten können wie es sich der Bot unter den angegebenen Namen im angegebenen Channel bequem macht. Zugegeben der Bot wäre sehr passiv, aber er ist soweit schon mal existent.
Damit der Bot aber nicht nur im Channel rumgammelt, können wir ihm ja gerne eine Grundfunktion verpassen.
Dies kann mittels sog. Hooks bzw. Listener geschehen. Eine grobe Übersicht findet ihr hierzu auf der Github Page zum Paket.
Gehen wir einfach mal davon aus wir möchten das der Bot jeden “nervt” der in den Channel etwas schreibt. Und alles geschriebene soll in der Shell dargestellt werden. Dies wird mittels der folgenden Zeilen ralisiert.
// Hook in den message-channel
bot.addListener("message", function(from, to, text, message) {
bot.say(from, "Hast du wirklich gerade das (" + text + ") geschrieben?");
console.log("Message from: " + from + ": " + text);
});
In Zeile 2 wird mittels der Methode addListener der Hook angemeldet. Also bei jedem IRC Event vom Typ “message” wird die folgende anonyme Funktion ausgeführt.
In der Zeile 3 sorgt das bot.say() dafür das eine PM an den Benutzer “from” aus den Übergabewerten der anonymen Funktion mit den angegebenen Text gesendet wird.
Und zu am Ende in der Zeile 4 wird nochmal wie in der ursprünglichen Vision gewünscht Verfasser und Text in die Console geloggt. Nun bleibt es nur noch aus den Bot einem Test zu unterziehen.
node bot.js
Die Ausgabe wird zum Anfang erschreckend unspektakulär sein.

Es erscheint sofern niemand anderes etwas schreibt, erst einmal gar nichts. jedoch wird im Clienten schon die Anwesenheit des Bots quittiert. Dies kann wie folgt aussehen.

Wie man sieht werden weitere Informationen (nodebot@ nodeJS IRC client) mitgegeben. Diese lassen sich in der Feinarbeit ebenfalls anpassen. Jedoch ist dies der beweis, dass unser Bot bereits die Arbeit aufgenommen hat. Nun ist natürlich noch die Frage offen ob dieser auch die ihm aufgetragenen Aufgaben erfüllt. Dies wird direkt getestet. Und schreiben als Benutzer eine Message.

Unmittelbar danach habe ich eine PM erhalten, demnach schonmal 1/2 Zielen erreicht. Und schauen wir nun nochmal in die Serverkonsole, sollte dies in etwa so aussehen.

So wie es aussieht, aber wir mit wenigen Zeilen Code bereits einen funktionierenden IRC Bot geschrieben. Natürlich ist dieser in seiner Funktion noch recht beschränkt. jedoch sollte es von hier aus, recht einfach sein weitere Methoden zu implementieren. Also baut mal schön eure Bots, die Basis ist nun vorbereitet.
P.S. Mit node.js lassen sich auch wunderbar Datenbanken anbinden, womit eine deutlich komplexere Applikation durchaus ermöglicht werden kann. Und btw. einen moderneren Bot für z.B. Discord ist nicht wirklich viel komplexer. Bei Interesse können wir das hier auch mal beleuchten.
Fehlt es nur noch hier im Anhang nochmals das ganze Script zu zeigen.
// Konfiguration anlegen
var config = {
channels: [
"#channel1",
"#channel2"
],
server: "irc.server.de",
port: 6667,
botName: "IchBinEinBot"
};
// irc Library laden
var irc = require("irc");
var bot = new irc.Client(config.server, config.botName, {
channels: config.channels,
port: config.port
});
// Hook in den message-channel
bot.addListener("message", function(from, to, text, message) {
bot.say(from, "Hast du wirklich gerade das (" + text + ") geschrieben?");
console.log("Message from: " + from + ": " + text);
});
Das ganze nicht mal mit 25 Zeilen Code, viel Spaß beim bauen eurer Bots.