Wenn eine Sache durchgezogen wird, die mich in meiner Existenz, in
meinem Wohlbefinden, in meiner Sicherheit bedroht, ist mir egal, ob
da irgendwelche Leute sagen: Das ist aber Recht.
- Thomas Ebermann
Bei BettyBot handelt es sich um einen von mir geschriebenen C++ Bot.
Dieser laeuft bisher ausschliesslich unter GNU/Linux. Ich hatte vor einen TCP
Client zu schreiben und habe aus diesen dann einen IRC-Client geschrieben.
Nachdem ich dies erledigt hatte, kam mir der Gedanke doch mal einen Bot zu coden.
Trotz diverser "Vorschlaege" doch einfach eggdrop oder einen anderen schon
fertigen Bot zu nehmen (manche Leute wissen wohl nicht wie es ist, einfach
mal Lust zu haben, etwas eigenes zu kreieren), habe ich dann angefangen.
Erstmal natuerlich ein Grundkonzept ueberlegt und dann die allgemeinen Dinge
angefangen wie ping Beantwortung, onlinepruefung... Ich bitte zu beachten,
dass dies mein erstes groesseres C++ Projekt ist und ich bis dahin noch
nie ein C++ Tutorial durchgearbeitet habe. Das Grundwissen des programmierens
hab ich aus anderen Programmiersprachen und das was ich fuer C++ wissen musste
oder den TCP Client, habe ich kurzerhand nachgelesen. Da ich ein grosser Fan
von Open-Source bin, gibt es hier natuerlich den Source zum Downloaden.
BettyBot ist in zwei Hauptteile aufgeteilt. Einmal main, dass ist das
Hauptprogramm, und einmal der botservice thread. Im Hauptprogramm befindet
sich direkt eine endlos while-Schleife, die zuerst die Verbindung zum IRC-Server
aufbaut. Wenn diese aufgebaut wurde, wird der botservice thread gestartet, der
die empfangenden Nachrichten verarbeitet. Der main Part startet derweilen die
onlinepruefung, denn der Bot muss im Falle einer Trennung sich neu verbinden.
Im Falle eines errors im botservice thread, wird die Verbindung zum Server
getrennt und eine neue Verbindung aufgebaut. Damit der Bot weiss, ob er noch
verbunden ist, existiert eine globale Variable, die zur Kommunikation zwischen
botservice thread und main da ist. Dies funktioniert so: main prueft ob die
globale Variable true ist. Sollte dies der Fall sein, wird diese auf false gesetzt
und der IRC-Server angepingt. Sollte sie bei der Pruefung schon false sein, wird
der botservice thread gecancelt und neuverbunden. Nachdem der IRC-Server
angepingt worden ist, wird im botservice thread ein PONG vom IRC-Server
empfangen. Sollte dieses PONG empfangen worden sein, wird die globale Variable
auf true gesetzt. Dies geschieht immer abwechselnd in einem bestimmten
Zeitintervall. Je kuerzer man dieses Zeitintervall setzt, desto schneller merkt
der Bot, dass die Verbindung getrennt worden ist, allerdings ist es dann auch
rechenintensiver. Setzt man das Zeitintervall hoeher, so dauert es laenger bis der
Bot merkt, dass die Verbindung getrennt worden ist, allerdings ist dies auch nicht
mehr so rechenintensiv. Die anfaengliche endlos while-Schleife ist fuer die
Neuverbindungen da.
Da dieses Grundkonzept schriftlich schwer zu verstehen ist, habe ich eine kleine
Zeichnung angefertigt. (Mit klick auf das Bild wird ein groesseres geladen)
(auf das Bild klicken fuer Vergroesserung)
Der Bot im botservice thread eine function, die die empfangenden Nachrichten
an die einzelnen Service functions weitergibt. Jeder Service ist in einer
einzelnen function, damit man den Bot beim neu compilen mit den gewuenschten
Services austatten kann. Jeder der sich den Quelltext anschaut, kann also nach
belieben die unerwuenschten Services dort auskommentieren. Desweiteren sind
Dinge wie Username, Passwort, Channels, ... in globalen Variablen, die
jeder der den Bot auf seine beduerfnisse anpassen moechte, veraendern kann.
Der Quelltext ist ausfuehrlich und meiner Meinung nach gut kommentiert.
Da ich waehrend des Projekts diverse male den Editor geaendert habe,
kann es passieren das Umlaute in den Kommentaren nicht richtig angezeigt
werden. Da aber jeder ein wenig Verstand besitzen sollte duerfte dies kein
Problem dastellen. Der Quelltext ist in verschiedenen Stadien erhaeltlich.
Jedes Stadium ist mit Datum gekennzeichnet. Da ich diese Dokumentation viel
spaeter geschrieben habe als den Bot, kann es sein, dass ich manche
Veraenderungen uebersehen habe. Ich bitte hier um verstaendnis.
Dies ist die aelteste Version die ich noch besitze. Sie hat noch keine User-bezogenen Services. Sie liest die Nicknames
der User im Channel aus und schreibt diese in eine Textdatei. Desweiteren erkennt sie, ob beim Anmelden der
Nickname des Bots in Benutzung ist und killt diesen mittels GHOST Befehl (Dies funktioniert nur mit einem
regestrierten Namen).
Diese Version besitzt nun den Service !google. Dieser sucht bei google einen Begriff und gibt
den ersten Treffer als Link im Channel aus. Ausserdem rejoint der Bot nun nach jedem kick aus
dem Channel.
Diese Version hat eine Verbesserung im google Service. Desweiteren begruesst nun der Bot jeden
joinenden User mit einem NOTICE. Der Text mit dem der Bot den User begruesst ist natuerlich frei waehlbar.
Zudem ist eine log function hinzugefuegt worden, so dass der Bot seine aktivitaeten genau festhaelt.
Ab nun speichert der Bot die Useranzahlrekorde im Channel. Da noch keine Datenbank Anbindung fertig ist
wird leider bei jedem Bot neustart von 0 begonnen. Dies kann der User mit !peak abrufen. Mit !help kann der User ab
nun eine Hilfestellung mit den userbezogenen Services vom Bot bekommen.
In dieser Version ist der gesamte Source einmal ueberarbeitet. Die Comments sind ausfuehrlicher, der Bot besteht nicht nur noch aus einer einzigen Quelldatei,
er ist Ressourcenschonender durch ein paar Neuanordnungen, er besitzt einen Loglevel.
Auf die Anfragen wie man BettyBot nutzt, wenn man "nur" den Source besitzt,
stelle ich hier mal eine Anleitung online. Ich gehe davon aus das ihr g++
besitzt und nicht ungeuebt mit dem Umgang der Konsole. Wenn ihr nun in dem
Ordner seid, indem der Source von BettyBot liegt, gebt ihr in die Konsole
g++ bettybot.cpp.06.07.06 -o bettybot -lpthread
ein. "bettybot.cpp.06.07.06" ist der Name der zu compilenden Datei (sprich der
Source). "-o bettybot" ist der Name der binary die von g++ erstellt wird und
"-lpthread" muss als Parameter bei g++ angegeben werden, da BettyBot mit
threads arbeitet.