[7] Den temporären Highscore ausgeben

Hey there.
Cool, dass ihr wieder da seid. Ihr erinnert euch noch an den letzten Blog Eintrag oder?
Im letzten Blog Eintrag habe ich mich an die Umsetzung eines temporären Highscores gemacht.
Das Ganze hat auch super geklappt. Doof war nur, dass man den Highscore noch nicht sehen konnte.

coffeeGreen

Wie könnte man den Highscore sichtbar machen?
Was hälst du von meinem Vorschlag: Der Appbot schickt dem User der gerade eine Frage richtig beantwortet hat eine private Nachricht mit seinem Highscore? Außerdem könnte der Appbot, nachdem er den User gelobt hat, feierlich im Channel verkünden, was der neue Highscore des Users ist.

// Das Objekt in dem ich die temporären Highscores abspeichere.
var tempScore = {};

Im Objekt tempScore speichere ich den Highscore für jeden User. Das mache ich mithilfe der individuellen Id jedes Users.
Genauso wie man den Highscore eines Users verändern kann, kann man ihn auch auslesen:

// So liest man den Highscore eines Users aus.
var highscoreDesUsers = tempScore[user.getUserId()]

Zum Glück wusste ich noch aus alten Blogbeiträgen wie man mit dem Appbot eine private oder öffentliche Nachricht verschickt:

// Der Appbot gibt den Highscore ein mal privat und ein mal öffentlich aus.
function sendScore(user)
{
user.sendPrivateMessage('Dein aktueller Highscore beträgt ' + tempScore[user.getUserId()] + ' Punkte.');
appBot.sendPublicMessage(user + ' hat jetzt einen Highscore von ' + tempScore[user.getUserId()] + ' Punkten.');
}

Jetzt musste ich die Funktion eigentlich nur noch zur richtigen Zeit aufrufen.
Also genau dann wenn der User eine Frage richtig beantwortet hat und sein Highscore aktualisiert wurde:

// Hier wird bei richtiger Antwort die Funktion sendScore(user) aufgerufen.
App.onPublicMessage = function(message)
{
var messageText = message.getText();
if(messageText.indexOf(solution)>-1)
{
addTempScore(message.getAuthor(), 1);
message.getAuthor().sendPrivateMessage('Super gemacht. Du hast die Aufgabe geloest!');
appBot.sendPublicMessage('_______ ' + message.getAuthor() + ' hat die Aufgabe geloest _______');
sendScore(message.getAuthor());
}
else
{
}
};

Das wars auch schon 🙂
Aber wisst ihr was mich noch stört? Das Aussehen meiner App.
Irgendwie kommt die Highscoreausgabe noch nicht richtig zur Geltung.
Ich weiß… ihr wolltet schon vor langer Zeit, dass ich etwas dagegen mache.
Im nächsten Blogeintrag ist es endlich soweit.
Dann kümmere ich mich um die Gestaltung der Nachrichten des Appbots.

Bis dann.
Liebe Grüße, MarvinDerPraktikant.

[6] Der temporäre Highscore

Hey there.
Wie geht es dir? Gut? Hehe. Bei dem Wetter auch keine Wunder!
Ich hab ja gesagt ich werde mich mal an eine Art Highscore wagen.
Erst mal war ich total überwältigt von der Aufgabe… Aber am Ende hab ich es dann doch irgendwie geschafft.
Jetzt erzähle ich dir wie ich einen temporären Highscore in die App eingebaut habe.

download

Ein temporärer Highscore:
„Marvin was meinst du damit?“
Ein temporärer Highscore ist quasi ein Highscore der nur, wie der Name schon sagt, temporär besteht.
Also nicht für immer. Was meine ich damit genau?
Wenn ein User meinen Channel verlässt wird sein Highscore nicht mehr gespeichert. Auch wenn die App abstürzt oder neu gestartet wird ist der Highscore nicht gespeichert.

Was nützt mir das dann?
Eine gute Frage. Ich habe erst auch nicht daran geglaubt. Bis einige von euch mich überzeugt hatten.
Mit einem temporären Highscore hat jeder User die Chance mal auf Platz 1 der Rangliste zu stehen. Aber eben nur bis er den Channel verlässt.
Ich hab mir das Ganze so vorgestellt: Der temporäre Highscore ist vergleichbar mit der Rangliste bei einem Formel1 Rennen. Jeder Fahrer, egal ob er auf die gesamte Saison betrachtet gut oder schlecht ist, kann bei einem einzelnen Rennen auf Platz 1 stehen.
Selbst wenn er bisher jedes Rennen verloren hat, ist es möglich, dass er beim nächsten Rennen auf Platz 1 fährt und gewinnt.
Dann wenn das Rennen mal vorbei ist zählt nur noch die Saisonrangliste.
Die baue ich jetzt aber nicht ein.

Wie speichert man Daten temporär?
Ich habe herausgefunden, dass das sehr gut mit JavaScript Objekten geht.
In die kann man nämlich über einen Key Daten ablegen.
Was ist ein Key?
Ich stelle mir dazu immer ein Telefonbuch vor. Im Telefonbuch sind unter verschiedenen Telefonnummern Namen und Adressen abgespeichert stimmt’s? In einem Telefonbuch gibt es jede Nummer nur ein Mal. Dafür kann es aber einen Namen mehrmals geben. Allein in Berlin gibt es zum Beispiel 10 Alexander Müller. Ihr könnt euch aber sicher sein, dass jeder Alexander Müller seine eigene Telefonnummer hat.
Hier wäre jetzt die Telefonnummer der Key.

// Das hier ist das Objekt in dem wir Daten temporär speichern, das Telefonbuch also.
var tempScore = {};

Was könnte in Knuddels ein Key sein?
Man hat mir gesagt, dass in Knuddels jeder User seine eigene Id besitzt.
Also gibt es jede Id nur ein Mal.
Cool! Genau danach habe ich gesucht.

// So speichert man Daten in einem Objekt
function setUpTempScore(user)
{
tempScore[user.getUserId()] = 0;
}

Wie löscht man die Daten wieder?
Dazu hat jedes Objekt zum Glück auch seine eigene Funktion namens, ihr ahnt es schon, delete.

// So löscht man Daten aus einem Objekt
function deleteTempScore(user)
{
tempScore.delete[user.getUserId()];
}

Das war es auch schon fast. In setUpTempScore(user) erzeuge ich quasi den Telefonbucheintrag und setze als Wert eine 0.
In deleteTempScore(user) lösche ich den gesamten Telefonbucheintrag.

Wie ändert man einen Eintrag?

// So ändert man Daten in einem Objekt
function addTempScore(user, amount)
{
tempScore[user.getUserId()] = tempScore[user.getUserId()] + amount;
}

Man addiert also auf den alten Eintrag einfach eine neue Zahl. Hier ist die neue Zahl amount.
Cool oder? Jetzt muss man die Funktionen nur noch zur richtigen Zeit aufrufen.

Wenn ein User den Channel betritt,
rufe ich setUpTempScore(user) auf.
Jetzt da der User im Channel ist kriegt er auch seinen eigenen Telefonbucheintrag.

App.onUserJoined = function(user)
{
setUpTempScore(user);
};

Wenn ein User den Channel verläst,
rufe ich deleteTempScore(user) auf.
Das Rennen ist quasi vorbei. Ich brauche den Score des Users nicht mehr speichern. Also lösche ich den Eintrag einfach komplett.

App.onUserLeft = function(user)
{
deleteTempScore(user);
};

Wenn ein User eine Frage richtig beantwortet,
rufe ich addTempScore(user, amount) auf.
Der User hat eine Frage richtig beantwortet. Deswegen erhöhe ich seinen aktuellen Score.

App.onPublicMessage = function(message)
{
var messageText = message.getText();
if(messageText.indexOf(solution)>-1)
{
addTempScore(message.getAuthor(), 1);
}
else
{
}
};

Super! Das klappt 🙂
Blöd nur, dass der User seinen eigenen Highscore noch nicht sehen kann.
Aber das sollte machbar sein. Denkt ihr auch?

Also geht es im nächsten Blog um die Ausgabe des Highscores.

Bis dann.
Liebe Grüße, MarvinDerPraktikant.

Wer ist Marvin der Praktikant überhaupt?

Hey Leute.
Endlich ist es soweit. Mein Praktikum hat begonnen und ich bin jetzt rund um die Uhr für euch da.

Aber halt mal! Du fragst dich gerade bestimmt wer ich überhaupt bin?

Ich bin Marvin, 21 Jahre alt und seit dem 1. April Praktikant bei Knuddels.de.
Meine Aufgabe ist es euch beim Entwickeln eurer eigenen App im Knuddels System zu unterstützen.

Da ich eigentlich nicht aus der Entwicklerrichtung (Das sind die schlauen Köpfe die das Programmieren der Apps überhaupt möglich machen) komme, betrachte ich das ganze Apps-System zusammen mit euch aus einem ganz anderen Blickwinkel. Wir lernen ein Stück weit also gemeinsam.

Wie erreichen wir dich Marvin?

Ihr erreicht mich unter dem pseudonym MarvinDerPraktikant, auf Knuddels.
Schreibt mir doch einfach mal 🙂

Ich freue mich auf eine spannende Zeit mit euch.
Liebe Grüße, MarvinDerPraktikant.