Einleitung

Für die nutzerfreundliche Verwendung von unserer smarten Mülltonne wurde ein simpler Discord-Bot entworfen. Der Benutzer des Produkts kann somit ohne viel Aufwand stets die Fülle der Mülltonne abfragen. Da Discord einsteigerfreundlich, kostenlos und über eine angenehme Benutzeroberfläche verfügt, wurde Discord für dieses Projekt gewählt. Im Folgenden werden die Klassen, Softwarearchitektur und Schnittstellen beschrieben.

1) Grundgerüst

Abbildung 1 – Grundgerüst des Discord-Bots

Das Grundgerüst des Discord-Bots besteht aus den Klassen Main, Bot, CommandListener und der importierten abstrakten Klassen ListenerAdapter des JDA-Frameworks.

1.1) Main

Dies ist die Hauptklasse von dem Programm, indem der Bot, der ChatCommandManager und die Objekte zur Verbindung zur Mqtt-Schnittstelle erstellt werden.

1.2) Bot

In dieser Klasse wird der Bot erstellt. Insbesondere sind in dieser Klassen der Command-Prefix mit dem man den Bot ansteuern kann und der Login-Token.

1.3) CommandListener

Der CommandListener implementiert die Methoden der importierten, abstrakten Klasse ListenerAdapter des JDA-Frameworks. In der Methode onMessageReceived() fängt er Nachrichten aus dem Chat ab und prüft, ob sie von einem Menschen geschrieben worden sind. Falls dies der Fall ist und der richtige Prefix verwendet wurde, wird die statische Methode performChatCommand() vom ChatCommandManager aufgerufen.

2) ChatCommandManager und Chat Commands

Abbildung 2 – Chat Commands

2.1) ChatCommandManager

Die performChatCommand() Methode des ChatCommandManager ruft die gleichnamige abstrakte Methode der Klasse GenericChatCommand auf, welche jedes Command dann gezwungenermaßen implementieren muss. Weiterhin werden im Konstruktor des ChatCommandManager die einzelnen Commands zugewiesen, welche in einer statischen HashMap gespeichert werden. Diese beiden Punkte sorgen dafür, dass der Discord-Bot sehr leicht um weitere Commands erweiterbar ist.

2.2) GenericChatCommand

GenericChatCommand ist eine abstrakte Klasse und wird als Oberklasse für die späteren Chat-Commands fungieren. Sie enthält die abstrakte Methode performChatCommand(), mit der die Chat-Commands implementiert werden. Es wird also insgesamt eine Nachricht vom CommandListener abgefangen und dem ChatCommandManager übergeben, welcher dann im Anschluss die performChatCommand() des richtigen Chat-Commands aufruft.

2.3) FuellstandCommand

Hier wird auf die in MqttCallback erstellte Liste der Füllstände zugegriffen und der aktuelle Füllstand ausgegeben. Damit nicht nur Text ausgegeben wird, wird ein Discord-Embed benutzt.

2.4) NodeWebCommand

Der NodeWebCommand sendet einen Link zu der Node-Web Seite. Diese Seite beinhaltet einen Übersichtsgraphen mit einer Wertetabelle.

2.5) HelpCommand

Wenn das HelpCommand aufgerufen wird, dann werden die Chat-Commands in alphabetischer Reihenfolge in einem Discord-Embed ausgegeben. Dies wird durch Sortieren mit einem SortedSet, dem StringBuilder und den Methoden commandsByName() und descriptionByName() umgesetzt.

3) Mqtt-Schnittstellen

Abbildung 3 – Mqtt-Schnittstellen

Hier wird unsere Schnittstelle zum Mqtt-Broker implementiert. Dafür wurde das Interface PahoMqttCallback des Paho-Frameworks von unserer Klasse MqttCallback implementiert. In MqttCallback wird die Liste der Füllstände initialisiert und es werden Datenwerte als String eingefügt, falls eine Nachricht eingegangen ist. In MqttListener wird die Verbindung zum Mqtt-Broker mit den Attributen der Klasse hergestellt und es wird das richtige Topic (tonne/abstand) abonniert.

No Responses

Leave a Reply

Your email address will not be published. Required fields are marked *