[HowTo] Wie erstelle ich meinen EIGENEN Twitch Bot ( Updated )

  • 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



    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


    JavaScript
    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 )



    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



    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 Comma
    nd 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 :D
    siehe Kommentar eins weiter unten



    ( Credits gehen natürlich an exxoticx )

  • so wie funktioniert das nun mit den Cooldowns ?
    ich erkläre euch hier die einzelne schritte poste aber am Schluss das komplette Script ohne Kommentare ( sollte zu dem Zeitpunkt alles bekannt sein ;) )


    als erstes müssen wir uns ein paar neue variablen in der commands.js erstellen
    diese packen wir ganz nach oben noch vor dem " module.exports = { " damit diese nicht immer beim Aufruf Resettet werden


    ( ich behandel hier Global-/ Command-/ und User -cooldowns gleichzeitig ihr könnt einzelne natürlich auch weg lassen )

    was wird hier gemacht / wurde geändert ?
    wir haben uns die einzelnen Cooldowns in variablen gespeichert und schon einmal dafür gesorgt das wir die letzte Ausführung eines Commands abspeichern können


    was wir nun aber noch nicht kennen ist der aktuelle Zeitpunkt wann ein Command ausgeführt wurde hierzu erstellen wir uns folgende variable und fragen die zeit ab.
    ( des weiteren erstelle ich hier schon einmal eine variable botMessage diese wird aber erst später relevant )


    beides muss nach " module.exports = { " erfolgen ( packt sie euch am besten nach " // HIER starten jetzt die commands ! JUHUU ;D " )


    JavaScript
    var curentTimestamp = Math.floor(Date.now() / 1000), // der aktuelle timestamp in sekunden
        botMessage      = false; // die nachricht die der bot senden soll ... muss später gesetz werden ( standart auf false lassen damit der bot weil es gibt nichts zu senden )

    was wird hier gemacht / wurde geändert ?
    da gibt es nicht viel zu sagen :D mit dem curentTimestamp fragen wir die aktuelle zeit in Sekunden ab und die botMessage ist das was später vom bot geschrieben wird ( hier auf false weil wir noch keine nachricht senden )


    die Vorbereitung ist geschafft nun können wir die einzelnen cooldowns abfragen und Aktionen ausführen wenn diese abgelaufen sind
    wir fangen an und bauen uns nur den Globalen cooldown ein ( dies ist super als Spam Protektion und sollte mindestens drin sein :D )


    was wird hier gemacht / wurde geändert ?
    wie ihr seht senden wir die nachricht nicht mehr direkt sondern packen sie uns in eine variable und senden sie erst am Schluss das hat den vorteil das wir Code sparen da wir nicht immer den cooldown neu setzen müssen wenn ein Command ausgeführt wurde sondern nur ein mal. des weiteren fragen wir nun ab ob die letzte Ausführung + die cooldown zeit kleiner als die aktuell zeit ist und wenn ja führt der bot den Command aus.


    nun bauen wir uns nur den Command cooldown ein ist vom Prinzip her nichts anders nur müssen wir wieder beachten das wir variablen vordefinieren wenn sie nicht existieren ( und das kann nervig werden :p )

    was wird hier gemacht / wurde geändert ?
    im grunde ist es ähnlich wie der globale colldown -> prüfe Cooldown und wenn abgelaufen führe command aus nur das wir uns die cooldowns für jeden command einzeln in ein array schreiben
    das "lastRun['commands'][command] = (lastRun['commands'][command] != undefined) ? lastRun['commands'][command] : 0;" ist nur eine Kurzschreibweise einer if else abfrage.


    so nun kommen wir zum User cooldown dieser funktioniert wie der Command cooldown nur das wir uns eben für jeden User jeden Command abspeichern.


    was wird hier gemacht / wurde geändert ?
    ab hier sollte es euch eigentlich schon verständlich genug sein :D und wenn nicht helfen die Kommentare im Code :p


    das war es dann auch mir den cooldowns hier nun die komplette commands.js ( ohne kommentare ) mit allen drei cooldown arten in kombination
    commands.zip


    hey da sind aber noch ungenutzte variablen !!
    ja ;) super aufgepasst wir haben weiter oben den mod / subscriber status usw abgefragt aber nie genutzt
    wenn ihr z.b. wollt das eure mods den User cooldown umgehen können ändert ihr einfach folgende zeile

    was wird hier gemacht / wurde geändert ?
    hier wurde nur "|| isMod" hinzugefügt die zwei | bedeuten so viel wie oder und die variable isMod haben wir weiter oben diese wird uns von Twitch in der user variable übergeben und ist entweder true oder false also salopp gesagt ja oder nein :D


    das cooldown thema ist somit durch weiter geht es mit zufälligen texten und Argument Übergabe.
    siehe Kommentar eins weiter

  • wir machen weiter mit der Ausgabe von zufälligen texten.


    an dieser stelle möchte ich Credits an TheOWord geben er hatte im original post schon den richten Ansatz nur einen kleinen Denkfehler


    wenn man die variable außerhalb des Commands definiert wird diese auch nur einmal erstellt und bleibt auch so.
    erstellt man diese im command wird sie jedesmal wenn sie aufgerufen wird neu erstellt und somit immer ein anderer zufälliger text ausgegeben


    was wird hier gemacht / wurde geändert ?
    wir speichern uns alle Ausgabemöglichkeiten in das Array randomStrings und holen uns mit der mathematischen Funktion random einen zufälligen wert zwischen 0 und 1 ( aber niemals 1 z.b. 0.44723722869536964 ) das ganze multiplizieren wir mit der länge des Arrays ( die anzahl der Einträge ) und runden mit der mathematischen Funktion floor das ganze immer ab. so hat man eine zufällige zahl zwischen 0 und 2 ( zumindest im bespiel )


    mehr gibt es dazu eigentlich auch nicht zu zeigen also kommen wir nun zu den Argumenten


    was sind Argumenten und wie benutze ich diese ?
    Ein Argument bezeichnet einen Übergabewert, welcher bei einem Funktionsaufruf angegeben wird die Commands die wir aufrufen sind im Grunde genommen Funktionsaufrufe und dort können wir Argumente übergeben
    ( wir erinnern uns an unsere variable args die wir uns bereits erstellt haben)


    wir nehmen als beispiel ein !kill Command da können wir auch gleich die zufälligen texte einbauen und ich kann euch zeigen wie man Platzhalter texte ersetzt.

    was wird hier gemacht / wurde geändert ?
    ich denke die Auskommentierung dürfte hier ausreichen aber im Grunde lesen wir das übergebene Argument aus ( je nach anzahl der Argumente müsst ihr hier die richtige Position angeben beginnend mit 0 )
    z.b !command <argument1> <argument2> <argument3> usw


    so könnt ihr euch unter anderem für bestimmte Command Settings einstellen ( Achtung die werden noch nirgends gespeichert also bei jedem neustart des Bots sind diese weg ( vielleicht mach ich dazu auch noch ein tut :p ) )




    so das war es ( zumindest bis jetzt ) mit dem Tutorial
    ich hoffe es hilft euch weiter und vielen dank fürs lesen :D für fragen stehe ich gern zur Verfügung


    MFG


    hier die aktuelle commands.js und app.js zum download ( ohne Kommentare )
    die Scripte sind getestet und sollten so ohne Probleme laufen


  • Alias Handling dazu wäre noch sehr nice.


    Ich habe dein bisheriges Tutorial etwas abgeändert:


    Bisher nutze ich Alias und Alert noch nicht (testing)



    ich möchte ungerne die Befehle "erneut" verwenden sondern wirklich von !dc auf !discord verweisen (!yt auf !youtube).
    Hast du dazu selbst eine Idee?




    Edit:
    Damn ... irgendwie läuft mein Script JETZT nicht mehr. Entweder meckert es mich das das eine Variable bereits vergeben wurde (const) oder ich werde regelrecht zugespamt mit der MSG "Befehl hat noch CD".
    Ich bin kein JS Crack und habe alles bisher immer mit der SuMa Suche erledigt was ich haben wollte .. aber aktuell stehe ich voll auf dem Schlauch :(

    Die Twitch Fee mag dich nicht ist das equivalent zu 42

    4 Mal editiert, zuletzt von Skeeve ()

  • ich möchte ungerne die Befehle "erneut" verwenden sondern wirklich von !dc auf !discord verweisen (!yt auf !youtube).
    Hast du dazu selbst eine Idee?

    du meinst ein Alias ?
    das ist kein Problem einfach bei den switches beides angeben ... beispiel:


    JavaScript
    case '!dc':
    case '!discord':
        bot_msg = sendMessage(
            command, currentTimestamp, 5, 120, username,
            'Discord: https://skeeve-live.de/discord', isMod
        );
    break;

    so wird der code bei beidem ausgeführt da der Break das ganze erst "beendet"



    Edit:
    Damn ... irgendwie läuft mein Script JETZT nicht mehr. Entweder meckert es mich das das eine Variable bereits vergeben wurde (const) oder ich werde regelrecht zugespamt mit der MSG "Befehl hat noch CD".
    Ich bin kein JS Crack und habe alles bisher immer mit der SuMa Suche erledigt was ich haben wollte .. aber aktuell stehe ich voll auf dem Schlauch

    ohne den quellcode genau zu kennen kann ich dir da wahrscheinlich nicht wirklich helfen ... aber bei den Fehlermeldungen wird dir ja meist eine Zeile und Datei mit angegeben in der eben dieser Fehler auftritt

  • Danke, diese CASE Variante nicht berücktichtigt gehabt das dies bei JS geht.
    Ich hab nochmal den kompletten Code den ich gepostet hab gekopiert und jetzt läuft der Bot erstmal wieder.


    Der Versuch den Cooldown mittels einer Funktion zu erledigen hat mir aktuell leider die Option genommen den Command-Cooldown zu verwenden.
    Es werden alle Commands aktuell gleich behandelt.


    Aber ich finde es doof wenn man den Code immer wieder verwendet.

    Die Twitch Fee mag dich nicht ist das equivalent zu 42

  • Hallo zusammen



    Zunächst möchte ich mich kurz bedanken, dass hier so viel Mühe gemacht wird, um ein Tutorial zu schreiben



    Nun zu meinem Problem/Frage:
    Ich bin wirklich ein Neuling auf der Stufe der Programmierung und probiere hier auch was Neues für mich aus. Ich versuche gerade den Schritten aus dem «originalen» Post zu folgen, allerdings ohne Erfolg. Ich habe Probleme mit Erstellen eines Ordners. Ich versuche dem Ablauf zu folgen und trotzdem komme ich nicht bis zum Ordner. Wenn ich es richtig verstanden habe muss ich das Kommando «CD C:\Users\DEINNAME\Desktop» im CMD eingeben (den Namen habe ich natürlich angepasst), wenn ich einen Ordner aufem Desktop erstellen will, will ich zwar nicht, aber funktioniert auch nicht. Ich möchte meinen Ordner wo anders erstellen, aber ich schaffe es grundsätzlich nicht einen Ordner zu erstellen. Also zunächst müsste ich mal diesen Schritt schaffen, bevor ich weiterfahren kann.


    Falls jemand Zeit hat, ich hab Skype, Discord, TS und Teamviewer



    lg

  • Du solltest dich glaube ich erstmal mit den Befehlen der Kommandozeile auseinandersetzen.

    cdZeigt das aktuelle Verzeichnis und lässt Sie in andere Verzeichnisse wechseln. Mit dem Parameter /D plus Laufwerk und Pfadangabe können Sie auch das Laufwerk wechseln. Durch cd.. wechseln Sie in das höhergelegene Verzeichnis. (Hat dieselbe Funktion wie der Befehl chdir.)


    https://www.ionos.de/digitalgu…whow/windows-cmd-befehle/


    Und dir die Grundlagen von JavaScript solltest du dir auch ansehen Falls noch nicht geschehen.


    Wir stehen uns manchmal selber im Weg. Vielleicht wäre ein Umweg ein Ausweg.

    Die Tat unterscheidet das Ziel vom Traum

  • Du solltest dich glaube ich erstmal mit den Befehlen der Kommandozeile auseinandersetzen.

    cdZeigt das aktuelle Verzeichnis und lässt Sie in andere Verzeichnisse wechseln. Mit dem Parameter /D plus Laufwerk und Pfadangabe können Sie auch das Laufwerk wechseln. Durch cd.. wechseln Sie in das höhergelegene Verzeichnis. (Hat dieselbe Funktion wie der Befehl chdir.)


    https://www.ionos.de/digitalgu…whow/windows-cmd-befehle/


    Und dir die Grundlagen von JavaScript solltest du dir auch ansehen Falls noch nicht geschehen.

    Ich hab die Befehle jetzt mal bisschen studiert und muss sagen, dass ich nicht schlau draus werden, warum der Typ im "originalen" Post "CD" als Befehl genommen hat um einen Ordner zu erstellen? Versteht ihr das?

  • also JS "allgemein" Wissen fehlt mir .. jepp.
    Das war ich vorher bei Webseiten an JS benötigt habe, habe ich immer mittels Google gesucht.
    Sei es plain oder jquery / Framework XYZ.


    CLI Befehle kenne ich von Windows und Linux sehr gut .. ebenso kann ich man pages lesen.
    nevermind .. das ging gar nich an mich mit der CLI :D (ja .. JS Grundwissen fehlt mir dennoch) :D


    Ich bin eher der PHP Jünger seit 2004) :D


    Ich bin persönlich daran interessiert wenn wir (gerne gemeinsam) den eigenen TMI Bot um weitere Funktionen erweitern.
    Dann aber bitte nicht prozedural, sondern mindestens funktional ... oder gar OOP (wird unterstützt nach 2. Sek SuMa Befragung).


    D. h. den Bot um folgendes erweitern

    • Cooldowns -> function / oop
    • Alert-Handling (Text / Animation)
    • Alert-Simulation Handling (war mir die SuMa bisher nicht sehr gespräching bei)
    • ... usw

    Die Twitch Fee mag dich nicht ist das equivalent zu 42

  • @GreeenFriend

    dass ich nicht schlau draus werden, warum der Typ im "originalen" Post "CD" als Befehl genommen hat um einen Ordner zu erstellen?

    Ich habe mir den Post noch mal angesehen aber wo erstellt er mit CD einen neuen Ordner?



    Schritt 1: Gehe auf deinen Desktop oder sonst dort hin, wo du den Ordner erstellen willst.
    Dazu benutzt du das Kommando: CD C:\Users\DEINNAME\Desktop

    Hier an der Stelle geht er nur in das Verzeichnis erstellt den Ordner aber noch nicht.


    Um einen Ordner über Konsole zu erstellen, musst du folgendes ein tippen


    mkdir deinOrdnerName




    mkdirErstellt ein neues Verzeichnis am angegebenen Pfad. Sollten Verzeichnisse auf dem Pfad nicht bereits existieren, erzeugt mkdir diese automatisch. (Alternativ kann man auch den Befehl md verwenden.)

    Wir stehen uns manchmal selber im Weg. Vielleicht wäre ein Umweg ein Ausweg.

    Die Tat unterscheidet das Ziel vom Traum

  • Hey alle miteinander,


    Habe mir mithilfe eures Guides einen Bot für meinen Stream erstellt und sage vorab erst einmal ein riesen Danke für den Guide!


    Nun habe ich jedoch eine andere Frage;
    Ich würde gerne meinen Bot Infos aus einer Textdatei die von einem anderen Programm kontinuierlich geupdated wird rauslesen und im Stream nach einem Command ausgeben lassen. Kann mir da einer behilflich sein wie ich das realisieren kann?


    Vielen Dank im Vorfeld! :-)

  • Nun habe ich jedoch eine andere Frage;
    Ich würde gerne meinen Bot Infos aus einer Textdatei die von einem anderen Programm kontinuierlich geupdated wird rauslesen und im Stream nach einem Command ausgeben lassen. Kann mir da einer behilflich sein wie ich das realisieren kann?

    vielleicht hilft dir das weiter


    https://stackabuse.com/reading…-line-by-line-in-node-js/

  • ja das ist ohne probleme möglich ...
    es wird einfach nur ein anderes event getriggert ... die abfrage der events sieht wie folgt aus


    JavaScript
    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
    });

    dort bildet 'chat' gerade das Event was getriggert wird und ruft dann die commands '"Funktion" auf
    dort musst du einfach nur das neue Event eintragen und dem entsprechend die neue Datei einbinden


    in deinem fall würde das ganzer dann ungefär so aussehen bzw erweitert werden müssen



    alle events die getriggert werden können findest du HIER achte aber hier darauf das sich die variablen je nach Event ändern ;)

  • Hmm, nice.


    Ich glaube ich werde das einbinden damit ICH die Messages sehe, aber die Leute im Chat damit nicht genervt werden.
    Ich lasse mich anflüstern um in Chatty direkt die Messages zu sehen.


    Wäre nur geil das es wie früher die Möglichkeit gebe das Wsp-Msg's direkt im Channel erscheinen würden. Das geht zumindest bei Chatty nicht.

    Die Twitch Fee mag dich nicht ist das equivalent zu 42

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!