Wiki

Clone wiki

User Apps / Erste Schritte mit der API - onlineUser durchlaufen

Was für mich Anfangs sehr problematisch war, war das durchlaufen von z.B. Usern. Oft möchte man alle User im Channel ansprechen z.B. für zufällige Gewinne und benötigt dafür eine Schleife die alle User die Online sind auswählt. Ich habe dies benötigt da ich auch beim Neustart meiner App die HTML-UI sofort wieder öffnen wollte. Ich benötigte also einen Weg um alle online User anzusprechen und sie in einer Schleife durch zugehen. In PHP wäre die Aufgabe in 20 Sekunden erledigt gewesen, in Javascript musste ich mich etwas länger damit beschäftigen.

Um sich alle aktiven User im Channel zu holen benötigen wir zuerst das "Channel" Objekt. Objekte holen wir uns in der API immer ausgehend vom "Mutter-Objekt" namens "KnuddelsServer" Von diesem Mutter-Objekt ausgehend können wir uns alle Objekte holen die wir benötigen. Da wir in der App sehr oft Objekte brauchen werden und wir uns es sparen wollen jedes mal auf das Mutter-Objekt zugreifen zu müssen empfiehlt sich die Definierung der Variablen im vorhinein.

Ich empfehle die Definierung der Variablen in der main.js zu platzieren, noch bevor Ihr das App-Objekt aufruft.

#!javascript
/** Define needet vars */
var BotNick = Bot.getNick().escapeKCode();
var EntwicklerNickname = KnuddelsServer.appInfo.getAppDeveloper().getNick().escapeKCode();
var Entwickler = '_°BB>_h' + EntwicklerNickname + '|/w ' + EntwicklerNickname + '<°°° _';
var ChannelObject = KnuddelsServer.getChannel();
var FullChannelName = ChannelObject.getChannelName();
var ChannelName = FullChannelName.substr(1, FullChannelName.length);
var ChannelConfig = KnuddelsServer.getChannel().getChannelConfiguration();
var ChannelInfo = ChannelConfig.getChannelInformation();
var Logger = KnuddelsServer.getDefaultLogger();
var ServerInfo = KnuddelsServer.getAppServerInfo();
Ich speichere sämtliche Objekte die ich später brauchen werde in Variablen und kann so jederzeit auf sie zugreifen ohne ständig den langen Pfad über KnuddelsServer.getChannel() nehmen zu müssen. Wie Ihr seht habe ich auch gleich noch andere Variablen definiert wie zB den EntwicklerNickname um diesen einfacher verlinken zu können.

In Unserem Fall möchten wir jetzt aber alle online User des Channels auslesen. Dazu nutzen wir unser ChannelObect das wir uns geladen haben.

#!javascript
 /* Zuerst holen wir uns mit der Methode getOnlineUsers alle Benutzer und filtern diese gleich
    auf einen Typ. In unserem Fall auf UserType.Human, sozusagen nur menschliche Benutzer. Wir
    erhalten ein Objekt zurück in dem alle online User des Channels sind und lassen diese nun in
    einer Schleife durchlaufen um auf jeden User einzeln reagieren zu können. */
    var users = ChannelObject.getOnlineUsers(UserType.Human);

 for(var i = 0; i < users.length; i++) {
     /* Wir speichern das aktuelle User-Objekt das wir gerade in der Schleife ausgewählt haben
        in eine Variable und können danach sofort damit arbeiten. */
     var user = users[i];
     user.sendPrivateMessage('Hallo ' + user.getNick() + ' ich habe neu gestartet und bin wieder für dich da');
 }

Wenn wir diesen Code noch in den Hook "onAppStart" setzen werden die User nach einem Neustart der App privat angeflüstert und informiert, dass die App wieder einsatzbereit ist.

Zusammengesetzt kann das ganze dann so aussehen

#!javascript

/** Define needet vars */
var BotNick = Bot.getNick().escapeKCode();
var EntwicklerNickname = KnuddelsServer.appInfo.getAppDeveloper().getNick().escapeKCode();
var Entwickler = '_°BB>_h' + EntwicklerNickname + '|/w ' + EntwicklerNickname + '<°°° _';
var ChannelObject = KnuddelsServer.getChannel();
var FullChannelName = ChannelObject.getChannelName();
var ChannelName = FullChannelName.substr(1, FullChannelName.length);
var ChannelConfig = KnuddelsServer.getChannel().getChannelConfiguration();
var ChannelInfo = ChannelConfig.getChannelInformation();
var Logger = KnuddelsServer.getDefaultLogger();
var ServerInfo = KnuddelsServer.getAppServerInfo();


var App = (new function() {
    /* App Events */
// Deine App wurde gestartet
    this.onAppStart = function() {

        var users = ChannelObject.getOnlineUsers(UserType.Human);
        for(var i = 0; i < users.length; i++) {
           /* Wir speichern das aktuelle User-Objekt das wir gerade in der Schleife ausgewählt haben
              in eine Variable und können danach sofort damit arbeiten. */
            var user = users[i];
            user.sendPrivateMessage('Hallo ' + user.getNick() + ' ich habe neu gestartet und bin wieder für dich da');
        }
    };

Updated