Wiki

Clone wiki

User Apps / OpenSource / LazyNewsletter Klasse

Die LazyNewsletter Klasse

Was ist eine LazyNewsletter Klasse und warum wird sie benötigt?

Die Klasse erlaubt es Nachrichten an eine Reihe von Usern zu schicken, ohne dass alle /m's zeitgleich bzw. möglichst schnell herausgehen. Dies ist vor allem wichtig um die Notabschaltung seitens Knuddels zu unterbinden, wenn zuviele Nachrichten erzeugt werden. Die LazyNewsletter Klasse managed automatisch, dass nur 10 /m's pro Sekunde verschickt werden und beugt so eine Notabschaltung vor.

Die Klasse ist so umgesetzt, dass sie ohne Framework und Veränderungen am Code funktioniert. Per Aufruf lassen sich die Empfänger festlegen sowie die Nachricht und der Betreff. Außerdem kann man einstellen, ob die User die Nachricht per /p bekommen sollen, sofern sie online sind (Standard: An)

Wie die Klasse benutzt wird

var message = "Das ist meine Testnachricht";
var topic = "Die ist mein Betreff";
//der Topic kann auch durch null oder undefined  ersetzt werden, dann wird ein standard Betreff gewählt.
var lazyNewsletter = new LazyNewsletter(topic, message); 


UserPersistenceNumbers.each('newsletter', function(user, value, index, totalCount, key)
{
    //wir holen uns alle Nutzer aus der Persistenz die sich für den Newsletter angemeldet haben
    lazyNewsletter.addUser(user);

}, 
{ 
    onEnd: function() { 
        lazyNewsletter.start(); 
    }
}); // am ende starten wir den Newsletter

Die Klasse

/**
 * @class LazyNewsletter
 * @param {string} _topic
 * @param {string} _message
 * @param {User[]} _users
 * @param {boolean} _start
 * @param {boolean} _alwaysPost
 * @constructor
 */
function LazyNewsletter(_topic, _message, _users, _start, _alwaysPost) {
    var _finished = false;
    var _i = 0;

    if(typeof _topic == "undefined" || _topic == null) {
        _topic = KnuddelsServer.getAppInfo().getAppName() + " Information";
    }

    if(typeof _message == "undefined" || _message == null) {
        throw "LazyNewsletter has no Message";
    }

    if(typeof _users == "undefined" || _users == null) {
        _users = [];            //default empty userarray
    }

    if(typeof _start == "undefined" || _start == null) {
        _start = false;         //default no autostart
    }

    if(typeof _alwaysPost == "undefined" || _alwaysPost == null) {
        _alwaysPost = false;    //default allow /p
    }

    if(_start && users.length == 0) {
        throw "No Users for LazyNewsletter";
    }

    /**
     * Gibt den aktuellen Status zurück, ob der Newsletterversand beendet ist
     *
     * @method isFinished
     * @return {boolean}
     */
    this.isFinished = function isFinished() {
        return _finished;
    };

    /**
     * Fügt einen oder mehrere Nutzer als Empfänger hinzu
     *
     * @method addUser
     * @param {User|User[]} user
     */
    this.addUser = function addUser(user) {
        if(user.constructor.name == "Array") {
            for(var key in user) {
               this.addUser(user[key]);
            }
        } else {
            if(typeof user.getNick == "undefined") {
                throw "This is not a Userobject";
            }
            _users.push(user);
        }
    };

    /*
     * Startet den Versand
     * @method start
     */
    this.start = function start() {
        if(_finished) {
            return false;
        }

        if(_users.length == 0) {
            throw "No Users for LazyNewsletter";
        }

        _start = true;
    };

    /*
     * Interner Handler der für den Versand zuständig ist.
     *
     * @method timeHandler
     * @protected
     */
    this.timerHandler = function timerHandler() {
        if(!_start) {
            return; //not yet started
        }

        var user = _users[_i];
        if(_alwaysPost || !user.isOnline()) {
            user.sendPostMessage(_topic, _message)
        } else {
            user.sendPrivateMessage(_message);
        }

        if(++_i >= _users.length) {
            _start = false;
            _finished = true;
            clearInterval(_interval);
        }
    }.bind(this);

    var _interval = setInterval(this.timerHandler, 100);
}

Updated