Hi da der Post schon etwas älter ist und der User nun schon ein paar Monate nicht mehr online war dachte ich mir ich update mal sein Script und beantworte ein paar fragen die dort aufgekommen sind in einem neuen Post.
( da die Zeichenbegrenzung in antworten einfach nicht ausreicht )
ihr richtet euch Node.js und tmi.js ( neuer link da im Original nicht mehr verfügbar ) wie in dem Post beschrieben ein
nun befinden wir uns in der app.js ( schritt 3.3 im Post ) die ihr mithilfe von Notepad++ einrichtet.
( er empfiehlt Atom es spielt aber keine rolle welchen ihr verwendet Hauptsache ein Editor mit dem ihr .JS und .BAT Dateien erstellen könnt )
und nun zu den unterschieden / Verbesserungen
in die app.js schreibt ihr folgendes
const Owner = 'HierDerChannelNameInDemGejointWerdenSoll'; // wir speichern unseren Channel namen in eine Konstante
const Bot = 'HierDerBotChannelName'; // das selbe gilt für den bot
const BotOAuth = 'HierDerOAuthDesBots' // diesen erhaltet ihr auf https://twitchapps.com/tmi/
const Channels = [Owner]; // hier könnten noch mehr channel eingetragen werden wo der bot joinen soll aber es reicht ja unserer! deswegen braucht ihr hier nichts verändern
// *************************************************************
// **** NACH DIESER LINIE BRAUCHT IHR NICHS MEHR ÄNDERN ********
// *************************************************************
var tmi = require('tmi.js');
var options = {
options: {
debug: true
},
connection: {
secure: true,
reconnect: true
},
identity: {
username: Bot,
password: BotOAuth
},
channels: Channels
};
var client = new tmi.client(options);
client.connect();
// wenn der bot zum chat verbindet
client.on('connected', function(adress, port){
console.log("Adresse: " + adress + " Port: " + port); // gibt eine nachricht in der konsole aus damit man sieht das der bot verbunden ist
// ausgabe im chat das man erkennt das der Bot verbunden ist ( könnte auch weg gelassen werden ) *naaa wer versteht die anspielung :p*
client.say(Owner, "Arbeit Arbeit!"); // achtung hier wird angegeben in welchem chat geschrieben wird ... nicht wer schreibt ! ( da gab es einige missverständnisse im original post )
});
Alles anzeigen
was wurde geändert ?
der Channel und Bot Name ( sowie das "passwort" des Bots ) wurden in einer Konstante gespeichert das erleichtert das nachträglich bearbeiten wenn sich mal etwas daran ändert so wie den Zugriff darauf im späteren verlauf der Scripte
warum eine konstante und keine variable ?
diese angaben sollen sich im späteren verlauf nicht mehr ändern konstanten bleiben wie der Name schon sagt konstant und können im Script nicht angepasst werden wenn sie einmal gesetzt wurden.
nun kommen wir zur eigentlichen Funktion eines Bots, das ausführen von Commands.
als erstes erstellt ihr euch in dem Ordner in dem sich die app.js befindet eine Datei namens commands.js und schreibt euch folgendes ans ende eurer app.js
var commands = require('./commands');
// wenn eine nachricht im Chat geschrieben wurde fangen wir diese ab
client.on('chat', function(channel, user, message, _self) {
if(_self) return; // die eigenen bot nachrichten werden ignoriert ( deswegen am besten einen bot Channel )
commands.run(client, channel, user, message, _self); // da wir das ganze in ein extra modul packen ( der übersicht halber ) müssen wir alles wieder übergen + den clienten selbst
});
was wurde geändert ?
wir packen uns der Übersicht halber alle Commands in ein separates Modul so muss die app.js nicht mehr angefasst werden diese ist nun fertig !
jetzt kann unser bot theoretisch arbeiten nur weiß er noch nicht was er machen soll.
in die commands.js packen wir nun folgenden Code ( was er genau macht ist hier erst einmal irrelevant zu den Commands kommen wir gleich )
module.exports = {
run: function(client, channel, user, message, _self) {
// da eine nachricht mehr als nur das command entahlten kann splitten wir uns diese und suchen das command
var msg = message.split(' '), // teilen der nachricht an leerzeichen und speichern diese in ein array ( eine variable weil wir dieses nochmal anpassen müssen )
command = msg[0].toLowerCase(); // das command befindet sich im normalfall an 1 stelle ( also 0 weil array immer bei 0 beginnen ) wir speichern es un in kleinschreibung
msg.shift(); // die restlichen teile sind die argumente ( wenn man z.b. !kill <name> angibt ist <name> ein argument) also entfernen wir den command und haben nur noch die argumente
var args = msg, // nicht unbedingt nötig aber so machen wir uns das übersichtlicher und speichern die argumente und die args variable
// hier kommen 3 variablen die später für commands praktisch sind wenn es für bestimmte user gruppen sein soll :D
isMod = user.mod, // ja wir können abfragen ob der user mod ist oder nicht ;)
isSub = user.subscriber, // jhuhuu er ist sub ... oder doch nicht ? die variable sagt es uns :D
isTurbo = user.turbo, // hat der user Twitch turbo oder nicht ( keine ahnung wofür man das brauchen könnte aber hey nun haben wir es )
userName = user.username; // hier ist der komplette name klein geschrieben
// HIER starten jetzt die commands ! JUHUU ;D
}
}
Alles anzeigen
was wird hier gemacht ?
ich habe es extra auskommentiert ich denke das sollte als Beschreibung reichen
endlich kommen wir zum ersten Command
wir schreiben uns nach dem "// HIER starten jetzt die commands ! JUHUU ;D" folgendes in die commands.js
switch(command) {
// ****************************************************
// Der erste command
// ****************************************************
case '!test' :
client.say(channel, "bestanden"); // ausgabe im chat ( channel reicht als variable da wir ja in verschiedenen channels sitzen können übergeben wir den in dem der command ausgeführt wurde )
break;
// ****************************************************
// Der zweite command
// ****************************************************
case '!test2' :
client.say(channel, "auch bestanden"); // ausgabe im chat ( channel reicht als variable da wir ja in verschiedenen channels sitzen können übergeben wir den in dem der command ausgeführt wurde )
break;
// ****************************************************
// Der dritte und vierte command
// ****************************************************
// sollte man das break; weg lassen werden darunterliegende commands auch ausgeführt ( wofür auch immer man das benötigt aber es geht :D )
case '!test3' :
client.say(channel, "test 3 bestanden");
case '!test4' :
client.say(channel, "test 4 ? oder doch erst 3");
break;
}
Alles anzeigen
was wird hier gemacht / wurde geändert ?
der Orignal Ersteller des Posts hatte hier if abfragen diese sind aber in masse unperformant deswegen ändern wir das nun auf Switches
da wir wissen was das Command ist ( wir erinnern uns an die variable Command ) können wir diese nun abfragen
das switch geht jedes einzelne case durch und "stoppt" dort wo er eine Übereinstimmung findet und führt den darunter liegenden code bis zum break aus
der bot ist so nun eigentlich einsatzbereit aber wir wollen ja mehr
siehe Kommentar eins weiter unten
( Credits gehen natürlich an exxoticx )