Im Chat reagiert unser Bot James immer dann, wenn jemand öffentlich seinen Namen erwähnt. Ausserdem reagiert er, wenn der Verfasser der Nachricht alleine mit ihm im Channel ist.
In diesem Tutorial erkläre ich, wie man so etwas mit seiner eigenen User App machen kann.
Wenn man mit dem Bot schreibt und er reagiert, dann sieht das beispielsweise so aus:
Damit der Bot im richtigen Moment antworten kann, müssen wir zuerst mitbekommen, wenn eine öffentliche Nachricht geschrieben wird. Hierzu gibt es das Event onPublicMessage. Als Parameter erhält das Event ein PublicMessage-Objekt, mit dem man herausfinden kann, wer die Nachricht geschrieben hat und was drin stand.
var App = (new function(){ this.onPublicMessage = function(publicMessage) { var botUser = KnuddelsServer.getDefaultBotUser(); var author = publicMessage.getAuthor(); var text = publicMessage.getText(); var message = author + ' hat geschrieben: ' + text; botUser.sendPublicMessage(message); }; }());
Bei jeder öffentlichen Nachricht reagiert der Bot nun mit der Antwort „NICK hat geschrieben: TEXT VON NICK“. Dies ist natürlich nicht ganz das, was wir uns vorgestellt haben.
Der Bot soll natürlich nur angeschrieben werden, wenn der Nutzer alleine im Channel ist, oder sein Name erwähnt wird:
var App = (new function(){ this.onPublicMessage = function(publicMessage) { var botUser = KnuddelsServer.getDefaultBotUser(); var author = publicMessage.getAuthor(); var text = publicMessage.getText(); if (shouldBotReact(text)) { var message = author + ' hat geschrieben: ' + text; botUser.sendPublicMessage(message); } }; function shouldBotReact(text) { var botUser = KnuddelsServer.getDefaultBotUser(); var channel = KnuddelsServer.getChannel(); // Lädt alle Nutzer, die im Channel und echte Menschen sind var humanOnlineUsers = channel.getOnlineUsers(UserType.Human); if (humanOnlineUsers.length == 1) { return true; } else if (text.contains(botUser.getNick())) { return true; } else { return false; } } }());
Nun reagiert der Bot, wie gewünscht immer dann, wenn nur 1 Nutzer im Channel ist oder der Name vom Bot erwähnt wurde. Die Antwort des Bots ist aber immer noch nicht spannend. Dies wollen wir nun ändern, indem wir den geschriebenen Text genau anschauen. Dies könnte mit dieser Funktion gehen:
function computeBotReaction(text, author) { if (text.contains('Huhu')) { return 'Hallo ' + author.getNick(); } else { return 'Trari Trara, das Kasperle ist wieder da.'; } }
Ein Problem daran ist, dass der Bot jetzt nur reagiert, wenn ich das Wort ‚Huhu‘ genau so schreibe. Wenn ich nun ‚huhu‘ (klein) oder ‚hUhU‘ (wirr) schreiben würde, dann reagiert der Bot mit diesem Code nicht, weil genau geprüft wird, ob der Text identisch ist. Um dies zu ändern, können wir alle Zeichen im Text in kleine Buchstaben verwandeln, um so besser vergleichen zu können:
function computeBotReaction(text, author) { var lowerText = text.toLowerCase(); if (lowerText.contains('huhu')) { return 'Hallo ' + author.getNick(); } else { return 'Trari Trara, das Kasperle ist wieder da.'; } }
Wenn wir dies nun in die App einbauen, dann wird der Bot korrekterweise bei jedem Huhu reagieren.
var App = (new function(){ this.onPublicMessage = function(publicMessage) { var botUser = KnuddelsServer.getDefaultBotUser(); var author = publicMessage.getAuthor(); var text = publicMessage.getText(); if (shouldBotReact(text)) { var message = computeBotReaction(text, author); botUser.sendPublicMessage(message); } }; function shouldBotReact(text) { var botUser = KnuddelsServer.getDefaultBotUser(); var channel = KnuddelsServer.getChannel(); var lowerText = text.toLowerCase(); var lowerBotNick = botUser.getNick(); // Lädt alle Nutzer, die im Channel und echte Menschen sind var humanOnlineUsers = channel.getOnlineUsers(UserType.Human); if (humanOnlineUsers.length == 1) { return true; } else if (lowerText.contains(lowerBotNick)) { return true; } else { return false; } } function computeBotReaction(text, author) { var lowerText = text.toLowerCase(); if (lowerText.contains('huhu')) { return 'Hallo ' + author.getNick(); } else { return 'Trari Trara, das Kasperle ist wieder da.'; } } }());
Fertig! Nun reagiert der Bot sogar auch, wenn man sich beim Schreiben des Nicks in der Groß-/Kleinschreibung vertippt.
Um weitere Texte einzufügen, muss nun nur noch an der Methode computeBotReaction geschraubt werden. Und um so mehr du deinem Bot beibringst, um so mehr Spaß werden du und die Nutzer deines Channels damit haben.
Hallo Liebe Entwickler,
Euer Bott soll mehrere Antworten liefern?
Dann habe ich genau das Richtige für euch.
var App = (new function(){
this.onPublicMessage = function(publicMessage)
{
var botUser = KnuddelsServer.getDefaultBotUser();
var author = publicMessage.getAuthor();
var text = publicMessage.getText();
if (shouldBotReact(text))
{
var message = computeBotReaction(text, author);
botUser.sendPublicMessage(message);
}
};
function shouldBotReact(text)
{
var botUser = KnuddelsServer.getDefaultBotUser();
var channel = KnuddelsServer.getChannel();
var lowerText = text.toLowerCase();
var lowerBotNick = botUser.getNick();
// Lädt alle Nutzer, die im Channel und echte Menschen sind
var humanOnlineUsers = channel.getOnlineUsers(UserType.Human);
if (humanOnlineUsers.length == 1)
{
return true;
}
else if (lowerText.contains(lowerBotNick))
{
return true;
}
else
{
return false;
}
}
function computeBotReaction(text, author)
{
var lowerText = text.toLowerCase();
if (lowerText.contains(‚huhu‘))
{
return ‚Hallo ‚ + author.getNick();
}
else
{
var element = [ ‚foo‘, ‚bar‘, ‚moo‘, ‚car‘, ’shoe‘ ];
return RandomOperations.getRandomObject(element);
}
}
}());
Und schon liefert euer bot mehrfache Antworten =).
Mit freundlichen Grüßen, Fabian@weimar11.
Ps, werde weiter an dem Script basteln und ggf. veröffentlichen =)
LikeLike