Herzlich Willkommen auf StreamTalk.de, deiner Community rund um Twitch, Hitbox und Co.

Bei uns kannst Du deine Gedanken zu Twitch, Hitbox und Co. mit anderen teilen und Dich über interessante Themen rund ums Streaming austauschen, z.B. Chatbots, Donations, Sponsoring, Overlays, etc. Erhalte Hilfe und wertvolle Tipps für den Aufbau deines Streaming Channels. Außerdem kannst du deinen Stream in einem eigenen Bereich bei uns vorstellen oder nach Partnern für gemeinsame Projekte suchen.

Wir würden uns freuen, wenn du ein Teil dieser großartigen Community wirst: Jetzt registrieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklärst du dich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

DIESES FORUM IST VERALTET UND NUR NOCH ZUR DATENÜBERNAHME ERREICHBAR
BITTE DIE AKTUELLE VERSION VERWENDEN: STREAMTALK.DE

  • 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

    JavaScript-Quellcode

    1. const Owner = 'HierDerChannelNameInDemGejointWerdenSoll'; // wir speichern unseren Channel namen in eine Konstante
    2. const Bot = 'HierDerBotChannelName'; // das selbe gilt für den bot
    3. const BotOAuth = 'HierDerOAuthDesBots' // diesen erhaltet ihr auf https://twitchapps.com/tmi/
    4. 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
    5. // *************************************************************
    6. // **** NACH DIESER LINIE BRAUCHT IHR NICHS MEHR ÄNDERN ********
    7. // *************************************************************
    8. var tmi = require('tmi.js');
    9. var options = {
    10. options: {
    11. debug: true
    12. },
    13. connection: {
    14. secure: true,
    15. reconnect: true
    16. },
    17. identity: {
    18. username: Bot,
    19. password: BotOAuth
    20. },
    21. channels: Channels
    22. };
    23. var client = new tmi.client(options);
    24. client.connect();
    25. // wenn der bot zum chat verbindet
    26. client.on('connected', function(adress, port){
    27. console.log("Adresse: " + adress + " Port: " + port); // gibt eine nachricht in der konsole aus damit man sieht das der bot verbunden ist
    28. // ausgabe im chat das man erkennt das der Bot verbunden ist ( könnte auch weg gelassen werden ) *naaa wer versteht die anspielung :p*
    29. 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 )
    30. });
    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

    JavaScript-Quellcode

    1. var commands = require('./commands');
    2. // wenn eine nachricht im Chat geschrieben wurde fangen wir diese ab
    3. client.on('chat', function(channel, user, message, _self) {
    4. if(_self) return; // die eigenen bot nachrichten werden ignoriert ( deswegen am besten einen bot Channel )
    5. 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
    6. });

    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 )

    JavaScript-Quellcode

    1. module.exports = {
    2. run: function(client, channel, user, message, _self) {
    3. // da eine nachricht mehr als nur das command entahlten kann splitten wir uns diese und suchen das command
    4. var msg = message.split(' '), // teilen der nachricht an leerzeichen und speichern diese in ein array ( eine variable weil wir dieses nochmal anpassen müssen )
    5. 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
    6. 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
    7. var args = msg, // nicht unbedingt nötig aber so machen wir uns das übersichtlicher und speichern die argumente und die args variable
    8. // hier kommen 3 variablen die später für commands praktisch sind wenn es für bestimmte user gruppen sein soll :D
    9. isMod = user.mod, // ja wir können abfragen ob der user mod ist oder nicht ;)
    10. isSub = user.subscriber, // jhuhuu er ist sub ... oder doch nicht ? die variable sagt es uns :D
    11. 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 )
    12. userName = user.username; // hier ist der komplette name klein geschrieben
    13. // HIER starten jetzt die commands ! JUHUU ;D
    14. }
    15. }
    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

    JavaScript-Quellcode

    1. switch(command) {
    2. // ****************************************************
    3. // Der erste command
    4. // ****************************************************
    5. case '!test' :
    6. 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 )
    7. break;
    8. // ****************************************************
    9. // Der zweite command
    10. // ****************************************************
    11. case '!test2' :
    12. 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 )
    13. break;
    14. // ****************************************************
    15. // Der dritte und vierte command
    16. // ****************************************************
    17. // sollte man das break; weg lassen werden darunterliegende commands auch ausgeführt ( wofür auch immer man das benötigt aber es geht :D )
    18. case '!test3' :
    19. client.say(channel, "test 3 bestanden");
    20. case '!test4' :
    21. client.say(channel, "test 4 ? oder doch erst 3");
    22. break;
    23. }
    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 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 )

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von We-are-streamers ()

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

    JavaScript-Quellcode

    1. // wir erstellen uns eine coldown variable auserhalb des moduls damit sie beim aufruf nicht immer resettet wird.
    2. // und definieren die einzelnen cooldowns vor ( javascript hat sich etwas affig wenn wir etwas setzen wollen was nicht definiert ist )
    3. var lastRun = [];
    4. lastRun['global'] = 0; // wann wurde irgendein command zuletzt ausgeführt ( hier 0 weil nie :D )
    5. lastRun['commands'] = []; // wann wurde ein bestimmter command zuletzt ausgeführt ( ein leeres array weil wir hier nich nicht wissen was genau drin stehen wird )
    6. lastRun['user'] = []; // wann wurde ein bestimmter command von einem bestimmten user zuletzt ausgeführt ( ein leeres array weil wir hier nich nicht wissen was genau drin stehen wird )
    7. var globalCooldown = 2, // globaler cooldown in sekunden ... wie lang ist die pause bis der bot im allgemeinen auf commands reagiert ( spam protection )
    8. commandCooldown = 0, // command cooldown in sekunden ... wie lang ist die pause bis ein command wieder getrigert werden darf ( hier 0 weil wir diesen pro command anpassen )
    9. userCooldown = 0; // user cooldown in sekunden ... wie lang ist die pause bis ein user den command wieder triggern darf ( hier 0 weil wir diesen pro command anpassen )
    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-Quellcode

    1. var curentTimestamp = Math.floor(Date.now() / 1000), // der aktuelle timestamp in sekunden
    2. 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 )

    JavaScript-Quellcode

    1. // HIER starten jetzt die commands ! JUHUU ;D
    2. if (lastRun['global'] + globalCooldown <= curentTimestamp) { // prüft ob der globale cooldown schon abgelaufen ist
    3. switch(command) {
    4. // ****************************************************
    5. // Der erste command
    6. // ****************************************************
    7. case '!test' :
    8. botMessage = 'bestanden'; // die nachricht die gesendet werden soll
    9. break;
    10. }
    11. } else { // das else sollte man weg lasen und ist nur zu Demonstrationszwecken drin ( sonst hat die spam Protektion keinen sinn )
    12. botMessage = 'sry @' + userName +' Globaler cooldown'; // die nachricht die gesendet werden soll
    13. }
    14. if (botMessage !== false) { // prüft ob überhapt eine nachricht zu senden ist
    15. client.say(channel, botMessage); // 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 )
    16. lastRun['global'] = curentTimestamp; // setzt den last run für den global cooldown
    17. }
    Alles anzeigen
    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 )

    JavaScript-Quellcode

    1. case '!test' : // mit cooldown für den command
    2. commandCooldown = 5; // in sekunden command cooldown ( gilt nur für diesen command )
    3. // vordefinieren der variable wenn sie noch nicht exisitert ... ( wie bereits erwähnt ist javascript da etwas pingelig :D )
    4. lastRun['commands'][command] = (lastRun['commands'][command] != undefined) ? lastRun['commands'][command] : 0;
    5. if (lastRun['commands'][command] + commandCooldown <= curentTimestamp) { // prüfen ob der command cooldown schon abgelaufen ist
    6. botMessage = 'bestanden'; // die nachricht die gesendet werden soll
    7. lastRun['commands'][command] = curentTimestamp; // speichern des aktuellen Timestamps im lastrun des commands
    8. } else { // wenn nicht sag dem user bescheid ( sollte man nur machen wenn es ein langer cooldown ist um spam zu vermeiden )
    9. botMessage = 'sry @' + userName + ' dieser command hat noch Cooldown'; // die nachricht die gesendet werden soll
    10. }
    11. break;
    Alles anzeigen
    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.

    JavaScript-Quellcode

    1. case '!test' : // mit user cooldown
    2. userCooldown = 120; // cooldown für einzelne user in sekunden ( gilt nur für diesen command )
    3. // und wieder müssen wir uns die variablen vor definieren da wir hier ein array im array haben das ganze zwei mal
    4. lastRun['user'][userName] = (lastRun['user'][userName] != undefined) ? lastRun['user'][userName] : [];
    5. lastRun['user'][userName][command] = (lastRun['user'][userName][command] != undefined) ? lastRun['user'][userName][command] : 0;
    6. if (lastRun['user'][userName][command] + userCooldown <= curentTimestamp) { // prüfen ob der user cooldown abgelaufen ist
    7. botMessage = 'bestanden'; // die nachricht die gesendet werden soll
    8. lastRun['user'][userName][command] = curentTimestamp;
    9. } else { // wenn nicht sag dem user bescheid ( sollte man nur machen wenn es ein lange cooldown ist um spam zu vermeiden )
    10. botMessage = 'sry @' + userName + ' dieser command hat für dich noch Cooldown'; // dier nachricht die gesendet werden soll
    11. }
    12. break;
    Alles anzeigen
    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

    JavaScript-Quellcode

    1. if (lastRun['user'][userName][command] + userCooldown <= curentTimestamp) {
    2. // mach was
    3. }
    4. // zu
    5. if (lastRun['user'][userName][command] + userCooldown <= curentTimestamp || isMod) {
    6. // mach was
    7. }
    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

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von We-are-streamers ()

  • 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

    JavaScript-Quellcode

    1. case '!random' :
    2. var randomStrings = [ // hier speichern wir uns die antwortmöglichkeiten in ein array
    3. 'antwort 1',
    4. 'antwort 2',
    5. 'antwort 3'
    6. ],
    7. randomString = randomStrings[Math.floor(Math.random()* randomStrings.length)]; // hier wählen wir zufällig einen eintrag aus dem zuvor erstellten array
    8. botMessage = randomString;
    9. break;
    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.

    JavaScript-Quellcode

    1. case '!kill' : // z.b. !kill <name>
    2. var targetName = args[0], // da wir nur ein argument übergeben wissen wir es ist an position 0 ( hier kann theoretisch alles angegeben werden nicht unbedingt ein name )
    3. randomStrings = [ // hier speichern wir uns wieder random texte diese mal mit platzhaltern die wir ersetzen {{ATTACKER}} und {{TARGET}}
    4. '{{ATTACKER}} bewirft {{TARGET}} mit Wattebällchen bis er/sie blutet!',
    5. '{{ATTACKER}} zieht sein Quitschehammer und rennt auf {{TARGET}} zu ... *QUITSCH* mist daneben!',
    6. '{{ATTACKER}} bewirft {{TARGET}} mit gummiebärchenbomben.'
    7. ],
    8. randomString = randomStrings[Math.floor(Math.random()* randomStrings.length)]; // hier wird wieder der zufällige text gewählt
    9. randomString = randomString.replace('{{ATTACKER}}', userName); // mit replace ersetzen wir uns {{ATTACKER}} mit dem usernamen der den command ausführt
    10. randomString = randomString.replace('{{TARGET}}', targetName); // hier ersetzen wir uns {{TARGET}} mit dem argument0 in diesem fall der name der angegeben wurde
    11. botMessage = randomString;
    12. break;
    Alles anzeigen
    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

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von We-are-streamers ()

  • Alias Handling dazu wäre noch sehr nice.

    Ich habe dein bisheriges Tutorial etwas abgeändert:

    JavaScript-Quellcode: chatbot.js

    1. const tmi = require('tmi.js');
    2. const owner = 'skeevean';
    3. const botname = 'skeevebot';
    4. const bottoken = 'oauth:*******************';
    5. const botchannels = [owner, 'fremd_channel(testing)']
    6. const options = {
    7. options: {
    8. debug: true
    9. },
    10. connection: {
    11. cluster: "aws",
    12. reconnect: true
    13. },
    14. identity: {
    15. username: botname,
    16. password: bottoken
    17. },
    18. channels: botchannels
    19. };
    20. const client = new tmi.client(options);
    21. client.connect();
    22. // Connect Message in der Console
    23. client.on('connected', function(adress, port){
    24. console.log("Adresse: " + adress + " Port: " + port);
    25. client.say(owner, "connected - SkeeveTMI-Bot");
    26. });
    27. const commands = require('./src/commands');
    28. client.on('chat', function(channel, user, message, _self) {
    29. if(_self) return;
    30. commands.run(client, channel, owner, user, message, _self);
    31. });
    32. const alias = require('./src/alias'); // kommt noch, wenn ich eine Idee dazu habe (oder du)
    33. client.on('chat', function(channel, user, message, _self) {
    34. if(_self) return;
    35. alias.run(client, channel, owner, user, message, _self);
    36. });
    37. const alerts = require('./src/alerts'); (kommt noch, wenn ich eine idee dazu habe (kann es bisher nicht emulieren zum triggern für den Test)
    38. client.on('chat', function(channel, user, message, _self) {
    39. if(_self) return;
    40. alerts.run(client, channel, owner, user, message, _self);
    41. });
    Alles anzeigen


    Bisher nutze ich Alias und Alert noch nicht (testing)

    JavaScript-Quellcode: src/command.js

    1. const lastRun = [];
    2. lastRun['global'] = 0;
    3. lastRun['commands'] = [];
    4. lastRun['user'] = [];
    5. const globalCooldown = 10,
    6. commandCooldown = 0,
    7. userCooldown = 0;
    8. module.exports = {
    9. run: function(client, channel, owner, user, message, _self) {
    10. const msg = message.split(' '), command = msg[0].toLowerCase(); msg.shift();
    11. const username = user.username;
    12. const args = msg, isMod = user.mod, isSub = user.subscriber, isTurbo = user.turbo, chatuser = '@' + user.username + ' ';
    13. const currentTimestamp = Math.floor(Date.now() / 1000), botMessage = false;
    14. if (lastRun['global'] + globalCooldown <= currentTimestamp) {
    15. switch(command) {
    16. case '!discord':
    17. bot_msg = sendMessage(
    18. command, currentTimestamp, 5, 120, username,
    19. 'Discord: https://skeeve-live.de/discord', isMod
    20. );
    21. break;
    22. case '!youtube':
    23. bot_msg = sendMessage(
    24. command, currentTimestamp, 5, 120, username,
    25. 'Youtube: https://skeeve-live.de/youtube', isMod
    26. );
    27. break;
    28. case '!twitter':
    29. bot_msg = sendMessage(
    30. command, currentTimestamp, 5, 120, username,
    31. 'Twitter: https://skeeve-live.de/twitter', isMod
    32. );
    33. break;
    34. case '!obs':
    35. bot_msg = sendMessage(
    36. command, currentTimestamp, 5, 120, username,
    37. 'Nutze Kanalpunkte um mein OBS zu steuern, z. B. Kamera und Main Szene tauschen und vieles mehr', isMod
    38. );
    39. break;
    40. case '!sounds':
    41. bot_msg = sendMessage(
    42. command, currentTimestamp, 5, 120, username,
    43. 'Nutze Kanalpunkte um Sounds im Stream abzuspielen (Sound-Alerts)', isMod
    44. );
    45. break;
    46. case '!testsub':
    47. bot_msg = sendMessage(
    48. command, currentTimestamp, 5, 120, username,
    49. 'sub-test', isMod
    50. );
    51. break;
    52. }
    53. } else { // Demo -> Spam Protection sonst unsinn
    54. //botMessage = 'der Befehl '+ command + ' hat noch Cooldown';
    55. bot_msg = 'der Befehl ' + command + ' hat noch Cooldown';
    56. }
    57. if (botMessage !== false) { // den Teil brauche ich scheinbar nicht "mehr"
    58. client.say(channel, botMessage);
    59. lastRun['global'] = currentTimestamp;
    60. }
    61. if (bot_msg !== false) {
    62. client.say(channel, bot_msg);
    63. lastRun['global'] = currentTimestamp;
    64. }
    65. }
    66. }
    67. function sendMessage(command, curr_ts, cmd_cd, user_cd, username, msg, isMod) {
    68. const commandCooldown = cmd_cd;
    69. const userCooldown = user_cd;
    70. const currentTimestamp = curr_ts;
    71. const userName = username;
    72. lastRun['commands'][command] = (lastRun['commands'][command] != undefined) ? lastRun['commands'][command] : 0;
    73. if (lastRun['commands'][command] + commandCooldown <= currentTimestamp) {
    74. lastRun['user'][userName] = (lastRun['user'][userName] != undefined) ? lastRun['user'][userName] : [];
    75. lastRun['user'][userName][command] = (lastRun['user'][userName][command] != undefined) ? lastRun['user'][userName][command] : 0;
    76. if (lastRun['user'][userName][command] + userCooldown <= currentTimestamp || isMod) {
    77. botMessage = '@' + username + ' ' + msg;
    78. lastRun['user'][userName][command] = currentTimestamp;
    79. } else {
    80. botMessage = '@' + username + ' der Command ' + command + 'hat für dich noch Cooldown';
    81. }
    82. lastRun['commands'][command] = currentTimestamp;
    83. } else {
    84. botMessage = '@' + username + ' der Command ' + command + 'hat für alle noch Cooldown';
    85. }
    86. return botMessage;
    87. }
    Alles anzeigen

    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

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Skeeve ()

  • Skeeve schrieb:

    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-Quellcode

    1. case '!dc':
    2. case '!discord':
    3. bot_msg = sendMessage(
    4. command, currentTimestamp, 5, 120, username,
    5. 'Discord: https://skeeve-live.de/discord', isMod
    6. );
    7. break;
    so wird der code bei beidem ausgeführt da der Break das ganze erst "beendet"


    Skeeve schrieb:

    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
    - junger Schweizer und Frischblutstreamer, der gerne lacht


    Twitch - GreeenFriend
    IG - Greeen.Friend
    Youtube -GreeenFriend
    TikTok - GreeenFriend
  • 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.)

    ionos.de/digitalguide/server/knowhow/windows-cmd-befehle/

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

    Grundlagen der Computer-Murphyologie (auzug):
    Erster Gegensatz von digitaler und analoger Logik:
    Menschen, die mit Computern arbeiten, verhalten sich nicht so, wie der Computer verlangt, dass sie sich verhalten sollen.

    Computer sind die intelligentesten Idioten, die es gibt.
  • Dragon_tk1986 schrieb:

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

    ionos.de/digitalguide/server/knowhow/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?
    - junger Schweizer und Frischblutstreamer, der gerne lacht


    Twitch - GreeenFriend
    IG - Greeen.Friend
    Youtube -GreeenFriend
    TikTok - GreeenFriend
  • 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

    GreeenFriend schrieb:

    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?


    exxoticx schrieb:

    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.)
    Grundlagen der Computer-Murphyologie (auzug):
    Erster Gegensatz von digitaler und analoger Logik:
    Menschen, die mit Computern arbeiten, verhalten sich nicht so, wie der Computer verlangt, dass sie sich verhalten sollen.

    Computer sind die intelligentesten Idioten, die es gibt.
  • 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! :)
  • ja das ist ohne probleme möglich ...
    es wird einfach nur ein anderes event getriggert ... die abfrage der events sieht wie folgt aus

    JavaScript-Quellcode

    1. var commands = require('./commands');// wenn eine nachricht im Chat geschrieben wurde fangen wir diese ab
    2. client.on('chat', function(channel, user, message, _self) {
    3. if(_self) return; // die eigenen bot nachrichten werden ignoriert ( deswegen am besten einen bot Channel )
    4. 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
    5. });
    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

    JavaScript-Quellcode

    1. var commands = require('./commands');
    2. client.on('chat', function(channel, user, message, _self) {
    3. if(_self) return;
    4. commands.run(client, channel, user, message, _self);
    5. });
    6. var subs = require('./subs'); // <--- hier die neue subs datei
    7. client.on("subscription", (channel, user, method, message, userstate); {
    8. subs.run(channel, user, method, message, userstate);
    9. });
    Alles anzeigen

    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
  • Brunsben schrieb:

    OK, danke für die Info, muss mir jetzt noch jemanden suchen, der das schreiben kann
    selbe lernen macht mehr Spaß :D du hast hier ein Grundlagen Tutorial ... das reicht eigentlich schon wenn man damit etwas rum experimentiert das man den rest davon auch versteht ... du kannst nicht viel kaputt machen außer das script selber ( zumindest in der Programmiersprache :D ) probiere dich aus und schau was passiert aber für fragen stehe ich gern zu Verfügung ... ich könnt es dir zwar schreiben aber ich gebe lieber Hilfe zur Selbsthilfe ( und außerdem bin euch "teuer" :) )