Deprecated: Use of "parent" in callables is deprecated in /var/www/html/forum/src/vendor/league/flysystem-eventable-filesystem/src/EventableFilesystem.php on line 431
  • If you need help or want to discuss things, you now can also join us on our Discord Server!
  • A first preview of the unlimited version of SinusBot can be found in the Upcoming Changes thread. A version for Windows will follow, but we don't have a release date, yet.

DE Wert verändert sich nicht in Schleife

Kamikaze

Well-Known Member
Contributor
Hey!

Bei mir ist das ganz komisch. Der Wert der Variable verändert sich nicht in der for-schleife
JavaScript:
    var engine = require('engine')
    var event = require('event')
    var backend = require('backend')
    
    var SOactive = config.StreamerOverviewActive
    var SOchannel = config.StreamerOverviewChannel
    var TwitchArray = config.TwitchArrays
    
    if (SOactive == 0) {
        
        var Channel = backend.getChannelByID(Channel);
        
        for (var i = 0; i < TwitchArray.length; i++) {
            
            var TwitchUser = TwitchArray[i].TwitchUser
            engine.log(TwitchUser)
            var URL = "https://api.twitch.tv/kraken/streams/" + TwitchUser + "?stream_type=live"
            
            sinusbot.http({
                method: "GET",
                url: URL,
                timeout: 60000,
                headers: {"Client-ID": "xxx"}
            }, function (error, response) {
                
                var data = response.data
                data = JSON.parse(data)
                
                engine.log(TwitchUser)
            })
        }
    }

Logfile
Code:
2018-03-27T18:00:51+02:00 GHGTwitchStatus:74 monstercat
2018-03-27T18:00:51+02:00 GHGTwitchStatus:74 monstercat
2018-03-27T18:00:51+02:00 HTTP: GET https://api.twitch.tv/kraken/streams/monstercat?stream_type=live
2018-03-27T18:00:51+02:00 GHGTwitchStatus:64 monstercat
2018-03-27T18:00:51+02:00 HTTP: GET https://api.twitch.tv/kraken/streams/kamiikaze666?stream_type=live
2018-03-27T18:00:51+02:00 GHGTwitchStatus:64 kamiikaze666

Als würde die 2. log-ausgabe in der funktion erst nach der schleife ausgeführt
 

Multivitamin

Well-Known Member
Tier III
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
Dein Problem ist das sinusbot.http asynchron ist

das Problem ist folgendes
du arbeitest die for Loop ab und überschreibst jedesmal die TwitchUser Variable (welche übrigens global ist)
dann bekommst du schlussendlich deine erste http Response zurück (nach dem die komplette Loop abgearbeitet worden ist und TwitchUser der letzte User ist im Array)
ES6 hat mittlerweile "let" anstatt "var" um derartige Probleme zu lösen

ein Lösungsansatz wäre folgendes

JavaScript:
    var engine = require('engine')
    var event = require('event')
    var backend = require('backend')
    
    var SOactive = config.StreamerOverviewActive
    var SOchannel = config.StreamerOverviewChannel
    var TwitchArray = config.TwitchArrays
    
    if (SOactive == 0) {
        
        var Channel = backend.getChannelByID(Channel);
        
        TwitchArray.forEach(function(Twitch) {
            var TwitchUser = Twitch.TwitchUser  //TwitchUser ist hier im Scope der function und nicht mehr global
            engine.log(TwitchUser)
            var URL = "https://api.twitch.tv/kraken/streams/" + TwitchUser + "?stream_type=live"
            
            sinusbot.http({
                method: "GET",
                url: URL,
                timeout: 60000,
                headers: {"Client-ID": "xxx"}
            }, function (error, response) {
                
                var data = response.data
                data = JSON.parse(data)
                
                engine.log(TwitchUser)
            })
        })
        
    }
 

Kamikaze

Well-Known Member
Contributor
Dein Problem ist das sinusbot.http asynchron ist

das Problem ist folgendes
du arbeitest die for Loop ab und überschreibst jedesmal die TwitchUser Variable (welche übrigens global ist)
dann bekommst du schlussendlich deine erste http Response zurück (nach dem die komplette Loop abgearbeitet worden ist und TwitchUser der letzte User ist im Array)
ES6 hat mittlerweile "let" anstatt "var" um derartige Probleme zu lösen

ein Lösungsansatz wäre folgendes

JavaScript:
    var engine = require('engine')
    var event = require('event')
    var backend = require('backend')
   
    var SOactive = config.StreamerOverviewActive
    var SOchannel = config.StreamerOverviewChannel
    var TwitchArray = config.TwitchArrays
   
    if (SOactive == 0) {
       
        var Channel = backend.getChannelByID(Channel);
       
        TwitchArray.forEach(function(Twitch) {
            var TwitchUser = Twitch.TwitchUser  //TwitchUser ist hier im Scope der function und nicht mehr global
            engine.log(TwitchUser)
            var URL = "https://api.twitch.tv/kraken/streams/" + TwitchUser + "?stream_type=live"
           
            sinusbot.http({
                method: "GET",
                url: URL,
                timeout: 60000,
                headers: {"Client-ID": "xxx"}
            }, function (error, response) {
               
                var data = response.data
                data = JSON.parse(data)
               
                engine.log(TwitchUser)
            })
        })
       
    }
Klappt danke :)
 

irgendwr

no longer active, "retired" staff member
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
<unnötiger post>
Gemein, da hab ich zu lange zum tippen gebraucht und der multi war schneller xD

Winzige Ergänzung:
Es gibt in JavaScript <= ES5 kein block-level scope (erst mit let ab es6), deswegen ist TwitchUser in einem for-loop nicht an den einen Durchlauf gebunden (wie
multi schon erklärt hat), bei dem forEach hingegen wird immer eine function aufgerufen die auch einen neuen scope schafft.

die TwitchUser Variable (welche übrigens global ist)
Technisch gesehen ist sie nicht global, sondern nur im selben scrope wie die main function :p
</unnötiger post>
 
Last edited:

irgendwr

no longer active, "retired" staff member
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
irgendwer used self-awareness.
It was at least somewhat effective.
 

Kamikaze

Well-Known Member
Contributor
Wie kann ich nun hier die Variablen aus der Funktion außerhalb nutzen?
JavaScript:
    if (SOactive == 0) {
       
        TwitchArray.forEach(function(Twitch) {
            var TwitchUser = Twitch.TwitchUser
            engine.log(TwitchUser)
            var URL = "https://api.twitch.tv/kraken/streams/" + TwitchUser + "?stream_type=live"
           
            sinusbot.http({
                method: "GET",
                url: URL,
                timeout: 60000,
                headers: {"Client-ID": "XXX"}
            }, function (error, response) {
               
                var data = response.data
                data = JSON.parse(data)
               
                if (!data.stream) {
                    var TwitchGame = "[Offline]"
                    var TwitchViewer = 0
                    var TwitchTitel = "[Offline]"
                    var TwitchFollower = "[Offline]"
                } else {
                    var TwitchGame = data.stream.game
                    var TwitchViewer = data.stream.viewers
                    var TwitchTitel = data.stream.channel.status
                    var TwitchFollower = data.stream.channel.followers
                }
               
               
            })
                Channel.setDescription(TwitchUser + " " + TwitchGame + " " + TwitchViewer + " " + TwitchTitel + " " + TwitchFollower)
        })
    }
 

irgendwr

no longer active, "retired" staff member
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
Wie kann ich nun hier die Variablen aus der Funktion außerhalb nutzen?
Naja, du musst die vars dafür erst im äußerem scope definieren, das kannst du z.B. durch ein array in der main function machen.
 

Kamikaze

Well-Known Member
Contributor
Naja, du musst die vars dafür erst im äußerem scope definieren, das kannst du z.B. durch ein array in der main function machen.
So?^^
JavaScript:
    if (SOactive == 0) {
        
        var TwitchGame = ""
        var TwitchViewer = ""
        var TwitchTitel = ""
        var TwitchFollower = ""
        var Msg = ""
        
        TwitchArray.forEach(function(Twitch) {
            var TwitchUser = Twitch.TwitchUser
            //engine.log(TwitchUser)
            var URL = "https://api.twitch.tv/kraken/streams/" + TwitchUser + "?stream_type=live"
            
            sinusbot.http({
                method: "GET",
                url: URL,
                timeout: 60000,
                headers: {"Client-ID": "xxx"}
            }, function (error, response) {
                
                var data = response.data
                data = JSON.parse(data)
                
                if (!data.stream) {
                    TwitchGame = "[Offline]"
                    TwitchViewer = 0
                    TwitchTitel = "[Offline]"
                    TwitchFollower = "[Offline]"
                    engine.log("Offline")
                } else {
                    TwitchGame = data.stream.game
                    TwitchViewer = data.stream.viewers
                    TwitchTitel = data.stream.channel.status
                    TwitchFollower = data.stream.channel.followers
                    engine.log("Online")
                }
                Msg += "User: %user%\nGame: %game%\nViewer: %viewer%\nTitel: %title%\nFollower: %follower%\n\n\n"
                Msg = Msg    .replace("%user%", TwitchUser)
                            .replace("%game%", TwitchGame)
                            .replace("%viewer%", TwitchViewer)
                            .replace("%title%", TwitchTitel)
                            .replace("%follower%", TwitchFollower)
                Channel.setDescription(Msg)
                engine.log(Msg)
            })
        })
    }

Es funktioniert nur zur hälfte da er manchmal nur den ersten durchlauf in den channel schreibt oder sich die reihenfolge immer wieder ändert.
Wenn ich Channel.setDescription(Msg) außerhalb der funktion nutze kommt nichts.
 

Diesmon

Tuetchen Dominator
is awesome!
Contributor
Insider
Edit: Deshlab möchte ich das setzen außerhalb machen, damit erst der Text "zusammengebaut" wird und danach reingeschrieben.

Was hindert dich daran?^^

Mach var msg global und add in jedem durchlauf den current string hinzu. Und am ende nach der forEach dann Channel.setDescription(msg)

Oder alternativ als array, wenn du es noch anderweitig formatieren willst.
 

Kamikaze

Well-Known Member
Contributor
Was hindert dich daran?^^

Mach var msg global und add in jedem durchlauf den current string hinzu. Und am ende nach der forEach dann Channel.setDescription(msg)

Oder alternativ als array, wenn du es noch anderweitig formatieren willst.
habs versucht, klappt aber nicht^^

JavaScript:
    var msg = ""
   
if (SOactive == 0) {
    TwitchArray.forEach(function (Twitch) {
        var twitchUser = Twitch.TwitchUser;
        //engine.log(TwitchUser)

        sinusbot.http({
            method: "GET",
            url: "https://api.twitch.tv/kraken/streams/" + twitchUser + "?stream_type=live",
            timeout: 60000,
            headers: { "Client-ID": "xx" }
        }, function (error, response) {
            var data = JSON.parse(response.data);

            var twitchGame = "",
                twitchViewer = "",
                twitchTitel = "",
                twitchFollower = "";
            if (!data.stream) {
                twitchGame = "[Offline]";
                twitchViewer = 0;
                twitchTitel = "[Offline]";
                twitchFollower = "[Offline]";
                engine.log("Offline");
            } else {
                twitchGame = data.stream.game;
                twitchViewer = data.stream.viewers;
                twitchTitel = data.stream.channel.status;
                twitchFollower = data.stream.channel.followers;
                engine.log("Online");
            }
            msg += "User: %user%\nGame: %game%\nViewer: %viewer%\nTitel: %title%\nFollower: %follower%\n\n\n";
            msg = msg.replace("%user%", twitchUser)
                .replace("%game%", twitchGame)
                .replace("%viewer%", twitchViewer)
                .replace("%title%", twitchTitel)
                .replace("%follower%", twitchFollower);
            engine.log(msg);
        });
    });
    Channel.setDescription(msg);
}
 
Last edited:

irgendwr

no longer active, "retired" staff member
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
habs versucht, klappt aber nicht^^
So klappt es auch nicht, weil Channel.setDescription ausgeführt wird, bevor die http callbacks aufgerufen wurden weil die ja async sind.

Du müsstest einen counter haben den du in jedem callback erhöhst und wenn der counter der zahl an elementen im array entspricht, setzt du die description.
 

irgendwr

no longer active, "retired" staff member
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
so zB:
JavaScript:
var msg = "";
var done = 0;

if (SOactive == 0) {
    TwitchArray.forEach(function (Twitch) {
        var twitchUser = Twitch.TwitchUser;
        //engine.log(TwitchUser)
 
        sinusbot.http({
            method: "GET",
            url: "https://api.twitch.tv/kraken/streams/" + twitchUser + "?stream_type=live",
            timeout: 60000,
            headers: { "Client-ID": "09yqfi2m1ggvcumavhvql1j7mcadql" }
        }, function (error, response) {
            var data = JSON.parse(response.data);
 
            var twitchGame = "[Offline]",
                twitchViewer = 0,
                twitchTitel = "[Offline]",
                twitchFollower = "[Offline]";
            
            if (data.stream) {
                twitchGame = data.stream.game;
                twitchViewer = data.stream.viewers;
                twitchTitel = data.stream.channel.status;
                twitchFollower = data.stream.channel.followers;
            }
            engine.log(data.stream ? "Online" : "Offline");

            msg += "User: %user%\nGame: %game%\nViewer: %viewer%\nTitel: %title%\nFollower: %follower%\n\n\n";
            msg = msg.replace("%user%", twitchUser)
                .replace("%game%", twitchGame)
                .replace("%viewer%", twitchViewer)
                .replace("%title%", twitchTitel)
                .replace("%follower%", twitchFollower);
            engine.log(msg);

            done++;
            
            if (done == TwitchArray.length) {
                Channel.setDescription(msg);
            }
        });
    });
}
 

Kamikaze

Well-Known Member
Contributor
so zB:
JavaScript:
var msg = "";
var done = 0;

if (SOactive == 0) {
    TwitchArray.forEach(function (Twitch) {
        var twitchUser = Twitch.TwitchUser;
        //engine.log(TwitchUser)

        sinusbot.http({
            method: "GET",
            url: "https://api.twitch.tv/kraken/streams/" + twitchUser + "?stream_type=live",
            timeout: 60000,
            headers: { "Client-ID": "09yqfi2m1ggvcumavhvql1j7mcadql" }
        }, function (error, response) {
            var data = JSON.parse(response.data);

            var twitchGame = "[Offline]",
                twitchViewer = 0,
                twitchTitel = "[Offline]",
                twitchFollower = "[Offline]";
           
            if (data.stream) {
                twitchGame = data.stream.game;
                twitchViewer = data.stream.viewers;
                twitchTitel = data.stream.channel.status;
                twitchFollower = data.stream.channel.followers;
            }
            engine.log(data.stream ? "Online" : "Offline");

            msg += "User: %user%\nGame: %game%\nViewer: %viewer%\nTitel: %title%\nFollower: %follower%\n\n\n";
            msg = msg.replace("%user%", twitchUser)
                .replace("%game%", twitchGame)
                .replace("%viewer%", twitchViewer)
                .replace("%title%", twitchTitel)
                .replace("%follower%", twitchFollower);
            engine.log(msg);

            done++;
           
            if (done == TwitchArray.length) {
                Channel.setDescription(msg);
            }
        });
    });
}
Danke für die Hilfe, läuft nun :)
 
Top