Scriptbeispiel: LazyNewsletter Klasse

Bereits seit einiger Zeit geistert im Entwickler-Wiki ein Script herum, das vielen Usern die eine User App programmieren wollen und unbedingt einen Newsletter benötigen, sehr helfen könnte. Schon seit über einem Jahr geistert im Entwickler-Wiki eine Newsletterklasse herum, die oftmals (auch mir) schon nützlich war um diverse Benachrichtigungen zu automatisieren bzw. einen Newsletter zu ermöglichen. Oftmals muss ja das Rad nicht neu erfunden werden und daher hat VampiricDesire diese Klasse als OpenSource-Script zur Verfügung gestellt. Vielen Dank dafür!

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 herausgehen. Dies ist vor allem wichtig um die Notabschaltung durch zu viele erzeugte Nachrichten zu unterbinden. Die LazyNewsletter Klasse managed automatisch, dass nur 10 /m’s pro Sekunde verschickt werden und beugt so der Notabschaltung vor.

Die Klasse ist so umgesetzt, dass sie ohne Framework und Veränderungen am Code funktioniert. Per Aufruf lassen sich die Empfänger, der Nachrichtentext und der Betreff angeben. Ebenfalls ist eine Einstellungsmöglichkeit vorhanden,  die Nachrichten an User die gerade online sind per /p zukommen zu lassen.

Was bringt es mir, die Newsletterklasse zu verwenden?

Die Frage ist bewusst so gestellt, denn es gibt viele Faktoren die für aber auch gegen solch eine Klasse sprechen. Der größte Vorteil davon ist, dass man selbst nicht mehr viel machen muss, da ja bereits die Klasse fertig entwickelt ist und auch bei jedem funktioniert. Doch, nicht alles was glänzt ist Gold. Newsletter haben in der Userschaft von Knuddels einen sehr schlechten Ruf und werden mit negativen Erlebnissen verknüpft. Für alle, die sich die Newsletterklasse kopieren und verwenden, sollten sich darüber bewusst sein,  dass eine zu starke Nutzung der Klasse zu sehr lauter negativer Kritik eurer Besucher führen kann. Schlecht gelaunte Besucher führen im Umkehrschluß zu schlechten Bewertungen und geringer Aktivität im Channel. Denn User die von einer User App genervt werden, nutzen diese nicht mehr und bestrafen euch mit Abwesenheit und der Verwendung von /silence Channelname.

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

Wie wird die Klasse verwendet?

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

Den Originalbeitrag im Entwickler-Wiki findet ihr hier.

Ein Gedanke zu “Scriptbeispiel: LazyNewsletter Klasse

  1. Ich bin der Meinung, dass diese Klasse mit der Einführung der intelligenten Drosselungbei UPN.each überflüssig geworden ist.
    Man braucht also keine Lazy klasse mehr, um Bedenkenlos über dieses each einen newsletter zu verschicken – Knuddels drosselt selbstständig und automatisch.

    Like

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s