Fragen und Antworten

Posted by: IgelchenM

Fragen und Antworten - 04.12.2014, 17:28:03

Hi zusammen, ich dachte mir ich eröffne mal einen Bereich, in dem wir Fragen und Antworten übersichtlich auflisten können damit wir nicht immer die selben Fragen stellen müssen.
Posted by: IgelchenM

Re: Fragen und Antworten - 04.12.2014, 17:29:39

Eine erste Frage hab ich auch schon, wie kann ich für die Apps eine eigene Funktion (kein Befehl!) einbinden und aufrufen?

Code:
function test(user){
 // Mach oder berechne irgendetwas...
}
Posted by: Ironist

Re: Fragen und Antworten - 04.12.2014, 17:46:11

Code:
var App = (new function(){


    this.onUserJoined = function(user)
    {
        test(user);
    }

    function test(user)
    {
        // Mach oder berechne irgendetwas...
    }

}());
Posted by: Kev777

Re: Fragen und Antworten - 05.12.2014, 05:46:52

ich steh gerade ein wenig auf'm schlauch.

und zwar geht es mir darum das ich funktionen u.s.w. die ich immer wieder in den unterschiedlichsten apps verwenden möchte in eine extra dateie auslagern will und diese dann später mit einer art ''include'' einbiden möchte. nur scheint es so das js gar kein ''include'' zu kennen scheint. oder doch, und ich find dazu nur nix?
Posted by: IgelchenM

Re: Fragen und Antworten - 05.12.2014, 06:22:29

Versuchs mal mit require(datei.js); - dann müsst's eigentlich gehen.
Posted by: Bizarrus

Re: Fragen und Antworten - 05.12.2014, 09:11:56

Du kannst derzeit nicht mit dem Filesystem arbeiten um z.B. eigene "Configfiles" zu writen.
Derzeit existiert zur die Methode require([filename]); um weitere Javascript-Files zu inkludieren.

Derzeit wird immer vom Stammverzeichniss (Relativen Path) ausgegangen, verwendest du Unterordner so musst du auch volle Pfade angeben, Beispiel:
Code:
functions
--- subdirectory
------ other.js
--- test.js
main.js


Warnung! Spoiler!

main.js
Code:
require('functions/test.js');

functions/test.js
Code:
require('functions/subdirectory/other.js');



Edit:
Ihr könnt uns auch gerne im Chat anschreiben, ich schaue nicht unbedingt alle 5 Minuten in's Forum :-D
Posted by: Gery123

Re: Fragen und Antworten - 05.12.2014, 13:01:15

Hey ho,
da es sich um keine Methode handelt und ich keinen neuen Thread aufmachen wollte frage ich hier mal.
Meines erachtens nach wäre es eventuell eine gute Idee wenn man lokale /h Texte anlegen könnte, also quasi /h's die nur aus dem Channel herraus aufrufbar sind. Dort könnte man bspw. die Spielregeln für Spieleapps oder allgemein Nutzungshinweise reinschreiben und dann an passender Stelle (zB. im Channeltopic) verlinken, áka James (privat): Willkommen im Channel Knuddelsfangen. In diesem Channel kannst du gegen andere Chatter das Spiel Knuddelsfangen spielen. Eine Anleitung findest du unter /h knuddelsfangen. " Selbstverständlich sollten die keys nicht mit denen der globalen /hs kollidieren dürfen :-)

Wie sehen denn die anderen diese Idee?

Liebe Grüße,
Chris
Posted by: Bizarrus

Re: Fragen und Antworten - 06.12.2014, 06:22:56

Gute Idee, ich kam auch schon des öfteren zum Gespräch wegen eigenen Hilfetexten um zum Beispiel das aktuelle Spiel zu "erklären".

Ich glaub aber dass dein Post in der Methoden-Wunschliste http://forum.knuddels.de/ubbthreads.php?ubb=showflat&Number=2705282 besser aufgehoben wäre :-)
Posted by: Kev777

Re: Fragen und Antworten - 08.12.2014, 19:43:25

mag mir jemand verraten wie ich verlinkungen in nachrichten vom bot anständig anzeigen lasse?

ich bekomm bei °>/d 6<° nur Link raus. :(
Posted by: Inuyasha20

Re: Fragen und Antworten - 08.12.2014, 20:41:43

°>Würfeln!|/d 6<°
Posted by: delargo

Re: Fragen und Antworten - 09.12.2014, 17:18:57

Ich weiß nicht genau wer alles Zugriff später haben soll um Apps zu erstellen, aber man kann sich ja auch problemlos mehr Knuddel von dem defaultbotuser geben lassen. Ich halt das so in der Form nicht für sehr sinnvoll.
Posted by: Ironist

Re: Fragen und Antworten - 09.12.2014, 17:48:58

Antwort auf: delargo
Ich weiß nicht genau wer alles Zugriff später haben soll um Apps zu erstellen, aber man kann sich ja auch problemlos mehr Knuddel von dem defaultbotuser geben lassen. Ich halt das so in der Form nicht für sehr sinnvoll.


Hallo delargo,

das ist richtig, weil der BotUser momentan James ist. Sobald wird den echten BotUser implementiert haben, wird das ein BotUser sein, der euch gehört… und ihr müsst ihn mit Knuddel füttern, bevor er welche auszahlen kann. :-)
Posted by: redorange

Re: Fragen und Antworten - 09.12.2014, 23:26:14

Wie vergleicht man zwei Genders oder switcht drüber?
Posted by: Bizarrus

Re: Fragen und Antworten - 09.12.2014, 23:43:02

Code:
switch(user.getGender()) {
    case Gender.Male:
        // männlich
    break;
    case Gender.Female:
        // weiblich
    break;
    case Gender.Unknown:
        // Unbekannt/Nicht angegeben
    break;
}
Posted by: redorange

Re: Fragen und Antworten - 09.12.2014, 23:53:10

Okay, so hatte ich es auch probiert. Hatte ein anderes Problem, das dafür gesorgt hat, dass besagtes Statement gar nicht erst ausgeführt wurde. Danke.
Posted by: Bizarrus

Re: Fragen und Antworten - 09.12.2014, 23:57:10

Nutze, solange noch keine Logfiles generiert werden immer ein try/catch ;-)
Posted by: DerNeuanfang

Re: Fragen und Antworten - 10.12.2014, 02:20:19

Wer hat den mal Lust übers Wochenende mit mir zu suchten und Monopoly auf die Beine zu stellen? :D
Posted by: Inuyasha20

Re: Fragen und Antworten - 10.12.2014, 08:21:41

Frage: Ich brauch aktuell eine 'sleep' Funktion. In Java ohne Probleme, scheint es hier bei JS anscheinend nicht so einfach zu sein.
Hat jemand von euch den passenden Code-Schnipsel dafür parat?

Also, beispiel: Ich starte mit /123 eine Ausgabe: "Das Spiel 123 beginnt!" und genau 10 Sekunden später folgt diese: "Und los gehts!"

Laut Google finde ich zwar Ansätze, aber keiner davon hat bisher funktioniert, daher versuche ich es mal über den bequemeren Weg...
Posted by: djchrisnet

Re: Fragen und Antworten - 10.12.2014, 08:27:15

Code:
var t1 = null;
var handleRestart = false;
t1 = setTimeout(function(){
	if(!handleRestart) {
		KnuddelsServer.getDefaultBotUser().sendPublicMessage('Los gehts');
	}
}, 15000);


du kannst die nachricht abbrechen, indem du
Code:
clearTimeout(t1);
ausführst oder
Code:
handleRestart = true;
setzt.

die 15000 sind in diesem Fall 15 Sekunden
Posted by: Enrico-nrp

Re: Fragen und Antworten - 10.12.2014, 21:38:30

Ich glaube Bugs entdeckt zu haben:

a) Der App-Entwickler wird nicht korrekt ausgelesen: Fällt auf, wenn man die App installiert und isAppDeveloper liefert auch FALSE.

b) maySendPublicMessage veröffentlicht die Nachricht trotz FALSE als Rückgabe. Könnt ihr das mal bitte prüfen?

Danke und Gruß,
Enrico

P.S.: Falls jemand eine Idee hat, ich biete mich gern als Entwickler an. Monopoly ist natürlich extrem aufwendig und rein textbasiert auch nicht ganz so optimal umsetzbar. Oder wie lassen sich grafische Sachen umsetzen?
Posted by: djchrisnet

Re: Fragen und Antworten - 11.12.2014, 04:13:41

Grafische UI kommt frühstens ab März

a) wird noch nicht aus der app.config ausgelesen, ist also noch normal

b) ist noch nicht fertig implementiert soweit ich weiss
Posted by: DerNeuanfang

Re: Fragen und Antworten - 16.12.2014, 01:01:33

Ja, Textbasiert... merke auch das ich da an meine Grenzen langsam stoße...
Posted by: Enrico-nrp

Re: Fragen und Antworten - 20.12.2014, 23:05:03

Kann ich Text oder klickbare Links über ein Bild setzen?
Posted by: Bizarrus

Re: Fragen und Antworten - 21.12.2014, 00:36:53

°>Image|Image-Hover<>|Link/Command

Bei Image-Links muss noch ein Hover angegeben werden.
Posted by: Gery123

Re: Fragen und Antworten - 21.12.2014, 01:03:33

Jemand ne Idee für ein geschütztes Leerzeichen?
Posted by: Bizarrus

Re: Fragen und Antworten - 21.12.2014, 01:14:02

Definiere "gechützt"
Posted by: Gery123

Re: Fragen und Antworten - 21.12.2014, 01:17:45

http://de.wikipedia.org/wiki/Geschütztes_Leerzeichen
Posted by: Bizarrus

Re: Fragen und Antworten - 21.12.2014, 10:25:50

Kurze Information an alle:
Sofern Fragen an Sascha (Ironist) bestehen, derzeitige Bitte von Ihm: Bitte schreibt dies hier in's Forum. Aufgrund privaten Problemen ist er in den nächsten Tagen nicht erreichbar - Sascha wird sich bei Gelegenheit dann zu Fragen und Anregungen äußern. Gerne helfe ich oder auch Chris (djchrisnet) euch weiter.
Posted by: Bizarrus

Re: Fragen und Antworten - 21.12.2014, 14:21:06

@Ironist
Darf ich z.B. jetzt bereits eine "Gesuche" im Forum "Werbung aller Art" starten wenn irgendwann im März die UI kommt? Ich würde jetzt bereits schonmal für eine weitere Idee (die du bestimmt kennen solltest) passende Kandidaten finden die in mein Schema passen :-D
Posted by: djchrisnet

Re: Fragen und Antworten - 21.12.2014, 15:26:35

@All
Die Bots reagieren aktuell auf ihre eigenen öffendlichen Nachrichten bzw. auch auf Nachrichten anderer Bots

Wenn das nicht gewünscht ist, kann man folgendes nutzen:

Auf keine Bots reagieren:
Code:
this.onPublicMessage = function(msg) {
	if(msg.getAuthor().getUserType() != UserType.Human) {
		return false;
	}
	
	//do Rest
}


Nicht auf den eigenen Bot reagieren
Code:
this.onPublicMessage = function(msg) {
	if(msg.getAuthor().equals(KnuddelsServer.getDefaultBotUser())) {
		return false;
	}
	
	//do Rest
}
Posted by: redorange

Re: Fragen und Antworten - 21.12.2014, 18:26:50

Antwort auf: Gery123
Jemand ne Idee für ein geschütztes Leerzeichen?

Wie in anderen Programmiersprachen auch kann man Unicode-Escapesequenzen nutzen. Das wäre in diesem Fall \u00A0.
Posted by: Enrico-nrp

Re: Fragen und Antworten - 21.12.2014, 21:32:54

Nur zur Info: Es scheint, dass die AppBots keine Zeilenumbrüche mit # erzeugen.

Getestet im Channel /norbyte mit /kncode. Der Bot antwortet mit dem Parameter als private Nachricht. Ich nutze dies, um KCode zu testen. Wenn ich jedoch # schicke, erfolgt kein Zeilenumbruch.

Die Lösung hatte Peeper2707: Bei mir klappt das mit °#° :D
Noch als Hinweis: Der so erzeugte Zeilenumbruch ist dann nicht eingerückt, dafür muss man dann zusätzlich °%x° zur Einrückung um x Prozent nutzen.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 22.12.2014, 10:19:45

Wenn ich bei der Eingabe von /apps auf Botuser hinzufügen klicke, erscheint der entsprechende Befehl ja in der Eingabezeile mit vorselektiertem "NICK".
Kann mir jemand sagen, wie der KCode hierfür ist und es dann in den Übersicht-Thread posten? Danke im Voraus
Posted by: Enrico-nrp

Re: Fragen und Antworten - 22.12.2014, 10:36:53

Antwort auf: Dreamboy-1996 <3
Wenn ich bei der Eingabe von /apps auf Botuser hinzufügen klicke, erscheint der entsprechende Befehl ja in der Eingabezeile mit vorselektiertem "NICK".
Kann mir jemand sagen, wie der KCode hierfür ist und es dann in den Übersicht-Thread posten? Danke im Voraus


In den Befehlen steht /apps bindBotUser als Befehl eigentlich drin:

Code:
/apps bindBotUser knuddelsDEV.<ID>.<APP> NICK


wobei <ID> deine ID bei Knuddels (analog FTP-Login-Nutzer) und <APP> der Ordner deiner App ist.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 22.12.2014, 11:48:03

Ich meinte eher, wie man es in seiner App realisiert, dass man einen Text in die Zeile schreibt. Sorry, wenn ich mich unverständlich ausgedrückt habe.
Posted by: Gery123

Re: Fragen und Antworten - 22.12.2014, 11:53:26

Was du glaube ich eigentlich hören wolltest ist "/tf-overridesb TEXT" wobei der vorselektierte SubString in TEXT in eckige Klammern muss. (zB. °>Gib uns Feedback!|/tf-overridesb /m MeinBot:[TEXT]<°).

Zu beachten: Mit /tf-overridesb wird der gesamte Text ersetzt, wenn du etwas ergänzen möchtest an das voreingetippte, dann benutze /autotype TEXT (aber ohne Vorselektion).

Chris


EDIT: Da schriebst du wohl während ich am antworten war :P
Posted by: Enrico-nrp

Re: Fragen und Antworten - 22.12.2014, 17:42:58

Ich weiß nicht, inwiefern das JavaScript interpretiert wird (Rhino?), aber seid vorsichtig beim Vergleich von Zahlen:

Ich habe einem Objekt eine ID als Zahl zugewiesen und bekomme diese Zahl beim Aufruf meines Commands mit. Logisch, dann ist das natürlich ein String. Nichtsdestotrotz sollte 1 == '1' immer true sein, war es jedoch in meinem Fall nicht. Wenn ihr also Zahlen prüfen müsst, dann so (das klappt dann auch mit Knuddels):

Code:
zahl == parseInt(stringZahl)


Seid auch vorsichtig beim Vergleich von Nutzern, auch hier ist es nicht korrekt, mit == zu prüfen, ob der Nutzer dem zuvor gespeichertem Nutzer aus einem vorherigem Request entspricht, da die Objekte anscheinend immer neu erzeugt werden. Aber hier hat Knuddels ja mitgedacht und User.equals(User) eingeführt. Unbedingt dies nutzen!
Posted by: Bizarrus

Re: Fragen und Antworten - 22.12.2014, 21:19:19

Serverseitig wird Rhino verwendet, richtig.
Java kennt bei Strings kein == als Vergleichsoperator, deswegen gibt es ja die Methode equals()
Posted by: redorange

Re: Fragen und Antworten - 23.12.2014, 00:00:55

Antwort auf: Bizarrus
Java kennt bei Strings kein == als Vergleichsoperator, deswegen gibt es ja die Methode equals()

In welcher Sprache der JavaScript-Interpreter geschrieben wurde, sollte doch egal sein, solange er sich an die Spezifikation hält?

Wenn ich das richtig verstanden habe, ging es darum, dass man User-Objekte nicht über == vergleichen kann. Strings sollte man doch über == vergleichen können, wir sind hier ja schließlich noch immer in JavaScript?
Posted by: IgelchenM

Re: Fragen und Antworten - 23.12.2014, 07:03:47

Guten Morgen Kollegen, ich hätte ne Frage. Wie binde ich nun genau ein Bild ein? Irgendwie werd' ich aus der Dokumentation und den Post's im Forum nicht ganz schlau... ?-)
Posted by: Bizarrus

Re: Fragen und Antworten - 23.12.2014, 07:14:11

Code:
var bot		= KnuddelsServer.getDefaultBotUser();
var image	= KnuddelsServer.getFullImagePath('test.png');
bot.sendPublicMessage('Das Bild: °>' + image + '<°');


test.png = /ftp/AppName/images/test.png
Posted by: Enrico-nrp

Re: Fragen und Antworten - 23.12.2014, 09:38:21

Antwort auf: IgelchenM
Guten Morgen Kollegen, ich hätte ne Frage. Wie binde ich nun genau ein Bild ein? Irgendwie werd' ich aus der Dokumentation und den Post's im Forum nicht ganz schlau... ?-)


Bild von Knuddels (vordefinierte):
Code:
°>PFAD <°
(PFAD zB schaf.gif)

Bild aus dem Ordner images innerhalb deines hochgeladenen App-Ordners:
Code:
var path = KnuddelsServer.getFullImagePath(PFAD);
var text = '°>' + path + '<°';

PFAD ist hierbei eine Datei im Ordner images oder ein Pfad auf einen Unterordner, der mit / zu trennen ist.

Bild von http://apps1.knuddels.biz/kimg:
Code:
var path = KnuddelsServer.getFullSystemImagePath(PFAD);
var text = '°>' + path + '<°';

PFAD ist auch hier relativ zum kimg Ordner anzugeben, also zB smileys/bla.gif

Wenn du eine der letzten beiden Methoden nutzt, dann musst du nach jedem Neuupload eines Bildes die App reloaden und /clearimagecache nutzen.

Und speichere deine JS Dateien als UTF8 ab. Den Tipp brauchte ich auch von J, sonst klappt es nicht.
Posted by: Enrico-nrp

Re: Fragen und Antworten - 23.12.2014, 15:21:24

Ich hab schon wieder ein Problem... Ich möchte gern Bilder in einer Tabelle anzeigen, pro Zelle jedoch teilweise 2 Bilder (bg.gif und fg.gif) die übereinander liegen. Beide sind 29 Pixel breit. Die Tabelle soll mittig zentriert sein.

Meine Idee war, gar nicht erst mit einer Tabelle zu arbeiten und die Bilder übereinander zu schieben, allerdings entsteht dann ein ungewollter Leerraum: [ ] soll bg.gif darstellen und X fg.gif. wenn ich nun mit mx_-29 Pixel arbeite, passiert folgendes:

KCode:
Code:
°>bg.gif<°°>fg...mx_-29.gif<°°>bg.gif<°


Resultat:
Code:
[ X ]     [    ] (Leerraum)


Dann hatte ich versucht mit einer Tabelle zu arbeiten, aber die Tabelle zeigt fg.gif innerhalb der Zelle nicht an, da anscheinend die Breite außerhalb des Anzeigebereichs liegt, auch wenn das Bild nach links geschoben wird. Wenn ich die Spaltenbreite auf 58 Pixel ändere, geht es wieder, aber dadurch entsteht wieder der Leerraum.

Als 3. Idee kam mir dann, alle fg.gif ans Ende der Zeile einzufügen und dann um X * 29 Pixel nach links zu verschieben an die korrekte Position. Das klappt aus 2 Gründen nicht. Das Bild wird nicht gefunden (da ich die URL des Bildes dynamisch ändere) und die zentrale Ausrichtung stimmt dann auch nicht mehr.

Es soll eine Art Spielfeld werden. Ich könnte den Hintergrund eines Feldes auch als Hintergrund der Zelle definieren, aber der KCode fehlt mir und die Erklärung von Birarrus reicht nicht aus. Es soll iwie mit bgimg;PFAD möglich sein.
Posted by: Bizarrus

Re: Fragen und Antworten - 23.12.2014, 16:17:56

Ich würde mich generell nicht auf Tabellen fixieren, zumal die möglicherweise mobil oder unter dem HTMLChat nicht oder nur eingeschränkt genutzt werden können.

Du könntest einen Container mit background setzen, hierzu müsst ich aber auch erstmal selbst den KCode raussuchen (guter Anhaltspunkt wäre vllt. /rose,...)
Posted by: Enrico-nrp

Re: Fragen und Antworten - 24.12.2014, 14:58:06

Um das hier auch nochmal festzuhalten: Mein Problem ist dank J gelöst.

Bilder lassen sich am besten übereinander legen, wenn man den Bildparameter "w_0" nutzt. Ich dachte zunächst, dass dadurch das Bild nicht sichtbar ist, aber es heißt nur, reserviere x Pixel für dieses Bild. Es wird jedoch weiterhin in voller Breite gerendert. Das nächste Bild oder der Text würde dann ab 0 Pixel zur aktuellen Position beginnen, also direkt über dem davor. :-)
Posted by: Kev777

Re: Fragen und Antworten - 25.12.2014, 12:41:52

poste erstmal hier, da ich mir nicht sicher bin ob ich was falsche mache oder es ein bug ist:

ich habe 2 apps im channel laufen.

App B checkt im event onPublicMessage von welchen Usertyp eine öffentliche Nachricht ist. klappt soweit auch.

Aber wenn App A eine öffi nachricht postet liefert App B den Fehler: Cannot call method "getUserType"

mach ich was falsch oder woran kann das liegen? kann das jemand ggf. bei sich reproduzieren?

Posted by: Bizarrus

Re: Fragen und Antworten - 25.12.2014, 19:38:20

Beispiel-Code? (bitte im [code]-Tag oder als Pastebin)
Posted by: DaReal92Garfield

Re: Fragen und Antworten - 26.12.2014, 19:04:58

Ich versuche Zeilenumbrüche oder Tabellen zu erstellen.
Zeilenumbrüche habe ich so versucht:
Code:
botUser.sendPrivateMessage("Dein°#°Spiel°#°wurde°#°abgebrochen.", user);

Es wird nur "Dein" geschrieben.

Für tabellen habe ich testweise aus dem anderen Thread kopiert.
Code:

botUser.sendPrivateMessage("°>{table||100|100|100}<°°>{tc}<°1°>{tc}<°2°>{tc}<°3°>{tr}<°°>{tc}<°4°>{tc}<°5°>{tc}<°6°>{endtable}<°", user);


Erzeugt eine leere private Nachricht.
Posted by: Bizarrus

Re: Fragen und Antworten - 26.12.2014, 21:47:00

Das ganze auf UTF-8?

Mir ist nach dem update mit den Zeilenumbrüchen (°#°) aufgefallen dass diese nicht mit jedem Clienten funktioniert.
Dementsprechend habe ich bei mir die deprecated noch eingebaut. Es wird für ein Zeilenumbruch also "°#°#" bei mir genutzt.
Posted by: IgelchenM

Re: Fragen und Antworten - 26.12.2014, 22:43:37

Hi, zwei Fragen...

Ist es möglich Nachrichten, die bereits vom DefaultBotUser abgesendet wurden, im Nachhinein noch zu ändern bzw. zu verändern? Wenn ja wie?

Wie genau speichere ich Daten in der App Persistence?
Posted by: Bizarrus

Re: Fragen und Antworten - 26.12.2014, 23:43:33

Zitat:
Ist es möglich Nachrichten, die bereits vom DefaultBotUser abgesendet wurden, im Nachhinein noch zu ändern bzw. zu verändern? Wenn ja wie?


Ich denke nicht. Das ganze wird ja direkt an den Clienten versendet. Du kannst ja schlecht sagen "lösch mal JPanel XYZ".

Zitat:
Wie genau speichere ich Daten in der App Persistence?

Code:
var db = KnuddelsServer.getPersistence();


Und dann halt wie beim user mit getter/setter
Posted by: Enrico-nrp

Re: Fragen und Antworten - 27.12.2014, 00:56:27

Antwort auf: IgelchenM
Ist es möglich Nachrichten, die bereits vom DefaultBotUser abgesendet wurden, im Nachhinein noch zu ändern bzw. zu verändern? Wenn ja wie?

Ist nicht möglich, darum wünschen wir uns alle sehnlichst die grafische Unterstützung.

Antwort auf: IgelchenM
Wie genau speichere ich Daten in der App Persistence?

Schau dir mal die Persistence-Klasse an, die stellt alle Methoden bereit.
Posted by: DaReal92Garfield

Re: Fragen und Antworten - 27.12.2014, 16:21:34

Gibt es die Möglichkeit Klassen in seperaten Dateien abzulegen und einzubinden (wie mit nem script tag in HTML oder imports in andren sprachen)?
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 27.12.2014, 16:46:40

Siehe hier:
Antwort auf: Bizarrus
Du kannst derzeit nicht mit dem Filesystem arbeiten um z.B. eigene "Configfiles" zu writen.
Derzeit existiert zur die Methode require([filename]); um weitere Javascript-Files zu inkludieren.

Derzeit wird immer vom Stammverzeichniss (Relativen Path) ausgegangen, verwendest du Unterordner so musst du auch volle Pfade angeben, Beispiel:
Code:
functions
--- subdirectory
------ other.js
--- test.js
main.js


Warnung! Spoiler!

main.js
Code:
require('functions/test.js');

functions/test.js
Code:
require('functions/subdirectory/other.js');



Edit:
Ihr könnt uns auch gerne im Chat anschreiben, ich schaue nicht unbedingt alle 5 Minuten in's Forum :-D
Posted by: IgelchenM

Re: Fragen und Antworten - 28.12.2014, 19:43:58

Hi zusammen, ich mal wieder %-)

Ich kann ja mittels user.getProfileLink() einen Link erzeugen, der dann einen Userlink darstellt...

geht das auch, wenn ich z.B. die Userid in nem Array gepackt habe? Wenn ja wie?

weil z.B. Aktiverspieler[0].getProfileLink(); klappt nicht :-|

Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 28.12.2014, 20:00:56

Wenn du die UserId im Array hast:
Code:

    var user;
    if (KnuddelsServer.canAccessUser(Aktiverspieler[0])) [
        user = KnuddelsServer.getUser(Aktiverspieler[0]);
    }
    
    if (user)
        KnuddelsServer.getDefaultBotUser().sendPublicMessage(user.getProfileLink());



Müsste eigentlich so funktionieren.
Posted by: Kev777

Re: Fragen und Antworten - 28.12.2014, 20:02:21

.getUserId ist eine eigenschaft der Klasse user. von der eigenschaft kannst kein .getProfileLink machen. und wenn du die id im array speicherst ist es eh nur noch ein num denk ich mal?

du musst also erst mit KnuddelsServer.getUser das userobjekt holen und kannst von diesem dann .getProfileLink holen.

KnuddelsServer.getUser(Aktiverspieler[0]).getProfileLink() sollte den link zum profil liefern.
Posted by: IgelchenM

Re: Fragen und Antworten - 28.12.2014, 20:13:56

Antwort auf: Kev777
.getUserId ist eine eigenschaft der Klasse user. von der eigenschaft kannst kein .getProfileLink machen. und wenn du die id im array speicherst ist es eh nur noch ein num denk ich mal?

du musst also erst mit KnuddelsServer.getUser das userobjekt holen und kannst von diesem dann .getProfileLink holen.

KnuddelsServer.getUser(Aktiverspieler[0]).getProfileLink() sollte den link zum profil liefern.


Das versuch ich gleich mal! Danke schonmal :-)
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 31.12.2014, 00:09:16

Wird es in Zukunft möglich sein, einen Bot für mehrere Apps zu definieren?

Und wenn wir schon dabei sind, könnte man in dem /mychannel-Konfigurationsfenster eventuell ein Feld implementieren, in welchem man Nicks eingeben kann, welche Rechte auf die /apps Funktion haben? Hintergrund ist, dass ich einen Channel ungern löschen und auf meinen Nick hier übertragen möchte.
Posted by: Bizarrus

Re: Fragen und Antworten - 31.12.2014, 03:33:09

Zitat:
Wird es in Zukunft möglich sein, einen Bot für mehrere Apps zu definieren?

Jap.

Zitat:
Und wenn wir schon dabei sind, könnte man in dem /mychannel-Konfigurationsfenster eventuell ein Feld implementieren, in welchem man Nicks eingeben kann, welche Rechte auf die /apps Funktion haben?

Das wäre genial! So kann man auch mal einem vertrauensvollen MCM die Rechte geben eine App neuzustarten.
Andernfalls wäre die execute-Command Methode für den App-Bot cool, natürlich müsste der Bot dann auch die Rechte für /apps haben
Posted by: Kev777

Re: Fragen und Antworten - 01.01.2015, 06:07:00

Wünsche ein gesundes neues allerseits und hoffe das ihr gut reingerutscht seid. =)

Vielleicht kann mit jemand helfen.

"Der App-Bot kann nur im Channel Kevchen erneut gebunden werden."

Was hat es damit auf sich und was muss ich tun um den Bot in einem anderen meiner Channel binden zu können?
Posted by: rmpg

Re: Fragen und Antworten - 02.01.2015, 13:53:56

Hey kev...

Frohes neues erstmal. ..

Das selbe problem hatte ich auch als ich meine app deinstalliert habe ohne den bot zu entfernen... ironist meinte dann ich brauche einen neuen bot... also denke ich mal das du den bot vergessen kannst...

Grus ritschY

Ps: per handy geschrieben ;)
Posted by: Kev777

Re: Fragen und Antworten - 02.01.2015, 18:37:59

Hm, ich hab aber vorher den bot von der app getrennt gehabt. ?-)
Posted by: Bizarrus

Re: Fragen und Antworten - 02.01.2015, 21:56:21

Ich kann derzeit nicht weiter machen.
Auf dem produktiven System ist der App-Server offline und auf dem Testserver hab ich keine Rechte mehr und bin Family (MyChannel existiert zwar, aber das Team ist weg und /fa bzw. /apps kann ich dort nicht nutzen).
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 02.01.2015, 22:15:38

Das Team ist wohl an den Stammi-Status gebunden. Auch ich bin auf dem Testserver Family geworden und habe keine Rechte mehr für die /apps-Commands. Andere Teammitglieder sind noch Stammi und haben das Team noch.

Dementsprechend wäre es super, wenn man das beheben könnte :-)
Posted by: Ironist

Re: Fragen und Antworten - 03.01.2015, 12:10:41

Antwort auf: Dreamboy-1996 <3
Das Team ist wohl an den Stammi-Status gebunden. Auch ich bin auf dem Testserver Family geworden und habe keine Rechte mehr für die /apps-Commands. Andere Teammitglieder sind noch Stammi und haben das Team noch.

Dementsprechend wäre es super, wenn man das beheben könnte :-)


Ist behoben. :-)
Posted by: rmpg

Re: Fragen und Antworten - 06.01.2015, 14:07:11

Mal ein paar Fragen:

Was genau muss alles erfüllt werden um in einem Channel auf dem Live-Server Apps installieren zu können?

Kann bzw. darf ich Apps fur andere User schreiben, welche nicht in der Beta-Entwicklung dabei sind?

Muss der Inhaber des Bots auch der Inhaber des Channels sein in welchem der Bot läuft?

Ich hoffe auf schnelle Antwort ;)

Grus Ritschy

Posted by: djchrisnet

Re: Fragen und Antworten - 08.01.2015, 13:50:13

Wie ich gestern durch Zufall herrausfand, können Apps die MyChannelMacros überschreiben.

Das bringt euch in die Lage, die Macros als FallBack zu nutzen wenn der AppServer mal wieder tot ist oder eure app grade deaktiviert/restartet.

Beispiel

Makro:
/status = AppServer Kaputt

App-Befehl:
Bot.public('AppServer OK');
Posted by: rmpg

Re: Fragen und Antworten - 08.01.2015, 21:34:58

Hat schon jemand herrausgefunden wie man seine eigene /h generieren kann?
Posted by: Bizarrus

Re: Fragen und Antworten - 08.01.2015, 21:52:53

Gar nicht. Du kannst höchstens einen eigenen Befehl definieren und eine Hilfe via private raushauen.
Posted by: Bizarrus

Re: Fragen und Antworten - 14.01.2015, 14:09:46

Ich weiß nicht ob euch das auch schon aufgefallen ist, Chris sprach mich schon gestern drauf an und heute habe ich das selbe Problem:

Zitat:
ERROR: Wrapped com.knuddels.apps.persistence.PersistenceValueTooLargeException: Persistence value too long: 103453 chars. Allowed length: 100.0 chars. (knuddelsDEV.30558139.lotto@v0: framework/core/Database.js#96)


Wurde was an der Limitierung der Persistenz geändert?
Wer kommt bitteschön bei Objekten die sicherlich in JSON abgespeichert werden mit einer 100-Char-Length aus?
Posted by: Kev777

Re: Fragen und Antworten - 14.01.2015, 14:34:36

hat sich nix geändert, war schon immer so. hatte auch probleme mit 100 char auszukommen. >.<

finde ich auch ein wenig unnötig. wenn ich 98327498723598798235 zeichen speichern will kann ich das immernoch nur hab ich nu die arbeit für je 100 char einen neuen key zu erzeugen.

solche begrenzungen bringens irgendwie net. ^^ limit für den gesamtspeicher find ich okay und sinnvoll irgendwo, aber wieviel ich in einem key speicher möchte ich doch selber entscheiden, eigentlich xDDD
Posted by: Bizarrus

Re: Fragen und Antworten - 14.01.2015, 15:37:40

Finde ich auch :-D

Zumal das Problem schon viel früher auftreten hätte müssen, schon alleine bei Chatlotto - Das Problem kam aber erst gestern und ich glaub kaum das des ganze zuvor weniger als 100 Chars waren, insbesondere wenn das ganze ja als JSON gestoraged wird.

Wo hat man da die Freiheit?
Man muss halt bei komplexeren Spielen (insbesondere bei Knuddeltransaktionen) diverse Informationen speichern, einfach um irgendwelche Probleme im nachhinein kontrollieren zu können.

Nutzer kommen an und sagen "ich hab Knuddel eingezahlt, geht aber nicht..." dann muss man das ganze erstmal checken (Beispielsweise im Falle von Lotto):
- Welche Ticket-ID hat das Los was angeblich bezahlt wurde
- Wurde das Los wirklich bezahlt?
- Wieviel wurde bezahlt, gab es eine überschusszahlung sodass dem Nutzer den Restwert wieder zurücküberwiesen wurde

All solche Informationen müssen nun mal gespeichert werden, denn sonst wird wieder gemeckert und man steht dumm da.
Posted by: Ironist

Re: Fragen und Antworten - 14.01.2015, 16:03:14

Antwort auf: Bizarrus
Ich weiß nicht ob euch das auch schon aufgefallen ist, Chris sprach mich schon gestern drauf an und heute habe ich das selbe Problem:

Zitat:
ERROR: Wrapped com.knuddels.apps.persistence.PersistenceValueTooLargeException: Persistence value too long: 103453 chars. Allowed length: 100.0 chars. (knuddelsDEV.30558139.lotto@v0: framework/core/Database.js#96)


Wurde was an der Limitierung der Persistenz geändert?
Wer kommt bitteschön bei Objekten die sicherlich in JSON abgespeichert werden mit einer 100-Char-Length aus?


Ahoi,

die Fehlermeldung ist inkorrekt, der Wert war jedoch korrekt: Value darf maximal (1024 * 100) Zeichen lang sein.

Habe die Fehlermeldung nun angepasst.

Danke :-)
Posted by: Kev777

Re: Fragen und Antworten - 14.01.2015, 17:44:39

sorry wenn die frage nu blöd is aber was definiert nu (1024 * 100) ? ôo
Posted by: Ironist

Re: Fragen und Antworten - 14.01.2015, 17:46:56

Antwort auf: Kev777
sorry wenn die frage nu blöd is aber was definiert nu (1024 * 100) ? ôo


100 Kilobyte
Posted by: IgelchenM

Re: Fragen und Antworten - 17.01.2015, 04:12:10

Hey Leute,
ich hätte mal wieder ne Frage...

Wisst ihr, wie man in einer sendPostMessage() Funktion einen Absatz im Text macht? Ich hab nun \n, °#° , # als auch \°\#\° durchprobiert aber nichts funktioniert...





Posted by: djchrisnet

Re: Fragen und Antworten - 17.01.2015, 13:37:50

da funktioniert bislang nur _ für fett, ich gehe da von einen bug aus
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 18.01.2015, 00:56:19

Der Server gibt bei Aufruf der user.getProfileLink() den Link für User mit dem alten Appletdesign zurück (Rechtsklick Profil etc.). Ist es ohne großes replacen möglich, das neue Format (Profil = Linksklick usw.) zu erhalten?
Posted by: Tjeri

Re: Fragen und Antworten - 18.01.2015, 12:08:31

°>NICK|/w NICK|/m NICK<° Je nachdem was du bei Rechtsklick haben willst ^^
Posted by: IgelchenM

Re: Fragen und Antworten - 18.01.2015, 16:47:28

Antwort auf: Tjeri
°>NICK|/w NICK|/m NICK<° Je nachdem was du bei Rechtsklick haben willst ^^


Die Version kann aber zu Probleme führen, wenn der Nickname Sonderzeichen (<,>, etc.) hat... Und genau aus diesem Grund gibt es ja die Funktion .getProfileLink();

Eventuell wär's sinnvoll die Funktion so anzupassen, dass sie automatisch die Einstellung des Users abfrägt und dementsprechend die Verlinkung durchführt :-)
Posted by: djchrisnet

Re: Fragen und Antworten - 18.01.2015, 16:51:46

des users der verlinkt werden soll? bringt gar nichts. sobald du eine verlinkung öffentlich postest, kannst du nie garantieren, dass es für alle passt.

Ich würde einfach warten bis das neue AppletDesign als Standard ausgeliefert wird und dann diese funktion umstellen.
Posted by: rmpg

Re: Fragen und Antworten - 20.01.2015, 08:55:24

Ich hab momentan folgendes Problem:

Sobald ich eine Datei mit require("datei.js") einbinde, spielt der KCode verückt!

Aus
Code:
°O°°>_hBLACKLIST|/blacklist<°°r°  Noch nicht verfügbar!

wird
Code:
hBLACKLIST|/blacklist<nicht verf


Die Datei müsste eigentlich im UTF-8 Format sein. Leider hab ich keine Möglichkeit bzw. kein Plan wie ich das auch überprüfe, da ich glaube das es an einem falschem Format liegt (weil er beim - ü - den Text abbricht)

Ich hoffe da kann mir wer helfen...

Gruß Ritschy
Posted by: Tjeri

Re: Fragen und Antworten - 20.01.2015, 12:04:48

Es kommt stark drauf an welches Programm du nutzt zum Bearbeite.
Bei Notepad++ gibts im Menü einen Punkt Kodierung, wo man auf UTF-8 umstellen kann. Dann nur noch speichern und es tut.
Posted by: Bizarrus

Re: Fragen und Antworten - 20.01.2015, 18:31:35

Das liegt definitiv an deinen Projekteinstellungen in eclipse - Stell es dort auf UTF-8 um!
Posted by: rmpg

Re: Fragen und Antworten - 21.01.2015, 18:27:40

Ich nutze Notepad++ und habe dort auch auf UTF-8 gestellt...

Ich umgehe das einfach indem ich eine Datei nehme die 100% UTF-8 ist und kopiere die einfach. Funktioniert ;)

Aber danke für die Hilfe...
Posted by: rmpg

Re: Fragen und Antworten - 21.01.2015, 22:42:57

Php Code:
this.SpielAbbrechen = function (GRUND) {
  DATENBANK["SPIELE"][AKTUELLESSPIEL].BEENDET = ZeitAnzeigen();
  DATENBANK["SPIELE"][AKTUELLESSPIEL].BEENDIGUNGSGRUND = GRUND;
  this.save();
  BOT.sendPublicMessage("°#°#°#°#	 " + PREFIX + "  Das Spiel wurde abgebrochen! Die Einsätze wurden wieder gutgeschrieben! Grund:   _" + GRUND + "_");
  for (var SPIELERID in DATENBANK["SPIELE"][AKTUELLESSPIEL].SPIELER) {
	KNUDDELSBANK.plus(SPIELERID, DATENBANK["SPIELE"][AKTUELLESSPIEL].SPIELER[SPIELERID].EINSATZ);
	// folgende Zeile führt zum Absturz :D
	BOT.sendPrivateMessage("Dir wurde dein Einsatz von _ " + DATENBANK["SPIELE"][AKTUELLESSPIEL].SPIELER[SPIELERID].EINSATZ + " _ Knuddels wieder gutgeschrieben.", KnuddelsServer.getUser(SPIELERID));
  }
  AKTUELLESSPIEL = 0;
}; 


In meiner onPrepareShutdown-Methode wird das aktuelle Spiel abgebrochen und die eingezahlten Knuddels wieder gutgeschrieben. Das funktioniert auch sowieit ganz gut. Möchte ich jetzt jedoch allen Spielern eine private Nachricht schicken, kackt der App-Server ab.

Klammere ich die BOT.sendPrivateMessage aus, funktioniert alles. Mach ich was falsch oder schaft es der App-Server einfach nicht so schnell mehrere Nachrichten zu schicken bevor die App geschlossen wird ???

Nebenbei .. die Variablen sind alle richtig. Es hängt wirklich nur an den privaten Nachrichten...
Posted by: djchrisnet

Re: Fragen und Antworten - 21.01.2015, 23:38:23

Das Problem ist vermutlich

for (var SPIELERID in DATENBANK["SPIELE"][AKTUELLESSPIEL].SPIELER)

ich gehe mal davon aus, dass dies ein array ist. durch mögliche prototype funktionen wie length oder eigenen kommt es dabei immer wieder zu fehlern.

so wird SPIELERID im durchlauf folgende werte haben.
- 123
- 456
- length
etc

schau dir mal die funktionen im Framework unter tools an, dort haben wir ein für array und object hinterlegt

Posted by: Bizarrus

Re: Fragen und Antworten - 22.01.2015, 15:44:14

Code:

BOT.sendPrivateMessage("Message", KnuddelsServer.getUser(SPIELERID));



Ich denke dass hier die getUser das Problem ist. Schonmal reproduziert wenn der zweite Parameter folgendes enthält?

Code:

BOT.sendPrivateMessage("Message", undefined);
BOT.sendPrivateMessage("Message", null);

Posted by: IgelchenM

Re: Fragen und Antworten - 29.01.2015, 07:19:11

Kurze Frage...

Wie sind denn die Zeichenlimits für Botnachrichten... Also sendPrivateMessage(); sendPublicMessage(); und sendPostMessage(); ?
Posted by: djchrisnet

Re: Fragen und Antworten - 29.01.2015, 14:57:06

Ich bin der Meinung, dass es bisher keine Gibt.

Weder sind welche dokumentiert noch machen diese auch viel sinn, da auch eine private Nachricht aus 100x mehr kcode bestehen kann als es für normale user je nötig war.
Posted by: Enrico-nrp

Re: Fragen und Antworten - 11.02.2015, 07:27:35

Kann ich eigentlich Audio Dateien abspielen und auch wieder stoppen oder laufen diese immer bis zum Ende? Und werden 2 Dateien parallel abgespielt oder überlagert eine Datei die andere?
Posted by: Bizarrus

Re: Fragen und Antworten - 11.02.2015, 07:29:07

/playsound $ID:$SOUND
/playsound 1:ateam.mp

°>$FILE<°
°>ateam.mp<°

Alle Dateien sind WAV-Soundfiles mit der Extension .mp
Posted by: Enrico-nrp

Re: Fragen und Antworten - 11.02.2015, 07:49:48

Danke erstmal dafür, aber gibt es auch ne Möglichkeit, ein Lied wieder anzuhalten? So wie bei diesem Smiley Feature für den DJ?

/stopsound ID oder so? ^^
Posted by: Bizarrus

Re: Fragen und Antworten - 11.02.2015, 07:58:57

Das kann ich dir leider nicht sagen. /playsound wird z.B. beim Tageslogin verwendet
Posted by: djchrisnet

Re: Fragen und Antworten - 11.02.2015, 09:32:27

beim VK Feature wird das abspielen des sounds während des einrichtens mit /vk musicStop beendet. ob das ein packet oder ein kcode ist, weiss ich aber nicht genau
Posted by: Enrico-nrp

Re: Fragen und Antworten - 11.02.2015, 21:07:50

Dank eines Tipps von Sascha hab ich es nun selbst herausgefunden, dokumentiere ich auch gleich beim K-Code:

°>FILE.mp<° - spielt FILE.mp vollständig ab
°>FILE...loop_X.mp<° - spielt die ersten X Sekunden von FILE.mp ab
°>FILE...loop_0.mp<° - beendet die Wiedergabe sofort

Der Trick beim Beenden ist: Es kann nur eine Datei abgespielt werden. Sobald man versucht, eine Datei nochmal abzuspielen, wird die alte Wiedergabe sofort beendet. Und wenn man eben 0 Sekunden von der neuen abspielt, ist eben gleich vorbei.
Posted by: Kev777

Re: Fragen und Antworten - 11.02.2015, 21:10:33

Antwort auf: Enrico-nrp
Dank eines Tipps von Sascha hab ich es nun selbst herausgefunden, dokumentiere ich auch gleich beim K-Code:

°>FILE.mp<° - spielt FILE.mp vollständig ab
°>FILE...loop_X.mp<° - spielt die ersten X Sekunden von FILE.mp ab
°>FILE...loop_0.mp<° - beendet die Wiedergabe sofort

Der Trick beim Beenden ist: Es kann nur eine Datei abgespielt werden. Sobald man versucht, eine Datei nochmal abzuspielen, wird die alte Wiedergabe sofort beendet. Und wenn man eben 0 Sekunden von der neuen abspielt, ist eben gleich vorbei.


Hm, also entweder versteh ich da was falsch oder es liegt dann ein bug vor. Bei mir werden verschiedene sounds überlagender abgespielt.
Posted by: Enrico-nrp

Re: Fragen und Antworten - 11.02.2015, 21:28:03

Antwort auf: Kev777
Antwort auf: Enrico-nrp
Dank eines Tipps von Sascha hab ich es nun selbst herausgefunden, dokumentiere ich auch gleich beim K-Code:

°>FILE.mp<° - spielt FILE.mp vollständig ab
°>FILE...loop_X.mp<° - spielt die ersten X Sekunden von FILE.mp ab
°>FILE...loop_0.mp<° - beendet die Wiedergabe sofort

Der Trick beim Beenden ist: Es kann nur eine Datei abgespielt werden. Sobald man versucht, eine Datei nochmal abzuspielen, wird die alte Wiedergabe sofort beendet. Und wenn man eben 0 Sekunden von der neuen abspielt, ist eben gleich vorbei.


Hm, also entweder versteh ich da was falsch oder es liegt dann ein bug vor. Bei mir werden verschiedene sounds überlagender abgespielt.


Du hast recht. Fast alles falsch, was ich geschrieben habe. :-(

Also, man kann 2 verschiedene Sounds parallel abspielen, wenn man jedoch versucht, den gleichen nochmal abzuspielen, wird der erste beendet und anschließend neu gestartet. Korrekt ist übrigens Folgendes:

°>FILE.mp<° - spielt FILE.mp vollständig ab
°>FILE...loop_X.mp<° - spielt die ersten X Sekunden von FILE.mp ab
°>FILE...stop.mp<° - beendet die Wiedergabe von FILE.mp sofort
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 11.02.2015, 22:17:03

Gibt es eine Möglichkeit, diese nervigen "Neue Chatter für dich"- und "Knuddels vermisst dich"-EMails der BotNicks zu deaktivieren? Normalerweise folgt man ja einem Link und loggt sich ein. Allerdings geht das bei gebundenen Bots ja nicht. Jemand eine Idee (außer Bot unbinden)? :-)
Posted by: Bizarrus

Re: Fragen und Antworten - 11.02.2015, 22:24:36

Die "Überlagerung" wurde vor kurzem doch gefixxt, da viele sich beschwert haben, dass bei /pp die Sounds alle gleichzeitig abgespielt werden.

Hier nun die Beschreibung der DisplayGroups:
Code:
°>{displayGroup}$ID<°$INHALT°>{displayGroupEnd}<°


Befehle:
  • /tp-showgrp $ID


Es gibt verschiedene Möglichkeiten. Ist $ID mit einem Ausrufezeichen versehen, so wird das Objekt am Anfang "versteckt":
Code:
°>{displayGroup}!1<°Versteckter Text°>{displayGroupEnd}<°

°>versteckten Text anzeigen|/tp-showgrp 1<°


Man kann auch eine Gruppierung machen:
Code:
°>{displayGroup}1<°
	Inhalt 1
	
°>{displayGroup}2<°
	Inhalt 2
	
°>{displayGroup}3<°
	Inhalt 3
	
°>{displayGroupEnd}<°

°>Text 1|/tp-showgrp 1<°, °>Text 2|/tp-showgrp 2<°, °>Text 3|/tp-showgrp 3<°


Möchte man Standardmäßig ein Objekt "offen" haben, so wird dies zuvor mit addDisplayGroup definiert:
Code:
°>{addDisplayGroup}1<°
	°>{displayGroup}1<°
		Sichtbar
	
	°>{displayGroup}2<°
		Versteckt
	
°>{displayGroupEnd}<°

°>Sichtbar|/tp-showgrp 1<°, °>Versteckt|/tp-showgrp 2<°
Posted by: IgelchenM

Re: Fragen und Antworten - 11.02.2015, 23:13:02

Ergänzung zu den Displaygroups...
Es ist auch möglich nachträglich die Sichtbarkeit zu ermöglichen, wenn man z.B. °>{setdisplaygroup}1<° ausgibt.
Posted by: rmpg

Re: Fragen und Antworten - 11.02.2015, 23:43:11

Kann ich so auch nur einzelnen usern sichtbarkeit gegen indem ich ihnen °>{setdisplaygroup}1<° ins P schicke?
Posted by: DerNeuanfang

Re: Fragen und Antworten - 12.02.2015, 01:18:43

--------> Selbst gelöscht, war auf was anderes bezogen
Posted by: Kev777

Re: Fragen und Antworten - 12.02.2015, 03:29:06

Antwort auf: Dreamboy-1996 <3
Gibt es eine Möglichkeit, diese nervigen "Neue Chatter für dich"- und "Knuddels vermisst dich"-EMails der BotNicks zu deaktivieren? Normalerweise folgt man ja einem Link und loggt sich ein. Allerdings geht das bei gebundenen Bots ja nicht. Jemand eine Idee (außer Bot unbinden)? :-)

Auf die schnelle würd ich sagen: spammfilter konfigurieren
Posted by: Ironist

Re: Fragen und Antworten - 12.02.2015, 11:47:20

Antwort auf: Kev777
Antwort auf: Dreamboy-1996 <3
Gibt es eine Möglichkeit, diese nervigen "Neue Chatter für dich"- und "Knuddels vermisst dich"-EMails der BotNicks zu deaktivieren? Normalerweise folgt man ja einem Link und loggt sich ein. Allerdings geht das bei gebundenen Bots ja nicht. Jemand eine Idee (außer Bot unbinden)? :-)

Auf die schnelle würd ich sagen: spammfilter konfigurieren


Hey ihr Superhelden ;-),

mit dem nächsten Update haben wir deaktiviert, dass diese Mails für Bots verschickt werden. Beim nächsten Mal ab ins Uservoice… ihr wisst schon. :-P


Knuddelige Grüße
Iro (-:
Posted by: WoB BoY 24

Re: Fragen und Antworten - 14.02.2015, 22:06:30

Antwort auf: Ironist
Antwort auf: Kev777
Antwort auf: Dreamboy-1996 <3
Gibt es eine Möglichkeit, diese nervigen "Neue Chatter für dich"- und "Knuddels vermisst dich"-EMails der BotNicks zu deaktivieren? Normalerweise folgt man ja einem Link und loggt sich ein. Allerdings geht das bei gebundenen Bots ja nicht. Jemand eine Idee (außer Bot unbinden)? :-)

Auf die schnelle würd ich sagen: spammfilter konfigurieren


Hey ihr Superhelden ;-),

mit dem nächsten Update haben wir deaktiviert, dass diese Mails für Bots verschickt werden. Beim nächsten Mal ab ins Uservoice… ihr wisst schon. :-P


Knuddelige Grüße
Iro (-:


Bitte noch einmal prüfen. Nach dem CS Update am 13.02. bekam ich eben gerade erneut eine E-Mail auf dem Bot. (neue Chatter für dich) - Rev 68456
Posted by: redorange

Re: Fragen und Antworten - 17.02.2015, 00:52:25

Antwort auf: Ironist
Beim nächsten Mal ab ins Uservoice… ihr wisst schon. :-P

Na, ich hoffe mal, ins Uservoice sollen nur Feature- und keine Fehlerbehebungswünsche! :o)
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 18.02.2015, 22:38:25

Antwort auf: WoB BoY 24
Antwort auf: Ironist
Hey ihr Superhelden ;-),

mit dem nächsten Update haben wir deaktiviert, dass diese Mails für Bots verschickt werden. Beim nächsten Mal ab ins Uservoice… ihr wisst schon. :-P


Knuddelige Grüße
Iro (-:


Bitte noch einmal prüfen. Nach dem CS Update am 13.02. bekam ich eben gerade erneut eine E-Mail auf dem Bot. (neue Chatter für dich) - Rev 68456
Sign! Bekam auch heute wieder eine solche EMail.
Posted by: Bizarrus

Re: Fragen und Antworten - 24.02.2015, 14:26:21

Einige kennen es bereits:
Ist man in mehreren Channels so kann es vorkommen dass der Fokus des Channels auf eines der anderen gelegt wird. Sprich, wenn über ein /pp Fenster die App läuft kann man möglicherweise keine App-Befehle mehr nutzen, da diese schließlich im MyChannel von der App ausgeführt werden müssen und in anderen Channels nicht zur Verfügung stehen.

Bis dato gibt es ja den /sfc Command (Send from Channel). Ich hatte aber grade eine Idee wie man das vielleicht noch cooler lösen kann, denn schließlich geht /sfc nicht von mobilen Endgeräten. Die Antwort lautet einfach: /a

Mit /a schreibt man einen Text öffentlich in den Channel. Mir ist aufgefallen dass wenn keine Argumente gesetzt werden, dass der jeweilige Channel wo von das /pp Fenster aufgerufen wurde dennoch den Fokus erlangt und dann dadurch die App-Commands wieder zur Verfügung stehen da der richtige Channel "ausgewählt" ist.

Das ganze habe ich einfach mit einer Doubleaction verbunden. Hier mal beide Beispiele:
/sfc $CHANNEL:$COMMAND
/doubleaction /a|$COMMAND


Hier ein working Example:
Code:

var App = (new function() {
	this.onUserJoined = function(user) {
		var command	= '/mychatcommand';
		var channel = KnuddelsServer.getChannel().getChannelName();
		var name	= KnuddelsServer.getAppName();
		var text	= 'Hallo ' + user.getProfileLink() + ',°#°dies ist ein test von _°B°' + name + '_°r°:';
		
		/* Send from Channel */
		text		+= '°#>Link: Send from Channel|/sfc ' + channel + ':' + command + '<°';
		
		/* Public Command */
		text		+= '°#>Link: Public Command|/doubleaction /a\\|' + command + '<°';
		
		user.sendPrivateMessage(text);
	};
	
	this.chatCommands = {
		mychatcommand: function(user) {
			user.sendPrivateMessage('Du hast den Befehl erfolgreich ausgeführt.');
		}
	}
}());

Posted by: Anonym

Re: Fragen und Antworten - 08.04.2015, 09:54:17

Huhu,

kann es sein, dass die Funktion "isInTeam()" beim user-Objekt einen Fehler bei den Sub-Teams hat, wenn der Name des Sub-Team Leerzeichen enthält? Weil im Knuddels.at-Chat gibt die Funktion immer ein False zurück, sobald ich überprüfen möchte, ob User X einen bestimmten Newsletter abonniert hat. (Die Abonnenten sind in verschiedene SubTeams eingetragen, damit die Newsletter als Rund-/m versendet werden kann). Und Ja, User X war schon mal im App-Channel und ist auch definitiv als Abonnent eingetragen.

Ein Sub-Team hat z.B. den Namen "Empfänger der Chatnews".

Bei anderen Teams/SubTeams funktioniert es einwandfrei.



Rubi.
Posted by: IgelchenM

Re: Fragen und Antworten - 11.04.2015, 21:47:46

Eine Frage, gibt es bereits eine Möglichkeit zu prüfen ob das HTML-UI richtig gestartet wurde? Ich hab auf'm Testserver ab und an das Problem, dass das Fenster weiß bleibt und nur "Lade..." drin steht.

Oder muss ich das selbst realisieren?
Posted by: djchrisnet

Re: Fragen und Antworten - 12.04.2015, 20:17:55

$(document).on('readdy', function() {
Client.sendAppEvent('loaded', true);
});
Posted by: Bizarrus

Re: Fragen und Antworten - 13.04.2015, 05:14:49

Ein bissel Cooler:
Code:

var MyGame = (function() {
	var instance	= this;
	var name		= 'MyGame';
	
	this.getName = function() {
		return name;
	};
	
	this.init = function() {
		document.addEventListener('eventReceived', instance.onReceive);
		
		Client.sendEvent('init', {
			app: 		Client.getAppId(),
			game:		instance.getName(),
			type: 		Client.getClientType(),
			version:	parent.Loader.getBridge().getVersion()
		});
		
		/*
			Additional wrapped with
				$(window).load(function() {
					
				});
		*/
	};
	
	this.onReceive = function(event) {		
		try {
			var key		= event.eventKey;
			var data	= event.eventData;
			
			switch(key) {
				case 'example':
					/* what u want */
				break;
			}
		} catch(e) {
			Client.sendEvent('exception', e.message);
		}
	};
	
	this.init();
}());

Posted by: Vampire183

Re: Fragen und Antworten - 13.04.2015, 17:03:50

Hi!

Mein Botnick wurde heute wie bei anderen auch von der App entfernt. Ich bin in einer App in einem Channel als Appmanager eingetragen, aber kann dort keinen neuen Botnick verbinden. Mit dem alten Botnick online gehen ist ebenfalls nicht möglich. Hat jemand ne Idee, das Problem zu lösen?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 13.04.2015, 17:39:35

Ja. Mit dem Channelbesitzer reingehen und versuchen den Botuser neuzusetzen. Dadurch wird dieser entfernt und du kannst den wieder einloggen und als Botuser setzen.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 13.04.2015, 17:44:24

Ich war heute von dem Problem auch betroffen. Folgender Ablauf brachte mir die Lösung:
  1. Profile des Bots mittels /w NICK aufrufen
  2. Versuchen, den selben Bot-User zu binden (während er offline ist). Es erscheint eine Fehlermeldung ("APP_NAME: ERROR: Fehlerhafte BotUser-Verknüpfung entfernt: BOT_NICK")
  3. Dadurch verliert der Bot-User den Eintrag im Profil, die Verknüpfung wird aufgelöst
  4. Du kannst dich mit dem Bot wieder einloggen und ihn neu binden

So hat das bei mir funktioniert. Eventuell lässt sich der Ablauf auf dein Problem übertragen, da ich das selbe Verhalten auch hatte.


// Da schreibt man ne tolle Anleitung und dann war jemand schneller... :((
Posted by: Bizarrus

Re: Fragen und Antworten - 15.04.2015, 02:56:37

Für die UI habe ich eine kleine Helfer-Klasse geschrieben, vielleicht kann die ja jemand gebrauchen:
Code:

function View(name) {
	var _name	= name;
	var _width	= 100;
	var _height	= 100;
	var _data	= {};
	
	this.setSize = function(width, height) {
		_width	= width;
		_height	= height;
	};
	
	this.send = function(user) {
		// canSendAppContent
		// canShowAppViewMode
		user.setAppContent(AppContent.overlayContent(new HTMLFile(_name + '.html', _data), _width, _height));
	};
	
	/*
		Strings
	*/
	this.getString = function(key, defaultValue) {
		return this.getObject(key, defaultValue);
	};
	
	this.addString = function(key, value) {
		this.addObject(key, value);
	};
	
	this.removeString = function(key) {
		this.removeObject(key);
	};
	
	this.hasString = function(key) {
		return this.hasObject(key);
	};
	
	/*
		Number
	*/
	this.getNumber = function(key, defaultValue) {
		return this.getObject(key, defaultValue);
	};
	
	this.addNumber = function(key, value) {
		this.addObject(key, value);
	};
	
	this.removeNumber = function(key) {
		this.removeObject(key);
	};
	
	this.hasNumber = function(key) {
		return this.hasObject(key);
	};
	
	/*
		Object
	*/
	this.getObject = function(key, defaultValue) {
		if(this.hasObject(key)) {
			return _data[key];
		}
		
		return defaultValue;
	};
	
	this.addObject = function(key, value) {
		_data[key] = value;
	};
	
	this.removeObject = function(key) {
		delete _data[key];
	};
	
	this.hasObject = function(key) {
		return (_data[key] != undefined);
	};
};



Das ganze kann dann zum Beispiel wie folgt genutzt werden:

Code:

var view	= new View('Overview'); // ~> www/Overview.html

view.setSize(250, 300);
view.addObject('user', user.getNick());
view.send(user);



Die Methoden addObject (wie bei der Persistence) fügt Daten an der UI als pageData an. Ich habe es mir hier einfach gemacht und jage diese Clientseitig durch den Event-Receiver (onSendEventReceived):

Code:

if(Client.pageData != undefined) {
	for(var index in Client.pageData) {
		var key	= index;
		var value	= Client.pageData[index];
		Client.onSendEventReceived(key, JSON.stringify(value));
	}
}

Posted by: TobyB

Re: Fragen und Antworten - 15.04.2015, 08:04:34

Weil ich es bei einigen hier immer wieder sehe (und früher selbst auch öfter in diesen Fehler gelaufen bin ...):

Iteriert nicht mit for...in über ein Object oder Array!

Schlecht
Code:
var myObj = {
	x : 23,
	y : 'test'
};

for(var item in myObj) {
	// 23
	// 'test'
	// [maybe something else]
}


Gut!
Code:
var myObj = {
	x : 23,
	y : 'test'
};
Object.keys(myObject).forEach(function(item) {
	// 23
	// 'test'
});


Der entscheidende Satz dazu steht in der jeweiligen Dokumentation dazu (aus der for...in Dokumentation):
Zitat:
the difference being that a for-in loop enumerates properties in the prototype chain as well


Fazit: Am besten niemals den for...in Loop benutzen, wenn ihr nicht explizit dessen Feature nutzen wollt (ich vermute das braucht hier im alltäglichen Gebrauch niemand). Das macht euch im Zweifel mehr Ärger als es hilft.

Wenn ihr also Den Prototypen von Object erweitert habt, beispielweise weil ihr eine Bibliothek von irgenwoher eingebunden habt oder es gar selbst getan habt, dann würde der for...in Loop hier über diese Eigentschaften ebenfalls iterieren, was zu ungewünschten Nebeneffekten führen kann.

[Edit]
Links zu Dokumentation:
for...in
Object.prototype.keys()
Array.prototype.forEach()
Posted by: Bizarrus

Re: Fragen und Antworten - 15.04.2015, 08:34:46

Bei einem Array selbst iteriere ich oftmals direkt über einen definierten Index like
Code:
for(var index: index < length; ++index)


Einfach weil eine iteration mehr Zeit beansprucht. Oder ich die Reihenfolge beachten muss/möchte.

for...in ist halt oftmals sinnvoll wenn man Objekte/Arrays durchlaufen möchte und nicht zusätzlich die values gegenprüfen möchte - Die werden nämlich ignoriert. Nachteil daran wäre halt dass die Reihenfolge nicht beachtet wird, der interpreter aber garantiert dass beim jeweiligen tick der Eintrag nur einmalig genutzt wird.

Code:
var a = new Array(5);
a[0] = 1;
a[1] = 2;
a[2] = 3;

for(var b in a) {
 console.log(b, a[b]);
}

var l = a.length;
for(var i = 0; i < l; ++i) {
 console.log(i, a[i]);
}

Wie man sieht hat das Array eine Grösse von 5. Durch for...in werden aber nur die belegten Values durchlaufen, was bei einer Indexbasierten Loop nicht der Fall wäre.

Ich habe mit Absicht hier eine Iteration mittels for...in gesetzt, weil es beim triggern des Events egal ist, in welcher Reihenfolge dies abgearbeitet wird. So erspare ich mir da auch das weitere Gegenprüfen ob die value null oder undefined ist.

Es kommt halt immer auf die Anforderung als auch das Einsatzgebiet an :-)
Posted by: djchrisnet

Re: Fragen und Antworten - 15.04.2015, 09:47:26

Antwort auf: TobyB
Wenn ihr also Den Prototypen von Object erweitert habt, beispielweise weil ihr eine Bibliothek von irgenwoher eingebunden habt oder es gar selbst getan habt, dann würde der for...in Loop hier über diese Eigentschaften ebenfalls iterieren, was zu ungewünschten Nebeneffekten führen kann.


das ist nur dann richtig, wenn man neue Methoden einfach ans Object "dranklatscht" statt sie ordentlich zu definieren

Dirty shit
Code:
if(!Object.prototype.size) {
	Object.prototype.size = function() {
		return Object.keys(this).length;
	}
}

nun wäre die methode bei for(x in obj) dabei

Code:
if(!Object.prototype.size) {
	Object.defineProperty(Object.prototype, 'size', {
		enumerable:	false,
		configurable:	false,
		writable:		false,
		value: function() {
			return Object.keys(this).length;
		}
	});
}


Hierbei wird enumerable auf false gesetzt was einfach soviel heißt wie "diese Methode nicht interieren", ist übrigends standard bei Object.defineProperty

Der Code ließe sich auch noch weiter kürzen, da die settings aktuell default sind.
Code:
if(!Object.prototype.size) {
	Object.defineProperty(Object.prototype, 'size', {
		value: function() {
			return Object.keys(this).length;
		}
	});
}


Weitere Beispiele dazu gibts im Framework unter Tools
Posted by: TobyB

Re: Fragen und Antworten - 15.04.2015, 12:05:40

Ich kann dir aus Erfahrung sagen, die wenigstens Frameworks die man sich mal von irgendwo her holt machen Gebrauch von Object.defineProperty() ... leider. Das liegt daran, dass (mittlerweile weniger) bis vor leider gar nicht all zu langer Zeit zu wenige Browser dieses Feature unterstützt haben. Daher ist noch viel zu viel Code in Verwendung, der es nicht benutzt, oder auch nur beschissen polyfillt.

Und die .forEach() Variante funktioniert für alle Fälle wunderbar.

Vgl.:
Code:
var arr = new Array(5);
arr[0] = 0;
arr[3] = 3;
arr.forEach(function(){
	console.log('each', arguments);
});

und
Code:
var arr = new Array(5);
arr.forEach(function(){
	console.log('each', arguments);
});
Posted by: Vampiric Desire

Re: Fragen und Antworten - 23.04.2015, 11:27:55

Ich habe gerade angefangen die User-Klasse für Spot It mit Prototype zu erweitern um wiederkehrenden Code nicht immer wieder neu zu schreiben.

Code:
User.prototype.getGamePoints = function() {
	var persis = this.getPersistence();
	return persis.getNumber("points",0);
}


Relativ unwichtig, aber Codetechnisch interessant. getPersistence() erzeugt immer ein neues Object, es wird nicht die Referenz gespeichert. Dies kann gerade bei häufigen Anwendungen unnötig Zeit/Leistung kosten. Daher sollte man die Referenz zur Persistenz speicher. Daraus wird dann:


Code:
User.prototype.myPersis = null;
User.prototype.getMyPersistence = function() {
	if(this.myPersis == null)
		this.myPersis = this.getPersistence();
	return this.myPersis;
}

User.prototype.getGamePoints = function() {
	var persis = this.getMyPersistence();
	return persis.getNumber("points",0);
}

Posted by: Bizarrus

Re: Fragen und Antworten - 23.04.2015, 18:48:03

Die Referenzierung ist eher Irrelevant und hat keinen Einfluss auf die Geschwindigkeit.
Viel mehr entstehen möglicherweise Performanceeinbussen wenn 5.000x hintereinander die getter/setter gecallt werden, einfach weil hier die Datenbankoperationen stattfinden.

Besser wäre es wenn du hingehen würdest und ein Globales Objekt erzeugst wo dann die Daten zwischengehalten werden und beim onJoin/onLeave dann erst die Operationen durchführst.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 23.04.2015, 19:38:21

Antwort auf: Bizarrus

Besser wäre es wenn du hingehen würdest und ein Globales Objekt erzeugst wo dann die Daten zwischengehalten werden und beim onJoin/onLeave dann erst die Operationen durchführst.


Dir ist bekannt dass du bei jedem getUser/Event ein neues User Objekt bekommst, diese also nicht Global beim User speichern kannst - so dass du so oder so jede menge Memory verschwendest wenn wir von zig Usern reden?

Und dass es keine Zeit kosten würde ist auch Bullshit, denn es dauert natürlich seine Zeit bis ein neues Objekt von der Persistence generiert wird. und der Funktionaufruf des Getters ist da im Gegensatz dazu geringfügig. Was aber stimmt ist, dass man die Werte beim User zwischenspeichern sollte, sofern man 500x die Funktion aufrufen will in einem Event
Posted by: TobyB

Re: Fragen und Antworten - 24.04.2015, 08:20:48

Ihr redet hier von Performance usw ... habt ihr denn gemessen was genau an der Arbeit mit der Persistence nun langsam ist? also habt ihr belastbare Zahlen, oder ist das nun alles theoretisches Gerede?
Posted by: djchrisnet

Re: Fragen und Antworten - 24.04.2015, 09:44:17

die performance wurde zuletzt nochmal massiv gesteigert als UserPersistenceNumbers eingeführt wurde sodass die Performance im letzlich ausser acht gelassen werden kann. wir reden hier von 1-2ms für mehrfache Additionen (ja getestet unter realen bedingungen)
Posted by: Vampiric Desire

Re: Fragen und Antworten - 08.05.2015, 13:10:13

Als kleines Snippet:
Code:
Card.Rarity = Object.freeze({
    COMMON: 0,
    UNCOMMON: 1,
    RARE: 2,
    LEGENDARY: 3
});


Ab und zu will man ENUMs definieren, die aber später nicht aus vesehen verändert werden dürfen. Hierbei hilft Object.freeze()
Nachdem ein Object gefreezed wurde, lässt es nicht mehr verändern.

Sollte euer Object aus mehreren Objecten bestehen lassen sich die Subelemente aber noch ändern. Hier sollte man sofern man es verhindern will, diese Objekte ebenfalls gefreezed werden. Dies lässt sich einfach per Rekursion und Object Freeze bewerkstelligen.
Posted by: djchrisnet

Re: Fragen und Antworten - 08.05.2015, 13:44:24

oder man benutzt einfach eine Konstante

Beispiel:

Code:
var abc = 'write/read';
const = def = 'read_only';
Posted by: Vampiric Desire

Re: Fragen und Antworten - 08.05.2015, 13:52:57

Antwort auf: djchrisnet
oder man benutzt einfach eine Konstante



Code:
const abc = { a: 1, b:2 } >>>> Object {a: 1, b: 2}
abc.a = 3 >>> Object {a: 3, b: 2}
abc.d = 1 >>> Object {a: 3, b: 2, d: 1}



Scheint nicht für Objekte zu funktionieren :-D
Posted by: Ironist

Re: Fragen und Antworten - 08.05.2015, 21:14:35

Antwort auf: Vampiric Desire
Antwort auf: djchrisnet
oder man benutzt einfach eine Konstante



Code:
const abc = { a: 1, b:2 } >>>> Object {a: 1, b: 2}
abc.a = 3 >>> Object {a: 3, b: 2}
abc.d = 1 >>> Object {a: 3, b: 2, d: 1}



Scheint nicht für Objekte zu funktionieren :-D


Nun ja, dein Beispiel ist nicht ganz korrekt.

Code:
const abc = { a: 1, b:2 } >>>> Object {a: 1, b: 2}
abc = 'Foo'; >>>> code breaks

Posted by: Vampiric Desire

Re: Fragen und Antworten - 08.05.2015, 21:31:28

Was prinzipiell richtig ist Iro, ich aber Speziell auf Objekte und ihren Elementen eingegangen bin und dies nicht ohne erhöhten schreibaufwand zu realisieren wäre über const.
Posted by: Microlost

Re: Fragen und Antworten - 10.05.2015, 18:43:53

Heyho =),

Wäre jemand so nett und würde mir das mit dem Speichern von Usersachen (z.B Points von Spielen) und auch laden erklären?

Ich blicke da irgendwie nicht durch...

Würde mich freuen, wenn sich da jemand findet, der mir das mal ein wenig erklären könnte..


Freundliche Grüße,
Posted by: Ironist

Re: Fragen und Antworten - 10.05.2015, 21:10:47

Antwort auf: Microlost
Heyho =),

Wäre jemand so nett und würde mir das mit dem Speichern von Usersachen (z.B Points von Spielen) und auch laden erklären?

Ich blicke da irgendwie nicht durch...

Würde mich freuen, wenn sich da jemand findet, der mir das mal ein wenig erklären könnte..


Freundliche Grüße,


user.getPersistence().setNumber('points', 3);
var points = user.getPersistence().getNumber('points');


http://developer.knuddels.de/docs/classes/UserPersistence.html#method_setNumber
Posted by: Microlost

Re: Fragen und Antworten - 10.05.2015, 23:37:39

Antwort auf: Ironist
Antwort auf: Microlost
Heyho =),

Wäre jemand so nett und würde mir das mit dem Speichern von Usersachen (z.B Points von Spielen) und auch laden erklären?

Ich blicke da irgendwie nicht durch...

Würde mich freuen, wenn sich da jemand findet, der mir das mal ein wenig erklären könnte..


Freundliche Grüße,


user.getPersistence().setNumber('points', 3);
var points = user.getPersistence().getNumber('points');


http://developer.knuddels.de/docs/classes/UserPersistence.html#method_setNumber


Danke,

Ich hatte es eigtl genau so drinne, hatte jedoch das Speichern an die falsche Stelle platziert, womit es natürlich nicht aufgerufen wurde.. (Außer man war im Spiel)..

Posted by: Dave20009

Re: Fragen und Antworten - 20.05.2015, 02:12:31

Ich habe mal eine Frage: Ich habe ein Code (siehe unten) in meine App eingebaut mit der alle gewisse Zeit öffentliche Nachrichten vom Bot gesendet werden, so weit so gut, aber sobald die Zeit um ist und die erste Nachricht versendet wurde, fängt plötzlich das Bot an zu spinnen und sendet anstatt alle 20 und 30 Minuten, in 3-5 Minuten intervall und das fängt dann schon leicht zu spammen an aber woran liegt das? Das nervt nicht nur mich, sondern auch andere anwesende User enorm.

Und ist es irgendwie möglich, eine art "pool" zu erstellen? Also das der Bot sich z.B. alle 30 min immer eine andere Message raussucht und diese öffentlich postet? So würde ich mir ein hässlichen Code mit milliarden arrays wie unten Sparen und so würde immer zu einer festen Zeit eine andere Message kommen und nicht nach 20 min die, 10 min später die andere usw. Wenn es möglich ist, wie programmier ich das? Ich habe irgendwie keine Ahnung, da meine Javascript kenntnisse noch lange nicht dem eines Profi entsprechen...

Warnung! Spoiler!
Code:
var dev = KnuddelsServer.getAppDeveloper();
	
	rmsg = [
		'Du hast einen _Bug_ gefunden? Dann schreibe  °>sm_classicII_01...b.pw_29.ph_15.gif<° _°BB>_hdem Entwickler eine Nachricht|/m '+dev+'<r°_.'
	];
	intid = setInterval(function() {
		KnuddelsServer.getDefaultBotUser().sendPublicMessage(rmsg[Math.floor(Math.random() * rmsg.length)]);
	}, 30*60000);
	
	KnuddelsServer.getPersistence().setNumber('msgint', intid);

//Ausgabe 2
var dev = KnuddelsServer.getAppDeveloper();

	amsg = [
		'Du magst _diesen_ Channel? Dann mach ihn jetzt  °>sm_sign_mag-ich...b.pw_29.ph_15.gif<° _°BB>_hzu deinem LieblingsMyChannel|/edit setlmc<r°_.'
	];
	intid = setInterval(function() {
		KnuddelsServer.getDefaultBotUser().sendPublicMessage(amsg[Math.floor(Math.random() * amsg.length)]);
	}, 20*60000);
	
	KnuddelsServer.getPersistence().setNumber('msgint', intid);
Posted by: Ironist

Re: Fragen und Antworten - 20.05.2015, 09:20:00

Hallo Dave,

ich glaube du machst es dir ein bisschen schwer. So wie ich deine Anforderung verstanden habe würde ich das ein bisschen anders lösen...


Warnung! Spoiler!
Code:
App.onAppStart = function()
{
    var messages = ['Nachricht1', 'Nachricht2', 'Nachricht3'];
    const MESSAGE_INTERVAL = 1000 * 60 * 30;

    setInterval(function() {
        var randomMessage = RandomOperations.getRandomObject(messages);
        KnuddelsServer.getDefaultBotUser().sendPublicMessage(randomMessage);
    }, MESSAGE_INTERVAL);
}


Knuddelige Grüße
Ironist
Posted by: Bizarrus

Re: Fragen und Antworten - 20.05.2015, 09:41:31

Im Notfall kannst du dir auch mal SpamMessages anschauen, ist OpenSource und du kannst dir hier einiges abschauen oder auch verändern :-)
Posted by: Dave20009

Re: Fragen und Antworten - 20.05.2015, 18:39:00

Antwort auf: Ironist
Hallo Dave,

ich glaube du machst es dir ein bisschen schwer.

Ja, ich mache es mir irgendwie immer schwerer als es ist, ich bin ein äußerst komplizierter Mensch, der immer das schwierigste versucht obwohl es auch wesentlich einfacher geht :/ hatte mir letzte nacht auch so überlegt es mal mit var messages zu versuchen, weil mir das am logischsten erschien aber war mir nicht ganz sicher, deswegen hab ich es erstmal gelassen aber mit dem Code da von dir Iro, hat es nun endlich funktioniert und das blöde gespamme hat aufgehört :) deswegen Danke an Iro und Bizzi.
Posted by: Anonym

Re: Fragen und Antworten - 21.05.2015, 13:11:55

Hi,

Gibt es in JS eine Short-IF wie unter PHP?

var count = (null === param ? BotObject.getKnuddelAmount():param);

Oder muss ich die if/else bauen?

Danke schonmal,

Lg Lex
Posted by: Vampiric Desire

Re: Fragen und Antworten - 21.05.2015, 13:14:22

Der Conditional Operator (auch Tri Operator) gibt es auch in Javascript.
Ausprobieren hätte geholfen ;)


Gibt es übrigens in nahezu jeder Programmiersprache und ist keine Erfindung von PHP :-D
Posted by: Anonym

Re: Fragen und Antworten - 21.05.2015, 14:11:00

Danke dir ^^

War vom Handy gepostet, Sitz im Auto.
Danke dir

LG Lex
Posted by: Ironist

Re: Fragen und Antworten - 21.05.2015, 14:38:06

Antwort auf: LordLex
Hi,

Gibt es in JS eine Short-IF wie unter PHP?

var count = (null === param ? BotObject.getKnuddelAmount():param);

Oder muss ich die if/else bauen?

Danke schonmal,

Lg Lex


Ich schlage vor, dass du vor der Frage im Forum

a) googlest
b) es selbst probierst.

In deinem konkreten Fall wärst du mit (b) schon auf die Lösung gekommen.

Knuddelige Grüße
Ironist
Posted by: Anonym

Re: Fragen und Antworten - 21.05.2015, 14:55:50

<ironie>Und ich dachte der Thread heißt "Fragen & Anworten" </ironie>
Posted by: djchrisnet

Re: Fragen und Antworten - 21.05.2015, 15:39:28

ja gibt es

var a = (1+2 == 3) ? 1 : 2;

Edit: ok, erst Topic zuende lesen, dann posten :-D

Edit2: geht sogar noch shorter...

var count = param || BotObject.getKnuddelAmount();
Posted by: Anonym

Re: Fragen und Antworten - 21.05.2015, 15:47:44


Trotzdem danke dir Chrisnet ^^

Funktioniert aber leider trotzdem nicht sowie ich das wollte, was sehr seltsam ist.

auszahlen : function(user, param, command){

user.sendPrivateMessage('Ich habe aktuell ' + BotObject.getKnuddelAmount ());
var count = (null === param ? BotObject.getKnuddelAmount():param);
BotObject.transferKnuddel(user, new KnuddelAmount(count), 'Auszahlung');

}

funktioniert ohne parameter nicht da mir getKnuddelAmount() xKn zurück liefert (Wozu das 'Kn' dazu? Oo)
Schreibe ich aber

BotObject.transferKnuddel(user, new KnuddelAmount( BotObject.getKnuddelAmount()), 'Auszahlung');

funktioniert es plötzlich ^^
Vielleicht jemand ne Idee dazu?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 21.05.2015, 15:50:09

getKnuddelAmount().asNumber()
Posted by: djchrisnet

Re: Fragen und Antworten - 21.05.2015, 15:50:31

BotObject.getKnuddelAmount () ist ein KnuddelAmount Objekt, dessen toString methode xKn als text zurückliefert.

BotObject.getKnuddelAmount().asNumber() ist die Lösung



PS: Ich hoffe du baust da noch eine Mrd abfragen und prüfungen vor, damit nicht jeder mal eben ne Mio kn auszahlen kann
Posted by: html

Re: Fragen und Antworten - 22.05.2015, 11:54:40

Hallo,

vielen Dank für die gestrige Aufnahme ins App(s)-Team! :-) Um mit der Entwicklung bzw. dem Lernprozess von API-Bots (in JS/ HTMLUi) anfangen zu können, habe ich bereits die FTP-Daten in das FTP-Programm eingepflegt, allerdings fehlt mir der Status 1 (Familymitglied) auf dem Entwicklerserver, um überhaupt mit den Tests bzw. dem Lernen der API-Bot-Programmierung beginnen zu können. Eine entsprechende /m-Nachricht wurde bereits an Ironist versendet.

Ansonsten bin ich echt ziemlich gespannt, wann ich das Ganze hier auch einmal auf dem Kasten habe werde!

Diese Nachricht habe ich deshalb hier hinterlassen, damit man als Team-/Projektleiter bei Anlegen eines neuen NICKBot direkt den dafür notwendigen Status (1) setzt und um in jenem Bezug bei aufkommenden Fragen direkt Abhilfe verschaffen kann (/m-Nachrichten fallen weg)...

html


P.S.: mit Erhalt der Begrüßungs-/Willkommens-/m-Nachricht wäre es vielleicht nicht verkehrt bei der Auflistung der notwendigen FTP-Daten auch noch die Server-URL (Adresse) mit beizufügen, um nicht erst recherchieren bzw. raten zu müssen, mit welcher Server-Adresse man denn nun eine Verbindung herstellen muss. (Was für mich aber eher weniger ein Problem darstellte!)
Posted by: html

Re: Fragen und Antworten - 22.05.2015, 16:32:21

Ah, entschuldigt... jetzt habe ich das mit dem Anlegen eines MyChannels verstanden. Der Nickname muss auf dem Entwicklerserver gar nicht Status 1 besitzen.
Posted by: Anonym

Re: Fragen und Antworten - 22.05.2015, 23:29:44

Zitat:

Hey LordLex,

du hast Lust deine eigene App für deinen eigenen Channel zu programmieren?
Keine Sorge, das Ganze ist überhaupt nicht schwer.

Hier sind deine Entwicklerdaten. Wozu du die brauchst erfährst du in unserem Wiki.


Wiki
Zitat:

FTP-Zugang einrichten
Wichtiges zum FTP Setup

Die URL des FTP-Servers lautet: appupload.knuddels.de

Beim Verbinden musst du darauf achten eine unverschlüsselte Verbindung zu wählen.


Alles beschrieben
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 23.05.2015, 00:24:53

Was wieder mit Recherche verbunden ist. Es spricht nichts dagegen, die URL auch in die /m aufzunehmen, oder findest du irgendeinen plausiblen Grund?
Posted by: Anonym

Re: Fragen und Antworten - 23.05.2015, 12:24:00

Das wiki ist ja verlinkt, und wenn du den Anleitung folgst, was jeder tun sollte um einen ersten Eindruck zu erhalten landest du auf Page 2 dann direkt auf der Information zu dem FTP Server.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 23.05.2015, 15:29:13

Du hast die Frage nicht beantwortet.
Posted by: Microlost

Re: Fragen und Antworten - 31.05.2015, 21:11:54

Könnte mir jemand verraten, warum sich user2.getClientType() nicht mit einer switch bzw if abfrage verträgt?

Code:
var device = user2.getClientType();
					switch(device)
					{
						case "Applet":
						showWarnUI(user2);
						return;
						case "Browser":
						showWarnUI(user2);
						return;
						case "Android":
						user2.sendPrivateMessage("Du wurdest gerade im Channel Flirt von _" + user.getNick() + "_ mit dem Grund '_" + vreason +"_' verwarnt.");
						return;
						case "IOS":
						user2.sendPrivateMessage("Du wurdest gerade im Channel Flirt von _" + user.getNick() + "_ mit dem Grund '_" + vreason +"_' verwarnt.");
						return;
						default:
						user2.sendPrivateMessage("Du wurdest gerade im Channel Flirt von _" + user.getNick() + "_ mit dem Grund '_" + vreason +"_' verwarnt.");
						return;
						
					}


Er geht immer automatisch auf default, egal ob Handy oder PC (Applet, HTML Chat)

Zweite Frage:

Warum sendet er manchmal kein Event an das HTML UI?
Ich muss das Event mehrmals (Mit Timeouts) abschicken, damit dieses auch sicher ankommt..

->
Code:
user2.sendAppEvent('warndata', { 'cmuser2' : user.getNick(), 'reason2' : vreason });




Freundliche Grüße
Posted by: Vampiric Desire

Re: Fragen und Antworten - 31.05.2015, 21:44:43

1.

weil der getClientType kein String zurückgibt

RICHTIG:
case ClientType.Applet:



2.
Ich kenne dein Code nicht... Ich denke du rufst das sendAppEvent direkt nach setAppContent oder so auf....
Dies kann nicht funktionieren, weil zu dem Zeitpunkt das AppContent nicht vollständig geladen ist. Besser wäre es die Daten erst zu schicken, nachdem die HTML UI sich gemeldet hat, dass sie fertig geladen ist. (Einfach beim HTMLUI bei $.ready() nen Event an den Server schicken)




Posted by: djchrisnet

Re: Fragen und Antworten - 31.05.2015, 22:08:27

zu 2.tens: Für daten, die direkt beim laden des UI´s angezeigt werden sollen, gibt es pageData.

setzen:
http://developer.knuddels.de/docs/classes/HTMLFile.html#method_HTMLFile
var htmlFile = new HTMLFile('start.html', { 'cmuser2' : user.getNick(), 'reason2' : vreason });

Abfragen:
http://developer.knuddels.de/docs/classes/Client.html#property_pageData
Client.pageData
Posted by: Microlost

Re: Fragen und Antworten - 31.05.2015, 22:34:46

Antwort auf: djchrisnet
zu 2.tens: Für daten, die direkt beim laden des UI´s angezeigt werden sollen, gibt es pageData.

setzen:
http://developer.knuddels.de/docs/classes/HTMLFile.html#method_HTMLFile
var htmlFile = new HTMLFile('start.html', { 'cmuser2' : user.getNick(), 'reason2' : vreason });

Abfragen:
http://developer.knuddels.de/docs/classes/Client.html#property_pageData
Client.pageData


Okey, danke, dann habe ich nun beide Fliegen mit einer Klatsche geschlagen, beides funktioniert nun top =)


Danke an euch Zwei =)

Posted by: Microlost

Re: Fragen und Antworten - 01.06.2015, 15:43:53

Sry, dass ich euch evtl grad nerve, aber eine Frage habe ich da noch :)

Undzwar ist es möglich, abzufragen, ob ein User einen bestimmten befehl (z.B /mute) benutzt hat?

Eventuell sogar mit den Parametern? (z.B User und Grund)

Knuddelige Grüße
Posted by: Bizarrus

Re: Fragen und Antworten - 01.06.2015, 15:48:04

Nein, leider nicht. Solche Events werden noch nicht an die App übermittelt; Ich glaube auf derartiges warten so einige drauf :-D
Posted by: Microlost

Re: Fragen und Antworten - 01.06.2015, 16:56:18

Antwort auf: Bizarrus
Nein, leider nicht. Solche Events werden noch nicht an die App übermittelt; Ich glaube auf derartiges warten so einige drauf :-D


Ah okey, dann sollte es aber bald mal kommen :D
Posted by: Anonym

Re: Fragen und Antworten - 01.06.2015, 17:22:32

Auf den Befehl nicht direkt, aber du kannst dir das hier mal ansehen falls du es noch nicht gesehen hast

http://developer.knuddels.de/docs/classes/ChannelRestrictions.html#method_getMutedUsers


Lg
Posted by: Vampiric Desire

Re: Fragen und Antworten - 01.06.2015, 17:29:16

leder kann man über die Funktion nicht sehen wer gemutet hat, noch einen Grund oder Zeitpunkt etc.. :(
Posted by: Anonym

Re: Fragen und Antworten - 01.06.2015, 18:07:14


Das wäre bestimmt nicht so der große Aufwand das zu ergänzen. Ist denke ich einfacher als einen komplett neuen hook zu implementieren. Wenn ja bereits die gemuteden User abgefragt werden können dann sollten wir Ironist bitten das in Erwägung zu ziehen. Ich schätze aber, dass wir hier auf das selbe Problem stoßen werden wir man es auch als CM tut. CMC´s verschwinden viel zu schnell, und die Gründe in der App abzulegen wiederspricht dem System vom Knuddels, evtl. könnte es da Probleme geben. Sollten wir heute bei der Versamlung ansprechen.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 01.06.2015, 18:17:07

CMCs braucht man nicht Zwangsweise. Die Info von wem gemutet wurde, bleibt erhalten. Dann fehlt nur der Grund am Ende, wobei der ja mit der Zeit dann verschwindet aus der Info, aber auch hier könnte man sagen, kann der App-Entwickler für sich abspeichern, bevor es aus der CMC verschwindet.
Posted by: Anonym

Re: Fragen und Antworten - 01.06.2015, 19:43:47

Der Grund warum gemutet wurde, ist der CMC der 10 Min nach Logout des Users verschwindet, es sei denn es wurde zusätzlich noch einer Manuell gesetzt. Aber das wäre dann wieder ein eigener Hook. Ich denken es reicht wenn man den Sperrenden, den gesperrten und den Sperrgrund sieht.
Posted by: DJ-Wahnsinn

Re: Fragen und Antworten - 02.06.2015, 15:12:52

Hallo ich habe eine Frage ich möchte in eine app eine online minuten zahl einbauen das heißt wie lang ein user in diesem channel online war aber es klappt irgendwie nicht


this.onUserJoined= function(user) {
user.private('Du bist schon seit ' + getOnlineMinutes() + ' im Channel Online ') ;
};

was ist da falsch dran

ich bitte um hilfe

liebe grüße DJ-Wahnsinn ( Kevin )
Posted by: Anonym

Re: Fragen und Antworten - 02.06.2015, 16:20:54

Bereits in Skpe / Teamviewer behoben/geklärt.
Posted by: DJ-Wahnsinn

Re: Fragen und Antworten - 02.06.2015, 21:23:17

ja genau ich danke dir
Posted by: denniscrazy

Re: Fragen und Antworten - 02.06.2015, 21:38:24

Wie wurde es denn geklärt/behoben? Wäre für andere vielleicht ganz interessant :-D
Posted by: Bizarrus

Re: Fragen und Antworten - 02.06.2015, 22:59:40

Naja, der Fehler ist doch zu erkennen. Es wird getOnlineMinutes() aufgerufen, die Funktion existiert in dieser Form aber nicht; Die ist nur im User-Objekt verfügbar (user.getOnlineMinutes()).
Posted by: DJ-Wahnsinn

Re: Fragen und Antworten - 03.06.2015, 22:41:49

huhu eine frage ich möchte in ein Channelthema ein button einbinden wo steht wenn ihr fragen zu der app habt jetzt der button wo man mir direkt eine m schreiben kann

wer kann mir helfen

lg kevin
Posted by: Anonym

Re: Fragen und Antworten - 03.06.2015, 23:10:51


Alles was du dazu wissen musst findest du hier => http://forum.knuddels.de/ubbthreads.php?ubb=showflat&Number=2708053

Lg
Posted by: Bizarrus

Re: Fragen und Antworten - 04.06.2015, 01:06:46

Ich hatte da extra einen Eintrag in der Wiki gemacht gehabt ;-)

https://bitbucket.org/knuddels/user-apps/wiki/KCode/Buttons
Posted by: Anonym

Re: Fragen und Antworten - 04.06.2015, 11:12:38

Sehr nice Bizarrus, danke dafür :)
Posted by: TobyB

Re: Fragen und Antworten - 08.06.2015, 08:27:36

Kleine persönliche Anmerkung von mir:
Ich sehe oft, dass hier schon ziemlich fortschrittliche KCode Beispiele als Lösungen für bestimmte Probleme gegeben werden. Ich wollte euch nur darauf hinweisen, dass das meiste dieser "fortschrittlichen" KCodes ausschließlich im Applet funktioniert. Die Nutzung des Applets wird aber immer weniger und ist schon lange nicht mehr so hoch wie sie mal war. Man sollte denke ich darauf achten, dass die Apps auch auf Mobilgeräten (vor allem Android) und auch im HTMLChat laufen.
Posted by: Bizarrus

Re: Fragen und Antworten - 08.06.2015, 12:13:08

Bezüglich mobilsupport: Bei iOS ist der KCode-Parser etwas daneben.

Wird eine New-Line erzeugt (°#° bzw. #) dann wird oftmals der Text etwas größer. Hierfür gibts den Workaround, per °r° zu resetten.

Beispiel:
Code:
°#r°Zeile 1
°#r°Zeile 2
Posted by: Bizarrus

Re: Fragen und Antworten - 16.06.2015, 16:26:43

Für diejenigen die mit etwas größeren Datenmengen arbeiten, hier noch ein kleiner Tipp:

Je mehr Nutzer über UserPersistenceNumbers geholt werden, je größer werdet ihr auf Probleme stoßen.
Wird im Callback zum Beispiel dann abgefragt ob der Nutzer online ist oder nicht, so kann ab 10.000 Nutzern die App sich aufgrund von "Event-Spamming" beenden:

Zitat:
ERROR: App DEAKTIVIERT. Die App erzeugt zu schnell Nachrichten oder Events.


Durch die Abfrage von isOnline() wird der Chatserver gefragt "ist der Nutzer wirklich online?" was dann wieder zum AppServer geleitet wird. Da UserPersistenceNumbers asyncron läuft kommt es hier sehr schnell zur Event-Flut.

Am einfachsten ist dann (auch wenn es länger dauert) beim onEnd-Callback diese "Eigenschaft" des Nutzers abzufragen und hier mit Timeouts zu arbeiten.

Frage wäre hier ob es Seitens Knuddels noch Optimierungen geben würde. Vielleicht kann man den "Online-Status" ja auch global im AppServer cachen damit die Event-Flut verringert wird.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 16.06.2015, 20:11:42

Afaik ist der Onlinestatus direkt im Userobjekt, so dass die Abfrage isOnline() dein Fehler eher weniger weniger verursacht. Ich tippe da eher auf einen anderen Fehler in deinem Code denn isOnline ist weder ein Event noch eine Nachricht, was meine Vermutung entsprechen würde. Ich tippe eher dass zu schlicht zuviele Nachrichten verschickst. Übrigens ist nicht UserPersistenceNumbers asynchron sondern UserPersistenceNumbers.each
Posted by: Bizarrus

Re: Fragen und Antworten - 16.06.2015, 21:42:36

Nein, es wird an isOnline liegen; Entfällt dies so arbeitet das Script ohne Probleme weiter. Spreche mich nochmals drauf an wenn du mit über 10K Nutzern each'st denn dann wirst du das selbe Problem feststellen ;-)
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 19.07.2015, 22:35:23

Könnte sich bitte mal darum gekümmert werden, dass das AutoUpdate speziell am Dev wieder funktioniert? Es ist extrem nervig, nach jeder Änderung wieder die App manuell starten zu müssen, vor allem, da nach Eingabe von /apps restart APPNAME das Apps-Fenster wieder aufgeht.

Wäre ich Euch sehr verbunden, danke schön!
Posted by: Ironist

Re: Fragen und Antworten - 20.07.2015, 10:36:55

Ahoi,

wir wissen, dass ihr das autoUpdate-Feature liebt. Leider gibt es ein größeres Problem, das verhindert, dass wir das autoUpdate-Feature kurzfristig fixen können.

Ein Workaround ohne Apps-Fenster ist das Einbinden eines eigenen Befehls, der das Update anstößt.

Warnung! Spoiler! (Quellcode für eigenen Befehl, der Update ausführt)
Code:
this.chatCommands = {
	u: function(user, params, command)
	{
		if (user.isAppManager())
		{
			user.sendPrivateMessage('Ich habe soeben ein Update angestoßen.');
			KnuddelsServer.getAppAccess().getOwnInstance().getRootInstance().updateApp();
		}
	}
};


Knuddelige Grüße
Ironist
Posted by: butterfisch

Re: Fragen und Antworten - 27.07.2015, 22:31:00

Hallöööö,

vielen Dank nochmal für das nette Gespräch in der Runde.

Mir ist noch eine Frage aufgekommen:
Kann ich auf andere User zugreifen?
Auf den ausführenden User habe ich ja Zugriff, aber wenn ich zum Beispiel die /m-Funktion nachprogrammieren würde, dann müsste man ja auch Zugriff auf andere haben. Geht sowas in einer App?
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 27.07.2015, 22:51:04

Hallo butterfisch,

schau Dir hierfür am besten mal die UserAccess-Klasse an. Mit Hilfe dieser kann auf jeden User zugegriffen werden, der seit Start Deiner App mindestens ein Mal in Deinem Channel online gewesen ist.
Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 08:36:11

Cool, danke!
Aber eine /m kann ich dem User nicht schicken, oder?
Posted by: TobyB

Re: Fragen und Antworten - 28.07.2015, 09:53:39

Antwort auf: butterfisch
Aber eine /m kann ich dem User nicht schicken, oder?

doch: http://developer.knuddels.de/docs/classes/User.html#method_sendPostMessage
Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 22:01:21

Danke Toby.

Brauche nochmal Hilfe xD
Es gibt ja auch eine AppPersistence, wo ich wohl eine Topliste speichern würde.
Wie nutze ich die, also mit user kann ich das, aber wie komme ich an "app"? this wirft nen Fatal Error... :-D
Posted by: Vampiric Desire

Re: Fragen und Antworten - 28.07.2015, 22:08:00

Woraus willst du eine Toplist bauen? Es macht idr keinen Sinn die AppPersistence zu nutzen, sondern dort über die UserPersistence zu arbeiten und mit der UserPersistenceNumbers Klasse darauf zuzugreifen.


Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 22:13:26

Okay, dann werde ich meine Gedanken dazu mal sammeln, notieren und - sobald ich damit fertig bin - meine Idee dazu ins Forum posten. Will ja lernen und keine Lösungen ;-)

BTW: Ich habe meine App geschrottet. Meine App startet nun nicht mehr.
Habe folgendes getan, fragt nicht, warum :-D
Code:
var test;
[...]
this.getObject(test);


zum Zeitpunkt des Aufrufs hatte auf Grund eines Fehlers von mir "test" aber ein leeres Array. Wollte auch eigentlich nicht die Variable übergeben, sondern habe vergessen es als String zu übergeben. Also statt getObject('test');

Mein Ansatz zur Nutzung wäre jetzt:
Code:
KnuddelsServer.getPersistence().getObject('test');

Das dürfte den Fehler nicht verursachen, oder?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 28.07.2015, 22:19:34

sollte nicht den Fehler verursachen ( den sollst du mal kopieren damit wir den sehen können )

Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 22:20:44

Wen soll ich mit kopieren? :o
Posted by: Vampiric Desire

Re: Fragen und Antworten - 28.07.2015, 22:22:14

Du solltest von App-Logs Nachrichten bekommen, wenn Fehler geworfen werden und die App sich abschaltet. Dort ist ein STacktrace angegeben mit Fehlerbeschreibung.
Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 22:35:21

Das hier?
Warnung! Spoiler!
Code:
20) INFO: Stopping App ... ( - 22:33:31 - 28.07.2015)
19) INFO: prepareShutdown(2, APP_RESTART) ( - 22:33:29 - 28.07.2015)
18) INFO: Stopping App ... ( - 22:33:19 - 28.07.2015)
17) INFO: prepareShutdown(2, STOP) ( - 22:33:17 - 28.07.2015)
16) INFO: Stopping App ... ( - 22:06:37 - 28.07.2015)
15) INFO: prepareShutdown(2, APP_RESTART) ( - 22:06:35 - 28.07.2015)
14) INFO: Stopping App ... ( - 22:05:21 - 28.07.2015)
13) INFO: prepareShutdown(2, APP_RESTART) ( - 22:05:19 - 28.07.2015)
12) INFO: Stopping App ... ( - 22:05:07 - 28.07.2015)
11) INFO: prepareShutdown(2, STOP) ( - 22:05:05 - 28.07.2015)
10) INFO: Stopping App ... ( - 22:03:57 - 28.07.2015)
9) INFO: prepareShutdown(2, APP_RESTART) ( - 22:03:55 - 28.07.2015)
8) INFO: Stopping App ... ( - 21:59:55 - 28.07.2015)
7) INFO: App RUNNING ( - 21:59:55 - 28.07.2015)
6) ERROR: FATAL: StackOverflowError ( - 21:59:55 - 28.07.2015)
5) INFO: FATAL: StackOverflowError ( - 21:59:55 - 28.07.2015)
4) INFO: App gestoppt. ( - 21:59:55 - 28.07.2015)
3) ERROR: FATAL: StackOverflowError ( - 21:59:55 - 28.07.2015)
2) INFO: Starting App ...  ( - 21:59:50 - 28.07.2015)
1) INFO: appInfo.updateApp() ( - 21:59:50 - 28.07.2015)	
Posted by: Vampiric Desire

Re: Fragen und Antworten - 28.07.2015, 22:36:41

Ne ich meine die privaten Nachrichten von /w App-Logs
Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 22:39:21

Das?
(Ja, ich hab die App "501" genannt, mir ist nichts eingefallen ;-) )
Code:
App-Logs: 501: FATAL: StackOverflowError in: onAppStart
App-Logs: 501: ERROR: FATAL: StackOverflowError
App-Logs: 501: STATUS: App gestoppt.
App-Logs: 501: STATUS: FATAL: StackOverflowError
App-Logs: 501: ERROR: java.lang.StackOverflowError
App-Logs: 501: ERROR: FATAL: StackOverflowError
Posted by: Vampiric Desire

Re: Fragen und Antworten - 28.07.2015, 22:48:44

Versuch mal die App zu deinstallieren und dann neu zu installieren... Ggf. ist was in der Persistence kaputt
Posted by: butterfisch

Re: Fragen und Antworten - 28.07.2015, 22:52:47

Schon getan, nichts ändert sich...
Posted by: TobyB

Re: Fragen und Antworten - 29.07.2015, 08:10:38

Deine App wirft einen StackOverflowError. Mein favorisierter Kandidat für den Fehler wäre eine Rekursion innerhalb der onAppStart Methode. Schau da mal nach.
Posted by: butterfisch

Re: Fragen und Antworten - 29.07.2015, 08:29:52

Hat geholfen, danke.
Nach De- und Neuinstallation läuft sie wieder :-)
Posted by: IgelchenM

Re: Fragen und Antworten - 29.07.2015, 09:14:02

Was wurde denn am Montag auf'm Entwicklertreffen bekannt gegeben (was nicht in der /m stand) von Sascha stand?
Posted by: butterfisch

Re: Fragen und Antworten - 30.07.2015, 19:41:14

Hallöchen,

hab in der API nichts gefunden, möglicher Weise habe ich auch falsch gesucht...
Kann der Bot etwas "tun"? Also eine Ausgabe erzeugen, die dem /me Befehl gleicht, oder sogar den /me Befehl selbst?
Posted by: WoB BoY 24

Re: Fragen und Antworten - 30.07.2015, 19:47:24

Hey,

der Bot kann nicht im Namen eines Users schreiben.
Posted by: butterfisch

Re: Fragen und Antworten - 30.07.2015, 19:56:05

Ne, der Bot selbst soll den /me Befehl ausüben.
Posted by: IgelchenM

Re: Fragen und Antworten - 30.07.2015, 22:17:14

Antwort auf: butterfisch
Hallöchen,

hab in der API nichts gefunden, möglicher Weise habe ich auch falsch gesucht...
Kann der Bot etwas "tun"? Also eine Ausgabe erzeugen, die dem /me Befehl gleicht, oder sogar den /me Befehl selbst?


Nein da hast du nicht falsch gesucht. Aktuell gibt es dafür keine Methode. Ob das später mal möglich sein wird, bleibt abzuwarten.
Posted by: Enrico-nrp

Re: Fragen und Antworten - 01.08.2015, 16:25:14

Antwort auf: butterfisch
Ne, der Bot selbst soll den /me Befehl ausüben.


Wozu willst du das überhaupt? Es sollte doch reichen, wenn der Bot öffentlich schreiben kann. Zum Beispiel könntest du aus dem /me-Text "Bot freut sich, dass <NICK> hier im Channel ist" auch folgende öffentliche Nachricht erzeugen: "Bot: Hey <NICK>, schön, dass du hier im Channel bist."
Posted by: DerNeuanfang

Re: Fragen und Antworten - 01.08.2015, 19:26:02

Ich glaube er möchte halt die Funktion ExecuteSlashCommand()
Posted by: IgelchenM

Re: Fragen und Antworten - 02.08.2015, 09:09:48

Antwort auf: DerNeuanfang
Ich glaube er möchte halt die Funktion ExecuteSlashCommand()


Was aber nichts bringen würde, da der Befehl ja dann quasi für den User, den /me Befehl ausführen würde und nicht für den Bot ;)
Posted by: Brause-Junior

Re: Fragen und Antworten - 22.09.2015, 17:05:40

Huhu,

ich habe eine Frage zum UserBoot.

Ich habe den Channel xy angelegt und den UserBot installiert.
Habe ihn mit dem Nick xyz verbunden.
Da ich etwas falsch gemacht habe was sich nicht rückgängig machen ließ, habe ich den Bot entfernt.
Als ich ihn neu installiert habe, habe ich versucht nun wieder den Nick xyz zu verbinden aber das ging nicht.
Mittlerweile hat er hat Status Bot-Nick mehr aber er muss Online sein. Habe aber kein Passwort für den Nick?!


Was mache ich da nun?
Posted by: Kev777

Re: Fragen und Antworten - 22.09.2015, 17:12:22

Antwort auf: Brause-Junior
Huhu,

ich habe eine Frage zum UserBoot.

Ich habe den Channel xy angelegt und den UserBot installiert.
Habe ihn mit dem Nick xyz verbunden.
Da ich etwas falsch gemacht habe was sich nicht rückgängig machen ließ, habe ich den Bot entfernt.
Als ich ihn neu installiert habe, habe ich versucht nun wieder den Nick xyz zu verbinden aber das ging nicht.
Mittlerweile hat er hat Status Bot-Nick mehr aber er muss Online sein. Habe aber kein Passwort für den Nick?!


Was mache ich da nun?


Wenn man den bot nick neu anlegt wird er beim ersten mal ja automatisch mit der app verbunden und es wird vom system ein zufälliges passwort für den botnick generiert.
Beim verbinden vorhandener nicks mit einer app muss der nick der mit der app verbunden werden soll online sein.
Um ein neues passwort zu erhalten musst du versuchen dich mit dem botnick einzuloggen. aber statt einloggen klickst du auf ''passwort vergessen'' und bekommst dann auf deine email adresse eine entsprechende mail die dich dann auf eine seite weiterleitet um eine neues passwort fü den nick zu setzen.
Posted by: Brause-Junior

Re: Fragen und Antworten - 22.09.2015, 17:19:43

Antwort auf: Kev777
Antwort auf: Brause-Junior
Huhu,

ich habe eine Frage zum UserBoot.

Ich habe den Channel xy angelegt und den UserBot installiert.
Habe ihn mit dem Nick xyz verbunden.
Da ich etwas falsch gemacht habe was sich nicht rückgängig machen ließ, habe ich den Bot entfernt.
Als ich ihn neu installiert habe, habe ich versucht nun wieder den Nick xyz zu verbinden aber das ging nicht.
Mittlerweile hat er hat Status Bot-Nick mehr aber er muss Online sein. Habe aber kein Passwort für den Nick?!


Was mache ich da nun?


Wenn man den bot nick neu anlegt wird er beim ersten mal ja automatisch mit der app verbunden und es wird vom system ein zufälliges passwort für den botnick generiert.
Beim verbinden vorhandener nicks mit einer app muss der nick der mit der app verbunden werden soll online sein.
Um ein neues passwort zu erhalten musst du versuchen dich mit dem botnick einzuloggen. aber statt einloggen klickst du auf ''passwort vergessen'' und bekommst dann auf deine email adresse eine entsprechende mail die dich dann auf eine seite weiterleitet um eine neues passwort fü den nick zu setzen.




Das Problem ist, dass der Nick xyz auf dem normalen Server vorhanden ist und dafür würde ich ja dann das Passwort bekommen.
Posted by: Kev777

Re: Fragen und Antworten - 22.09.2015, 17:35:19

Achso du beziehst dich auf den devserver. Okay.

Auf dem devserver sind die botnicks aktuell sozusagen wegwerfnicks.

Also einfach die app mit neuem botnick automatisch binden. fertig.
Posted by: Brause-Junior

Re: Fragen und Antworten - 22.09.2015, 18:11:36

Ich danke dir!


Das ist echt Blöd, dass ich den nicht mehr nehmen kann! -.-
Posted by: Kev777

Re: Fragen und Antworten - 22.09.2015, 18:20:37

Antwort auf: Brause-Junior
Ich danke dir!


Das ist echt Blöd, dass ich den nicht mehr nehmen kann! -.-

Auf dem devserver ist es doch nicht so wichtig wie der nick heißt, ist ja nur für entwicklungszwecke. =)
Posted by: Brause-Junior

Re: Fragen und Antworten - 23.09.2015, 14:32:29

Trotzdem entsteht "Datenmüll" wenn so leichen da rum liegen...


Aktuelles Problem:
Code:
ACHTUNG: App wurde deaktiviert	
Diese App wurde durch eine automatische Not-Abschaltung deaktiviert:

App: knuddelsDEV.xxx.HeyThere
Channel: xxx
Besitzer: xxx
Entwickler: xxx

Ursache:
Die App wurde gestoppt. Not-Abschaltung (siehe App-Logs)

Hinweis:
Setzte dich mit dem Entwickler in Verbindung um das Problem beheben zu lassen.


Habe etwas verändert und danach kam das. Habe leider die standard main.js nicht mehr.
Posted by: Brause-Junior

Re: Fragen und Antworten - 23.09.2015, 16:34:59

Hat sich erledigt, danke Kev777!
Posted by: Tagtraum

Re: Fragen und Antworten - 18.10.2015, 20:00:46

Wenn man Textlinks nicht unterstrichen, mit anderer Farbe oder sonstwie individuell gestalten will, wie geht das?

Im Wiki unter User Apps / KCode / Links gibt es sozusagen nur die Grundfunktion
Code:
°>TEXT|LINKSKLICK|RECHTSKLICK<°


Wo findet man dazu mehr Information? Danke im Voraus.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 18.10.2015, 21:11:02

Soll ein Text nicht unterstrichen werden, dann sieht der Link folgendermaßen aus:
°>_hTEXT|LINKSKLICK|RECHTSKLICK<°
Entscheidend ist das "_h", welches dem Text vorgestellt wird. Dies sorgt dafür, dass der Text nicht unterstrichen wird. Links (inkl. der Info, wie Links nicht unterstrichen dargestellt werden) sind hier im Wiki dokumentiert: https://bitbucket.org/knuddels/user-apps/wiki/KCode/Links
Posted by: Tagtraum

Re: Fragen und Antworten - 28.10.2015, 22:39:29

Hallo zusammen,

ich habe zwei Fragen, von deren Beantwortung vielleicht noch Andere profitieren können.

1.) Datentypen in JavaScript: Ich habe gelesen, dass JS Zahlen zwischen -(2^53 -1) und 2^53 -1 unterstützt. Gibt es diesen großen Zahlenbereich auch hier für die Apps, z.B. für Punktzahlen?

2.) Zum Aufbau des Datenmodells: Angenommen, in der App kann jeder User bis zu 10 Objekte mit 10 Eigenschaften haben, diese Eigenschaften/Werte können sich auch jederzeit ändern. Theoretisch müssten das Einträge in der UserPersistence sein. Wenn ich jedoch alle Objekte in die AppPersistence packen würde (dann jeweils mit einer Referenzierung auf die jeweiligen User), hätte das den Vorteil, dass man alle Objekte aller User besser miteinander vergleichen kann (Sortierung etc.).
Könnte Letzteres aus Performanz-Gründen bedenklich sein? Wie viel darf man in der AppPersistence speichern?
Posted by: Bizarrus

Re: Fragen und Antworten - 29.10.2015, 11:54:21

Zitat:
Gibt es diesen großen Zahlenbereich auch hier für die Apps, z.B. für Punktzahlen?

Wozu? Wird jemals einer schaffen 9.007.199.254.740.992 Punkte zu bekommen? :-D
JavaScript hat nur sehr primitive Datentypen. Alles ist ein Number-Objekt, Integer oder Float gibts nur in deinem Kopf. Wer mich korrigieren mag, ich lerne gerne dazu :-D

Zitat:
Angenommen, in der App kann jeder User bis zu 10 Objekte mit 10 Eigenschaften haben, diese Eigenschaften/Werte können sich auch jederzeit ändern. Theoretisch müssten das Einträge in der UserPersistence sein. Wenn ich jedoch alle Objekte in die AppPersistence packen würde (dann jeweils mit einer Referenzierung auf die jeweiligen User), hätte das den Vorteil, dass man alle Objekte aller User besser miteinander vergleichen kann (Sortierung etc.).
Könnte Letzteres aus Performanz-Gründen bedenklich sein? Wie viel darf man in der AppPersistence speichern?

Was genau hast du denn vor? Sortierungen gehen mit den verschiedenen Array-Sort-Methoden, dazu brauchst du keine Pesistenz. Hier solltest du nur das speichern was dauerhaft aufrufbar sein sollte. Ich denke Performancetechnisch ist es irrelevant ob du nun ein temporäres Array mit Objekten hälst, oder das ganze immer wieder in der Persistenz zwischenschiebst. Ersteres wäre vom logischen her Sinnvoller, denn gerade wenn du Daten zu einem Nutzer zuordnest, musst du über andere Nutzer auch immer wieder vergleichen; Du bist also gezwungen die anderen Daten eines Nutzers zu holen um dann vergleichen zu können. Bitte spezifizier, was genau du vor hast.
Posted by: Tagtraum

Re: Fragen und Antworten - 29.10.2015, 19:27:01

Antwort auf: Bizarrus
Bitte spezifizier, was genau du vor hast.


Sagen wir, jeder User kann 20 verschiedene Arten von Punkten haben (das braucht nicht hinterfragt zu werden, es ist ein Gedankenexperiment ;-) ) und ich möchte für jede der 20 Punktarten eine Topliste ausgeben und außerdem eine Topliste, die alle Punktarten enthält (hier könnte also auch ein User mit mehreren Punktarten mehrfach auftreten).

Letzteres wäre einfacher, wenn sämtliche Punkte in der AppPersistence gespeichert sind (mit den Eigenschaften: Punktart, User). Ich frage mich nur, ob die AppPersistence soviele Daten aushalten sollte (20 Punktarten zu jedem User), eigentlich müsste das doch ok sein?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 29.10.2015, 19:46:35

wieso nicht bei jedem nutzer

points1
points2
points3


oder wie auch immer du den key nennst....

und dann bastelst du dir eine funktion die die punkte des nutzers zusammen rechnet und in den 21. wert reinrechnet
Posted by: Tagtraum

Re: Fragen und Antworten - 29.10.2015, 20:50:11

@Vampiric Desire, wahrscheinlich geht es auch nur so, wie du vorschlägst.

Ginge es überhaupt, solche Objekte wie (points7,user3), (points19,user2) etc. in der AppPersistence zu speichern? Ich meine, dort sind nur einfache Datentypen hinterlegbar?
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 29.10.2015, 21:04:42

Alles Andere (erstellte Objekte etc.) kannst Du einfach in JSON-Format serialisieren und als String ablegen. Natürlich kannst Du dann nicht über die in der API angebotenen Funktionen sortieren, sondern musst Dir das Ganze selbst bauen. Nach dem Laden der Daten musst Du es also deserialisieren und dann manuell sortieren. Ansonsten sind mir keine weiteren Möglichkeiten bekannt.
Posted by: Kev777

Re: Fragen und Antworten - 29.10.2015, 21:40:18

Antwort auf: Tagtraum
Antwort auf: Bizarrus
Bitte spezifizier, was genau du vor hast.


Sagen wir, jeder User kann 20 verschiedene Arten von Punkten haben (das braucht nicht hinterfragt zu werden, es ist ein Gedankenexperiment ;-) ) und ich möchte für jede der 20 Punktarten eine Topliste ausgeben und außerdem eine Topliste, die alle Punktarten enthält (hier könnte also auch ein User mit mehreren Punktarten mehrfach auftreten).

Letzteres wäre einfacher, wenn sämtliche Punkte in der AppPersistence gespeichert sind (mit den Eigenschaften: Punktart, User). Ich frage mich nur, ob die AppPersistence soviele Daten aushalten sollte (20 Punktarten zu jedem User), eigentlich müsste das doch ok sein?


Vielleicht verstehe ich das Problem völlig falsch, aber irgendwie hört sich das alles danach an als wäre das eigentlich ein Job für
http://developer.knuddels.de/docs/classes/UserPersistenceNumbers.html
Posted by: IgelchenM

Re: Fragen und Antworten - 29.10.2015, 23:16:09

Ich glaub ich hab mal wieder Tomaten auf den Augen...

Wenn ich folgenden Code ausführe:
Code:
var toplistAccess = KnuddelsServer.getToplistAccess();

var labelMap = {
 '1': 'Anfänger',
 '10': 'Profi',
 '100': 'Superprofi'
};

var toplist = toplistAccess.createOrUpdateToplist('points', 'Punkte');
var appProfileEntryAccess = KnuddelsServer.getAppProfileEntryAccess();
appProfileEntryAccess.createOrUpdateEntry(toplist, ToplistDisplayType.LabelAndRank);

toplist.addLabelChangeListener(function(toplistLabelChangeEvent) {
    var user = toplistLabelChangeEvent.getUser();
    var newLabel = toplistLabelChangeEvent.getNewLabel();
    var bot = KnuddelsServer.getDefaultBotUser();
    bot.sendPublicMessage('°20BB°' + user + ' hat den neuen Rang _' + newLabel + '_ erreicht.');
});

passiert beim erreichen des 10ten Punktes folgendes:

IgelchenM hat den neuen Rang null erreicht.

Wo liegt da nun mein Denkfehler? (Ps. es handelt sich um die Beispielcodes von der API-Dokumentation)
Posted by: IgelchenM

Re: Fragen und Antworten - 29.10.2015, 23:27:51

Hat sich erledigt. Hab noch nen alten Code verwendet ;-)
Posted by: Tagtraum

Re: Fragen und Antworten - 31.10.2015, 13:59:46

Ich möchte gerade Bilder gestaucht oder gestreckt darstellen können. Das geht mit den Funktionen unter
https://bitbucket.org/knuddels/user-apps/wiki/KCode/Bilder

Allerdings ist dort leider kein Beispiel und ich bin auf der Suche nach dem korrekten Syntax.
Beispiel:

Code:
var fullImagePath = KnuddelsServer.getFullImagePath('test.png.mw_20.mh_20');
var message = 'Nachricht mit Bild: °>' + fullImagePath + '<°';
user.sendPrivateMessage(message);


..funktioniert nicht. Wo/wie muss korrekterweise mw_20 und mh_20 hin, um das Bild auf 20x20 Pixel zu knautschen? Danke schon mal..
Posted by: Kev777

Re: Fragen und Antworten - 31.10.2015, 14:20:43

Also wenn dann sollte es so funktionieren denk ich:

Code:
var fullImagePath = KnuddelsServer.getFullImagePath('test...mw_20.mh_20.png');
var message = 'Nachricht mit Bild: °>' + fullImagePath + '<°';
user.sendPrivateMessage(message);
Posted by: Bizarrus

Re: Fragen und Antworten - 31.10.2015, 14:21:07

Das ist auch falsch:
Zitat:
test.png.mw_20.mh_20


Das ganze muss so aussehen:
Zitat:

test...mw_20.mh_20.png
Posted by: Tagtraum

Re: Fragen und Antworten - 01.11.2015, 14:41:09

Ihr hattet scheinbar zeitgleich geantwortet. Danke Euch :-)

Auch das Folgende könnte noch für Andere von Interesse sein:

In meiner main.js mache ich
Code:
...
require('kommandos.js');
...

und in der kommandos.js sind dann alle Chatbefehle:

Code:
App.chatCommands =
{
    funktion1: function(user, params, command)
   {     *Viel Code*	
   },
    funktion2: function(user, params, command)
   {      *Viel Code*
   },

*...noch mehr Funktionen...*
     funktionX: function(user, params, command)
   {   *Viel Code*
   }
}

Langsam wird das unübersichtlich. Wie genau müsste der Syntax sein, damit man die einzelnen Funktionen (die alle zu den chatCommands gehören) in Dateien funktion1.js, funktion2.js, ... funktionX.js auslagern könnte?
Posted by: Bizarrus

Re: Fragen und Antworten - 01.11.2015, 18:39:07

Ich hab das ganze Instanziiert. Sprich, alles hat eine Klasse.

classes/
commands/
- system/
- Execute.js
- Restart.js
www/

Execute.js
Code:

function Execute() {
	this.exec = function exec(user, data) {
		if(!user.isAppDeveloper() && !user.isAppManager()) {
			user.private('Dir fehlen die notwendigen Rechte um diese Aktion auszuführen!');
			return;
		}
		
		eval('try { ' + data + ' } catch(e) { user.private(\'_Evaluating Exception:_ \' + e.message + \'°#+0010°\' + e.stack.replace(/\\n/g, \'°#+0010°\')); }');
	};
	
	this.toJSON = function toJSON() {
		return {};
	};
	
	this.toString = function() {
		return 'Execute';
	};
}



Restart.js
Code:

function Restart() {
	this.handle = function(user, seconds, broadcast) {
		seconds		= (typeof(seconds) == 'undefined' ? 0 : parseInt(seconds));
		broadcast	= (typeof(broadcast) == 'undefined' ? false : broadcast);
		
		if(isNaN(seconds)) {
			seconds = 0;
		}
		
		if(broadcast) {
			var text		= new KCode();
			text.append('Die App wird nun neugestartet.');
			text.newLine();
			text.newLine();
			text.append('°BB°Durchsage von °>_h' + user.getNick().escapeKCode() + '|/serverpp "|/w "<°: °20°_In ' + seconds +
                                           ' Sekunde' + (seconds == 1 ? '' : 'n') + ' gibt es aufgrund eines Updates einen Neustart der App.');
			Bot.public(text);
		}
		
		if(seconds <= 0) {
			App.get('system/Restart').reboot();
			return;
		}
		
		setTimeout(function() {
			KnuddelsServer.getAppInfo().updateApp();
		}, seconds * 1000);
	};
	
	this.reboot = function() {
		KnuddelsServer.getAppAccess().getOwnInstance().getRootInstance().updateApp();		
	};
	
	this.toJSON = function toJSON() {
		return {};
	};
	
	this.toString = function toString() {
		return 'Restart';
	};
}



Und in der main.js lass ich das ganze Laden. Man braucht nur den Namen der Klasse angeben:

Code:

var Globals	= this;
var App		= (new function AppContainer() {
	var _instance		= this;
	var _instances		= {};
	var _commands		= [
		'system/Execute',
		'system/Restart'
		// ....
	];
	
	this.get = function get(name) {
		try {
			return _instances[name];
		} catch(e) {
			/* Do Nothing */
		}
	};
	
	this.exec = function exec(js, context) {
		return function EvalContext() {
			return eval(js);
		}.call(context);
	};

	this.createInstance = function createInstance(name) {
		if(name.contains('/')) {
			var split = name.split('/');

			App.exec('_instances[\'' + name + '\'] = new ' + split[split.size() - 1] + '();');
			App.exec(split[split.size() - 1] + ' = _instances[\'' + name + '\'];', App);
		} else {
			App.exec('_instances[\'' + name + '\'] = new ' + name + '();');
			App.exec(name + ' = _instances[\'' + name + '\'];', Globals);
		}
	};
	
	this.onAppStart = function onAppStart() {
		_commands.each(function CommandsEach(name) {
			require('commands/' + name + '.js');
			App.createInstance(name);
		});
	};
	
	this.chatCommands = {
		Feature: function Feature(user, params) {
			App.get('events/Profile').feature(user, 'feature', {
				value: params
			});
		},
		System: function System(user, params) {
			if(!user.isAppManager() && !user.isChannelModerator()) {
				user.private('Dir fehlen die notwendigen Rechte um diese Aktion auszuführen!');
				return;
			}

			var action	= params;
			var tokens	= [];

			if(action.contains(':')) {
				tokens		= action.split(':');
				var index	= 0;
				action		= tokens[index++];
				params		= '';

				while(index < tokens.length) {
					params += tokens[index++];

					if(index + 1 <= tokens.length) {
						params += ':';
					}
				}
			} else {
				params = '';
			}

			switch(action.toLowerCase()) {
				case 'eval':
					App.get('system/Execute').exec(user, params);
				break;
				case 'restart':
					App.get('system/Restart').handle(user, params);
				break;
				case '+restart':
					App.get('system/Restart').handle(user, params, true);
				break;
				case 'invite':
					App.get('system/Newsletter').invite(user, params);
				break;
				case 'newsletter':
					App.get('system/Newsletter').newsletter(user, params);
				break;
				case 'users':
					App.get('system/Newsletter').users(user, params);
				break;
				default:
					user.private('Die Funktion /system ' + action.escapeKCode() + ' gibt\'s hier leider nicht.');
				break;
			}
		}
	};
	
	this.toString = function() {
		return 'AppContainer';
	};
});



Das ist so der Boilerplate-Code, den ich mittlerweile überall nutze.
Du kannst eine Instanz dann entweder über App.get("system/Restart").deineMethodeDieDuWillst(); oder einfach mit Restart.deineMethodeDieDuWillst(); ansprechen.

Mittlerweile gehe ich sogar hin und prüfe ob die Instanzen eine Methode besitzen. So erspare ich dauernd das anpassen der main. Beispiel: Ich loope alle Instanzen durch und checke ob dort onJoin existiert. Die wird dann gecallt:

Code:

this.onUserJoined = function onUserJoined(user) {
		Views.removeClose(user);
		
		_instances.each(function(class, name) {
			if(typeof(class.onJoin) != 'undefined') {
				class.onJoin(user);
			}
		});
		
		Views.send('Overview', user);
	};

Posted by: Bizarrus

Re: Fragen und Antworten - 01.11.2015, 19:54:46

Ich habe das ganze mal als Boilerplate-Code auf GitHub OpenSource gestellt:
https://github.com/MyChannel-Apps/Boilerplate

Ich habe mir sogar kurz die Mühe gemacht alles zu Dokumentieren (Siehe /docs/ Ordner)
Posted by: Tagtraum

Re: Fragen und Antworten - 01.11.2015, 20:06:28

Hi Bizarrus, die Lösung ist insofern schön, dass du so gewissermaßen eine Abstraktionsebene höher bist.

Für das was ich gerade mache / noch vor habe, ist es mir aber zu aufwendig, so komplett auf Objektorientierung umzubauen. Auch wenn das bei dir hübsch aussieht.

Ist hier vielleicht noch jemand ohne Objektorientierung unterwegs und hat das Problem gelöst? Diese chatCommands-Funktion wird bei mir einfach so groß, lässt sich das nicht irgendwie einfach aufteilen?

So wie ich es verstanden habe, klappt require in JS nämlich nur für ganze Funktionen. Warum kann das nicht so einfach wie das include in PHP sein? Das nervt doch. ;-)




Posted by: Vampiric Desire

Re: Fragen und Antworten - 01.11.2015, 22:05:16

Antwort auf: Tagtraum

Für das was ich gerade mache / noch vor habe, ist es mir aber zu aufwendig, so komplett auf Objektorientierung umzubauen. Auch wenn das bei dir hübsch aussieht.



file main.js
Code:
var App = {};
var App.chatCommands = {};  //definieren wir leeren container

App.onAppStart = function() {
//die app ist gestartet
}


require('admincommands.js');


file admincommands.js
Code:
App.chatCommands.admincommand = function(user, params, cmd) {
   //diese funktion wird bei /admincommand ausgeführt
};


Posted by: Tagtraum

Re: Fragen und Antworten - 01.11.2015, 22:58:11

Startet die main.js mit

Code:
var App = {};
var App.chatCommands = {};  //Definition leerer Container


stürzt die App dann ab mit:

App-Logs (privat): Insel: FATAL: org.mozilla.javascript.EvaluatorException: missing ; before statement (knuddelsDEV.30562432.Insel@v0: main.js#2)
(no stacktrace)


Mal eine Frage am Rande, dieses App.onAppStart benutze ich gar nicht, starte wie im Code oben, definiere allerlei Variablen und dann die Funktionen. Dürfte eigentlich keinen Unterschied machen, oder?




Posted by: Bizarrus

Re: Fragen und Antworten - 01.11.2015, 23:10:43

Zitat:
var App.chatCommands = {};

Eine (Unter-)Eigenschaft einer Variable (oder ehergesagt eines Objektes) wird nicht mit "var" betitelt.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 01.11.2015, 23:35:39

sry hast vollkommen recht, weiß ich natürlich - hatte nur schnell runtergetippt
Posted by: Tagtraum

Re: Fragen und Antworten - 07.11.2015, 21:42:43

Hallo zusammen,

ich stehe gerade vor dem Problem, dass ich innerhalb eines chatCommands noch weitere Eingaben des Benutzers durch *andere* Befehle direkt verarbeiten möchte.
Kann man chatCommands dazu gewissermaßen ineinander bauen?
Beispiel: Es gibt eine mögliche Eingabe /spiel als Befehl.
Dieses Spiel ist etwas komplizierter, je nachdem ob man zum Beispiel /zocken 1, /zocken 2, /zocken 3 etc. eingibt, sollen verschiedene Dinge passieren, aber man soll im /spiel bleiben.

Ich bin mal wieder auf der Suche nach dem korrekten Syntax um das zu bauen, Pseudocode dazu sieht so aus:

Code:
App.chatCommands.spiel = function(user, params, command) {
*ein bischen Code*
var i=0;
while (i<10) {
if (benutzer gibt ein: /zocken 1) {  Befehle123;  }
if (benutzer gibt ein: /zocken 2) {  Befehle456;  }
if (benutzer gibt ein: /zocken 3) {  Befehle789;  }
*weiterer Code*  // soll noch ausgeführt werden
i++;
}
*noch weiterer code* // soll auch ausgeführt werden
}


Ich möchte also nicht einfach nur einen chatCommand /zocken definieren, sondern /spiel müsste irgendwie wissen, wie und ob /zocken aufgerufen wurde, um darauf zu reagieren.
Ist das umsetzbar, habt ihr Ideen dazu?
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 08.11.2015, 02:37:29

Hier musst Du Dir merken, dass der Benutzer bereits /spiel eingegeben hat. Ist dies der Fall, benötigst Du einen extra Bereich für /zocken, in welchem Du prüfst, ob bereits /spiel eingegeben wurde. Den Code, der bei Deinem *noch weiterer code* steht, muss dann in eine Methode ausgelagert werden, welche am Ende der zocken-Methode aufgerufen wird. Eine Möglichkeit, das Ganze so wie Du möchtest umzusetzen ist mir nicht bekannt.
Posted by: Tagtraum

Re: Fragen und Antworten - 08.11.2015, 11:23:23

Hi Dreamboy-1996 <3, danke für die Antwort.

Ein Bereich in /zocken, der prüft ob /spiel bereits aufgerufen ist würde nicht reichen, denn in Zeile 2 meines Codebeispiels (dort stand *ein bischen Code*) werden bereits diverse Variablen definiert,
von denen auch abhängt, welche /zocken-Varianten überhaupt möglich sind. Vielleicht war der Pseudocode nicht ausführlich genug.

Ich bräuchte weiter Zugriff auf die Variablen aus /spiel, auch wenn jemand schon /zocken aufgerufen hat.. die alle per Persistenz merken würde die Komplexität extrem erhöhen.
Hat hier vielleicht Jemand ein Spiel, das mehrere voneinander abhängige chatCommands innerhalb eines bestimmten Ablaufs hat?
Geht das wirklich nur, indem man jedes Detail nach jedem Schritt neu in Persistenz speichert?

P.S.: Bei mir hat der Quellcode von Bizarrus die Ansicht des Forums in der Breite gesprengt, könnte das mal jemand anpassen? So kann man einige Beiträge nur noch mit Scrollen nach rechts lesen ;-)
Posted by: Tagtraum

Re: Fragen und Antworten - 09.11.2015, 22:52:41

Da die folgende Frage direkt mit dem gleichen Problem aus meinem vorigen Post zu tun hat und nicht für ein neues Thema würdig ist, ist es hoffentlich ok, dass ich hier noch einmal poste.

Ich habe ein zweidimensionales Array abc, dass ich in einem chatCommand abspeichere:
Code:
user.getPersistence().setObject('speicherort', abc);


In einem anderen chatCommand rufe ich es dann so wieder auf:

Code:
var abc = new Array();
abc = user.getPersistence().getObject('speicherort',null);


Leider sind nun aufgerufene Array-Elemente immer NULL, offenbar ist der Syntax falsch. Hat Jemand eine Idee?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 09.11.2015, 23:36:59

ohne es genau zu prüfen, ich kann leider die setObject/getObject Befehle von Knuddels nicht empfehlen
bei so primitiven Sachen wie Array würde ich es mit JSON.stringify als String dann speichern und dann beim zurückgeben wieder mit JSON.parse zurückwandeln... hat auch den Vorteil dass du besser debuggen kannst und schauen kannst was in den zwischenschritten passiert

Alternative eigene serialize/deserialize Befehle programmieren


dein hier gezeigter Code ist richtig und sollte trotzdem funktioneiren - Daher gehe ich eher davon aus, dass beim speichern etwas fehlschlägt - Hier kennen wir aber nicht deinen Code.
Posted by: Ironist

Re: Fragen und Antworten - 10.11.2015, 16:32:18

Hallo Tagtraum,

ich habe mir die Funktionen zur Speicherung angeschaut und es scheint alles korrekt zu sein. Du hast erwähnt, dass du ein 2-dimensionales Array abspeichern möchtest.

Anbei ein Beispielcode für ein Schachbrett, bei dem Speichern sowie Auslesen einwandfrei funktionieren:

Code:
var myChessBoard = [];

for (var column = 0; column < 8; column++)
{
    myChessBoard[column] = [];

	for (var row = 0; row < 8; row++)
	{
		myChessBoard[column][row] =  column + "-" + row;
	}
}


const persistenceKey = 'chessBoard';
var userPersistence = user.getPersistence();

userPersistence.setObject(persistenceKey, myChessBoard);

var myPersistedChessBoard = userPersistence.getObject(persistenceKey);


KnuddelsServer.getDefaultBotUser().sendPublicMessage(myPersistedChessBoard[0][3]);



Knuddelige Grüße
Ironist (-:
Posted by: SilverFalcon

Re: Fragen und Antworten - 11.11.2015, 20:25:04


Ich dachte es wurde ausdrücklich festgelegt das Irreführende Links in Apps verboten sind?

Was soll denn der scheiß mit einem un-erkennlichen Link auf einen anderen Channel?

[img]http://i.imgur.com/bKYiyA1.png[/img]


Ganz ehrlich solche Apps sollte man echt prüfen und stopen bei so nem shit -.-
Posted by: Kev777

Re: Fragen und Antworten - 11.11.2015, 21:28:45

Jap, dem kann ich mich hier wirklich nur anschließen.

1. wird hier nicht klar kenntlich gemacht was passiert wenn man auf den link geht. (channelwechsel in premium)

2. kommen die nachrichten spammartig würde ich mal fast schon behaupten, im abstand weniger minuten

3. ist es ne freche lüge ''jemand will mit dir chatten'' wie kann das sein wenn derjenige zuvor noch nie im channel premium war?


Posted by: TMboy

Re: Fragen und Antworten - 11.11.2015, 22:10:55

Antwort auf: SilverFalcon

[img]http://i.imgur.com/bKYiyA1.png[/img]


Das ist nicht nur DiceSky, sondern mitlerweile gibt es noch einen Channel mit solch einem Bot, der Channelname lautet Kissparty .....

Kissparty Newsletter lautet der Botname ....

Ich denke mal der wurde auch weitergereicht als AppID zur Installation ....

Ich hab auch drauf geklickt, weil mich das interessiert hat, welche Person hätte von mir da irgendwas wollen können.
Dann stellte ich fest, ich werde nur in einem anderem Channel gezogen und verlasse mein eigentlichen Channel ungewollt mitten im Gespräch, da der Link mich ungewollt in einem anderen Channel katapultiert. ]-(

Der Bot hätte auch echt verwechselnd sein können für den FotoMeet, den ich aktiv habe....
Wäre der Nickname mir vom Bot nicht aufgefallen, hätte ich echt gedacht, das System spielt verrückt :-D


Gründe :
1. Keine erkennbare Funktion
2. Unerkennlicher Link (nicht erlaubt)
3. Schreibt solche Nachrichten auch in anderen Channels privat, sofern man nur einmal den Channel betreten hat.
4. Die Nachrichten aten in einem Spamm aus, jede 2 Minuten kommt solch eine Nachricht.

Meine Aktion :
Ich habe beide ignoriert, wegen :
1. Irreführender Textinformation
2. Nicht erkennlichen Aktionen, die bei weiterem ausbauen noch kommen könnten
3. Wegen spamming im /p

Sowas gehört ohne mit der Wimper zu zucken aus dem Verkehr gezogen, schließe mich den Vorpostern voll zurecht an. :-P

MfG 8-) MiB 8-) :-D
Posted by: Consider

Re: Fragen und Antworten - 11.11.2015, 22:38:37

Ich habe auch von Kissparty Newsletter, und von DiceSky die nachrichten bekommen, habe nun beide Botnicks auf der /ig, da ich sowas nicht gebrauchen kann, was Messi dort macht!
Es kann nicht sein, das er alles machen darf was er will, Er Spammt ja förmlich... ;-)
Posted by: SilverFalcon

Re: Fragen und Antworten - 11.11.2015, 22:42:19

[img]http://i.imgur.com/Bs79Itk.png[/img]

EDIT: Gleich noch ein 2tes mal hinterher....
[img]http://i.imgur.com/Ii7SPZ6.png[/img]

Der selbe Müll nochmal, jeder Link schickt einen in /Premium

Und wie meine Vorredner scho ngesagt haben, das hat nichts mehr mit Benachrichtungen zu tun, das is der reinste SPAM was da kommt und vorallem in welchen Abständen.
Posted by: Kev777

Re: Fragen und Antworten - 11.11.2015, 22:48:42

Erschwerend kommt hinzu das jeder der den channel betreten hat automatisch in der datenbank landet und von da an in den fotovorschlägen bzw. suche auftaucht und man sich erst gesondert wieder austragen muss. (was nebenbei nicht funktioniert: unbekannte aktion! ... super)

Alles in allem finde ich dieses app verhalten unter aller sau um es mal deutlich zu sagen. :-X
Posted by: TMboy

Re: Fragen und Antworten - 11.11.2015, 23:09:10

Ich habe die nun wieder aus meiner /ig genommen, aus dem Grund das hier irreführende Links vorhanden sind und das nicht erlaubt ist, werde ich bei einem Nick, sofern er nur einmal so einen Mist abgibt einen Notruf machen.
Das soll dann ein Admin mal genauer bearbeiten, aber sowas dulde ich nicht, uns als User wird es verboten, und die spammen alles zu damit ....
Hoffentlich werden die Admins sich darüber freuen, wieder was zu tun zu bekommen....
Löschung oder gar Sperrung der installierten Apps wäre hier die beste Idee , und den Nicks zusätzlich eine Installier-Sperre verpassen, damit sowas nicht gleich wieder ins Netz kommt ... ;-)

Auf jedem Fall ist das alles unter aller Sau ]-(
Posted by: IgelchenM

Re: Fragen und Antworten - 11.11.2015, 23:13:14

Ich finde das Verhalten gerade vom Bot Organizer sehr traurig, da der Channel 4Gewinnt mit Quests ausgestattet ist und somit den ganzen Ruf der Entwickler meiner Meinung nach in Mitleidenschaft reisst. :-|

Auch wenn Werbung aktuell geduldet wird, sollte meiner Meinung nach bei Channels / Apps mit Quest eben solch ein Verhalten unterbunden werden. Da dies definitiv dazu missbraucht wird andere Channels zu pushen bzw. den eigenen Geldbeute / Knuddelsack zu füllen.
Posted by: Krieger des Waldes

Re: Fragen und Antworten - 12.11.2015, 00:19:53

Guten Abend miteinander,

zu Anfang wollte ich mich für die Kritik, Ideen und Verbesserungsvorschläge für Premium bedanken. Im Falle der Werbung für den Channel selbst, muss ich euch vollkommen Recht geben:
,,So geht es nicht! - Hier muss ich als Channelinhaber was ändern!“ - und das tue ich auch direkt.

Wir haben die Werbung in diesen Moment um 95% reduziert und die Aussagen die nicht klar definiert waren umgeändert. Die viele Werbung war ein „Eintragungsfehler“ von mir. Hierbei habe ich klar einen Fehler gemacht und dahinter stehe ich auch. Es kann nicht mein Ziel sein:

1. Besucher zu täuschen.
2. Besucher zu verärgern.
3. Besucher mit spamming von Werbung zu belästigen.

Damit stehe ich nicht mit meinen Namen und deshalb garantiere ich ab sofort, dass so etwas nicht mehr in der Zukunft vor kommt.
Nichts machen wir so gut, dass wir es nicht besser machen können und deshalb bedanke ich mich in den Fall bei der Kritik von Kev777 der klar den Weg von meinen Projekten spiegelt und deshalb arbeiten wir gerade daran, den Fehler zu beheben um die Fotos aus der Datenbank zu entfernen.

Die Funktion /newsletters den man im Channel eingeben kann um sich aus den Newsletter auszutragen ist natürlich weiterhin vorhanden und werden wir nun auch zufällig bei einigen Nachrichten als Icon anzeigen, sodass jeder Nutzer der Werbung erhält sich direkt mit einen Klick abmelden kann.

Als weiteren Schritt ist ab sofort eine goldene Regel bei uns, dass die Links nun einen klaren und definierbaren Hintergrund haben.

Wir bedauern diesen Vorfall,
jedoch können wir den nicht mehr Rückgängig machen nur daraus lernen.


Für weitere Anregungen bin ich im Chat gerne erreichbar.

Mit freundlichen Gruß
Krieger des Waldes
Posted by: TMboy

Re: Fragen und Antworten - 12.11.2015, 02:39:01

Und hier ein kleines Statement für Krieger des Waldes , welches er natürlich auch verdient hat :-D

Ich finde das Statement richtig gut, er hat schnell die Fehler eingesehen und auch möglichst korregiert.
Warten wir noch die kleinen Feinheiten ab, wie z.B. die Bilder rausnehmen und die /newsletter - Funktion, damit man die abstellen kann, da ich sie leider nicht abstellen kann. :-|
Aber im großen und ganzen sind z.B. die irreführenden Links schnell verschwunden, die schnelle Rückschaltung der Nachrichten um 95 % zeigen auch ihre angesehene Wirkung, hoffentlich funktioniert das bald auch mit dem Rest. :-]

An dieser Stelle bedanken wir für die schnelle Reaktion und das Engagement seiner Seite aus, für die recht schnelle Reaktion.
So kann ich mir das nochmal überlegen, ob ich doch nicht einmal den Channel besuchen komme, wenn alles so funktioniert, wie es soll. ;-)

An dieser Stelle bedanke ich mich schon einmal vorab.


Auf irre Zeiten 8-)
Posted by: TMboy

Re: Fragen und Antworten - 12.11.2015, 03:02:48

Alle Fehler wurden nun behoben, ich habe mich austragen können und die Newsletter abbestellen können ....
Der Kontakt lief überwiegend mit ihm per /m und /p.

Ein Danke hierfür 8-)
Posted by: TMboy

Re: Fragen und Antworten - 12.11.2015, 04:43:20

Ich versuche derzeit diese Variable auch für die Profile und den Chat als Topliste zur Verfügung zu stellen , habe dennoch keine Ahnung wie ....
Ich habe diese Variable aus dem Spiel High or Low, und ich hatte schon so meine Vorstellungen.
Und zwar folgend : Ja richtig geraten, soll er hochzählen, die höchste Zahl wird in der Top festgehalten und man kann seinen Rekord immer weiter steigern.
Es sollte am Ende im Channel und im Profil zu sehen sein .....




z.B. so :
Channelname
Rang Spieler Rundenzahl 100 1 Platz in der Top



Warnung! Spoiler!
Code:
	function getLevel(_user) {
		return 1000;
		
		if(levelAbove(_user.level, -1, 5)) {
			return 10;
		} else if(levelAbove(_user.level, 5, 10)) {
			return 100;
		} else if(levelAbove(_user.level, 10, 15)) {
			return 1000;
		} else if(levelAbove(_user.level, 1000, 10000)) {
			return 10000;
		} else {
			return 1000000;
		}
	};
	
	function levelUp(_user) {
		if(_user.rounds >= 5) {
			_user.level++;
			_user.rounds = 0;
		} else {
			_user.rounds++;
		}
	};
	
	function levelAbove(level, min, max) {
		return (levelOver(level, min) && levelUnder(level, max));
	};
	
	function levelOver(level, min) {
		return (level >= min);
	};
	
	function levelUnder(level, max) {
		return (level <= max);
	};
	


Wie könnte ich das umsetzen, oder wie muss sowas aussehen ?
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 12.11.2015, 07:42:18

Sieh Dir im Bezug auf Toplisten mal die ToplistAccess sowie die Toplist-Klassen un der Dokumentation an. Diese dürften Dir im Erzeugen und Anzeigen (Profil und Channel) bereits weiterhelfen.
Posted by: TMboy

Re: Fragen und Antworten - 12.11.2015, 09:35:54

Soah ich stell das mal komplett rein , ich mache da irgendwelche Fehler -.-



Zitat:

var App = (new function() {
this.onAppStart = function() {
var access = KnuddelsServer.getToplistAccess();
var profile = KnuddelsServer.getAppProfileEntryAccess();

// Definiere die Ränge

var rank = access.createOrUpdateToplist('points', 'Rang', {
1: 'BabyDice-Neuling',
20: 'BabyDice-Family',
30: 'BabyDice-Stammi',
40: 'BabyDice-Ehrenz',
50: 'BabyDice-Mitglied',
60: 'BabyDice-VertrauensMitglied',
100: 'BabyDice-SystemMitglied',
});


profile.createOrUpdateEntry(rank, ToplistDisplayType.Label);
};

var _games = {};
var _users = {};
var _success = [
'_RICHTIG_ : Deine geschätzte Zahl war vollkommen korrekt.',
'_RICHTIG_ : Das nenn ich einen gelungenen Volltreffer.'
];
var _failure = [
'_FALSCH_ : Das war wohl leider nichts, die gesuchte Zahl war _°RR°$NUMBER°r°_',
'_FALSCH_ : Oh Nein - Das tut mir leid, ich habe die Nummer _°RR°$NUMBER°r°_ gezogen.'
];
var _button_lower = '°>{button}kleiner||call|/hol lower|icon|auction/trend_-2.png|color|120,230,90~60,170,25~24,96,1|height|35|my|10|textborder|1<°';
var _button_higher = '°>{button}größer||call|/hol higher|icon|auction/trend_2.png|color|230,90,90~172,26,26~97,1,1|height|35|my|10|textborder|1<°';

this.onUserJoined = function(user) {
user.sendPrivateMessage('Willkommen bei °BB°_Up & Down_°r°!#Schaffst Du die folgende Zahl richtig zu schätzen ? Dann klicke auf : °>{button}Runde Starten||call|/hol start|color|120,230,90~60,170,25~24,96,1<°');
};

function formatNumber(number, decimals, dec_point, thousands_sep) {
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? '.' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? ',' : dec_point,
s = '',
toFixedFix = function(n, prec) {
var k = Math.pow(10, prec);
return '' + (Math.round(n * k) / k)
.toFixed(prec);
};

s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');

if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}

if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}

return s.join(dec);
};

function getLevel(_user) {
return 1000;

if(levelAbove(_user.level, -1, 5)) {
return 10;
} else if(levelAbove(_user.level, 5, 10)) {
return 100;
} else if(levelAbove(_user.level, 10, 15)) {
return 1000;
} else if(levelAbove(_user.level, 1000, 10000)) {
return 10000;
} else {
return 1000000;
}
};

function levelUp(_user) {
if(_user.rounds >= 20) {
_user.level++;
_user.rounds = 1;
} else {
_user.rounds++;
}
};

function levelAbove(level, min, max) {
return (levelOver(level, min) && levelUnder(level, max));
};

function levelOver(level, min) {
return (level >= min);
};

function levelUnder(level, max) {
return (level <= max);
};

this.chatCommands = {
hol: function(user, params, command) {
try{
var button_new_game = ' °>{button}Neuer Versuch||call|/hol start|disabledTimeout|15000<°';
var _user = _users[user.getNick()] | { level: 0, rounds: 0 }

if(params == 'start') {
var numbers = RandomOperations.nextInts(getLevel(_user), 2, true);
_games[user.getNick()] = numbers;
user.sendPrivateMessage('Eine neue Zahl wurde gezogen: °RR°_' + formatNumber(numbers[0]) + '_°r° gezogen.. Die nächste Zahl ist: ' + _button_higher + ' oder ' + _button_lower);
} else if(params == 'higher') {
var numbers = _games[user.getNick()];
var output = '';

if(typeof(numbers) == 'undefined') {
user.sendPrivateMessage('Ungültige Aktion');
return;
}

if(numbers[0] < numbers[1]) {
output += _success[Math.floor(Math.random() * _success.length)].replace('$NUMBER', formatNumber(numbers[0]));
levelUp(_user);
} else {
output += _failure[Math.floor(Math.random() * _failure.length)].replace('$NUMBER', formatNumber(numbers[1]));
_user = { level: 0, rounds: 0 };
}

var numbers = RandomOperations.nextInts(getLevel(_user), 2, true);
_games[user.getNick()] = numbers;
user.sendPrivateMessage(output + ' Eine neue Zahl wurde gezogen: °RR°_' + formatNumber(numbers[0]) + '_°r°. ' + _button_higher + ' oder ' + _button_lower + ' ');
} else if(params == 'lower') {
var numbers = _games[user.getNick()];
var output = '';

if(typeof(numbers) == 'undefined') {
user.sendPrivateMessage('Ungültige Aktion');
return;
}

if(numbers[0] > numbers[1]) {
output += _success[Math.floor(Math.random() * _success.length)].replace('$NUMBER', formatNumber(numbers[1]));
levelUp(_user);
} else {
output += _failure[Math.floor(Math.random() * _failure.length)].replace('$NUMBER', formatNumber(numbers[1]));
_user = { level: 0, rounds: 0 };
}

var numbers = RandomOperations.nextInts(getLevel(_user), 2, true);
_games[user.getNick()] = numbers;

user.sendPrivateMessage(output + ' Eine neue Zahl wurde gezogen: °RR°_' + formatNumber(numbers[0]) + '_°r°. ' + _button_higher + ' oder ' + _button_lower + ' ');
}
} catch(e) {
user.sendPrivateMessage('_Exception:_ ' + e.message);
user.getPersistence().setNumber('points', 1);

}
}
};
}());



Wo liegt mein Fehler, ich habe die Persistence() drin und die Ränge ?-)

Kann mir jemand sagen, wo das Problem liegt ?

Ich verzweifel langsam daran, es wird nur bei mir im Profil angezeigt, aber bei keinem anderem , ausserdem ändern sich die Ränge kein Stück .... :-(
Posted by: Bizarrus

Re: Fragen und Antworten - 12.11.2015, 10:10:30

Code:
this.onAppStart = function() {
var access = KnuddelsServer.getToplistAccess();
var profile = KnuddelsServer.getAppProfileEntryAccess();

// Definiere die Ränge

var rank = access.createOrUpdateToplist('points', 'Rang', {
1: 'BabyDice-Neuling',
20: 'BabyDice-Family',
30: 'BabyDice-Stammi',
40: 'BabyDice-Ehrenz',
50: 'BabyDice-Mitglied',
60: 'BabyDice-VertrauensMitglied',
100: 'BabyDice-SystemMitglied',
});

profile.createOrUpdateEntry(rank, ToplistDisplayType.Label);
};


Erwähnenswert wäre auch das du dir versucht hast von mir helfen zu lassen, ohne Erfolg.

Ich habe dir das Snippet gegeben um die Topliste zu erstellen, ich habe dir auch mehrfach gesagt das du nur noch die Punkte in der Persistenz des jeweiligen Nutzers speichern musst, der Rest geschieht von alleine.

Ich habe dir auch mehrfach gesagt das du die Punkte an der Stelle setzen sollst, wo das Spiel für den Nutzer "zu Ende" ist, wo die Punkte der jeweiligen Runde feststehen.

Klar ändert sich bei dir nichts immerhin setzt du bei der Persistens immer nur den Wert "1":
Code:

user.getPersistence().setNumber('points', 1);

Posted by: TMboy

Re: Fragen und Antworten - 12.11.2015, 17:34:15

Antwort auf: Bizarrus


Klar ändert sich bei dir nichts immerhin setzt du bei der Persistens immer nur den Wert "1":


user.getPersistence().setNumber('points', 1);



Selbst wenn ich den Wert auf 100 lege, so wie der Rang ist, geschieht nichts.
Das Problem ist, das Spiel hat ja kein eindeutiges Ende, da wenn Du eine falsche Antwort gibst, gleich eine neue Runde kommt, und deine vorherige Antwort als Falsch ausgelegt wird.
Wo bitte soll ich da klar ein Spielende definieren, wo keines vorhanden ist ?
Das ist doch genau das Problem, welches ich versucht habe zu schildern, deswegen hab ich auch als einzigstes einen Rang, und zwar den höchsten im Spiel, den man sich erspielen hätte können.
Posted by: TMboy

Re: Fragen und Antworten - 12.11.2015, 17:47:09

Antwort auf: TMboy


user.getPersistence().setNumber('points', 2);



Ahh hab mein Fehler gefunden , die Werte sind ja nur 3-Zeilig ...
0
1
oder 2

Ich hatte es einfach nicht auf 2 gestellt, man bin ich dumm, und ich hab erst versucht das mit einem Level zu setzen ... :-D

Problem ist nun geschnallt, jetzt funktioniert alles O:)
Posted by: TMboy

Re: Fragen und Antworten - 13.11.2015, 17:15:09

Ich habs jetzt mehrfach versucht, den user.getPersistence().setNumber('points', 100); mit verschiedenen Zahlen zu setzen, sofern ich irgend eine Zahl einbinde, habe ich diese Zahl am Ende auch als Punkte, welche dann klipp und klar nicht den Rang anzeigen, wie es sollte .... :-|
Ich hab auch langsam kein Bock mehr danach zu suchen woran es liegen könnte .....
Diese scheiße mit Persistence ist so schlecht erklärt und zusätzlich noch nicht einmal mit Beispielen abgebildet, wo ein Leihe nicht ansatzweise dran lernen kann.... :-X
Ich habs schon aufgegeben, in Google und Co habe ich ebenfalls nach Persistence'n und Co. gesucht und keinerlei hilfreichen Infos gefunden, das es ermöglicht, den Rang nach und nach zu steigen, je nach Bemühungen , wie ich es bei anderen Spielen gesehen habe ....
Beispiele : 4Gewinnt , Memory , TamaKnuddeli und Co .... O:)

Wenn hier sonst noch irgendwer einen sinnvollen Rat hat, soll er dafür am besten mal Beispiele beibringen, so hat es kein Sinn ....
Die Idee den Wert von 1 zu verändern, hat genauso wenig geholfen, wie alles andere ....
Steht da 1 , hab ich 1 Punkt , hab ich 100 drin stehen, sind in der Top auch 100 Punkte + den dazugehörigen Rang .... ]-(
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 13.11.2015, 19:11:39

setNumber setzt den Wert in der Persistence ja auch immer auf den, den Du dort angibst. Wenn Du weiter hoch addieren möchtest, musst Du addNumber verwenden.

Du sparst Dir das viele Googlen, wenn Du mal ein paar Blicke in die Dokumentation werfen würdest. Ich habe Dir diese in einem meiner vorherigen Beiträge bereits verlinkt, da kann man sich doch durchklicken, oder ist das zu viel verlangt?
Posted by: Bizarrus

Re: Fragen und Antworten - 14.11.2015, 03:48:52

Ich denke er versteht einfach den Aufbau nicht; Weder von der Dokumentation noch von den Methoden/Klassen
Posted by: TMboy

Re: Fragen und Antworten - 14.11.2015, 18:14:47

Antwort auf: Bizarrus
Ich denke er versteht einfach den Aufbau nicht; Weder von der Dokumentation noch von den Methoden/Klassen


Ich hab das Problem, das ich die Methoden einfach nicht begreife, wie die zusammengesetzt werden.
Aber die Doku zeigt auch nicht, wie im einzelnem sie zusammengesetzt werden .... %-)

Meine kleine Dummheit etwas zu begreifen ist natürlich Standart, das bin ich gewohnt .... :-D

Aber ich hab es nun so weit zum laufen bekommen, aber ein Bild stört mich noch daran , im Anhang nun als Bild zu sehen :

Warnung! Spoiler!
[img]http://img5.fotos-hochladen.net/uploads/unbenanntj572htd4f9.png[/img]


Die Frage ist, wie bekäme ich das jetzt hin, das ich auch den Platz angezeigt bekomme ? ......

Ich mach am besten mal eine kleine Übersicht von dem, was ich nun habe ....
Warnung! Spoiler!
Code:
this.onAppStart = function() {
var access = KnuddelsServer.getToplistAccess();
var profile = KnuddelsServer.getAppProfileEntryAccess();

// Definiere die Ränge

var rank = access.createOrUpdateToplist('points', 'Gespielte Spiele', {
   1: 'Rang 1',
  10: 'Rang 2',
  20: 'Rang 3',
  30: 'Rang 4',
  40: 'Rang 5',
  50: 'Rang 6',
  60: 'Rang 7',
  70: 'Rang 8',
});

profile.createOrUpdateEntry(rank, ToplistDisplayType.Label);
};


Der Code-Schnipsel wurde nun auch richtig positioniert und funktioniert einwandfrei ....
Der kleine Einbaucode beim Punkten , ja auch mit add gemacht, ich bin lernwillig :-]
Warnung! Spoiler!
Code:
user.getPersistence().addNumber('points', 1);


Was fehlt da denn ? Oder wie kann man das einbinden, das er den Platz anzeigt ? :-|
Posted by: Vampiric Desire

Re: Fragen und Antworten - 14.11.2015, 18:17:30

ToplistDisplayType.Label


http://developer.knuddels.de/docs/classes/ToplistDisplayType.html#properties

Lesen!!!!



LabelAndRank
Anzeigename und Rang anzeigen.


Oh wunder da steht es ja

ToplistDisplayType.LabelAndRank
Posted by: TMboy

Re: Fragen und Antworten - 14.11.2015, 18:38:33

Ahhh okay, jetzt komm ich dahinter, wie was eingeteilt ist :-P

Scheiße, scheiße ..... ich danke dir und schäm mich auch gleich mal eine Runde :((
Posted by: Anonym

Re: Fragen und Antworten - 19.11.2015, 18:05:51

Hallo zusammen. :-)
Mein Name ist Rolf, und ich bin gerade eben dem Monetarisierungs-Programm beigetreten. -
Daher habe ich eine Frage: Wie entwickle ich eine App? Ich habe das noch nie gemacht.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 19.11.2015, 19:17:35

Zuerst musst Du Dir Deinen Entwickler-Account aktivieren. Dies kannst Du, indem Du den Befehl /apps developer in den Chat eingibst. Erfüllst Du die Voraussetzungen (Family, verifizierte EMail-Adresse, aktives TAN-System), kannst Du Dich schon an das Programmieren von Apps setzen.

Wie es dann weiter geht, erfährst Du hier im Entwickler-Wiki. Informationen, welche Klassen Knuddels anbietet, findest Du in der API-Dokumentation. Bei weiteren Fragen kannst Du Dich gerne hier im Forum melden, Dir wird dann versucht zu helfen. Viel Spaß bei der Entwicklung :-)
Posted by: Anonym

Re: Fragen und Antworten - 20.11.2015, 14:43:24

Ich hab dazu auch einmal eine kleine Frage.
Und zwar hatte ich jetzt vor jetzt eine App für meinen Channel zu erstellen..
allerdings - wenn ich es mache wie es in der Wiki steht und versuche die HeyThere App zu installieren - kommt immer das die App nicht installiert wurde und der Fehler App not found.

Kann mir da vielleicht irgendjemand sagen woran das liegt ?

Liebe Grüße
Posted by: Kev777

Re: Fragen und Antworten - 20.11.2015, 15:00:10

Im wiki scheint es nicht ganz so gut beschrieben zu sein.
Schau doch mal auf nachfolgendem link vorbei, dort wird genauer erklärt wie man eine App installiert:

https://knuddelsapi.wordpress.com/2015/11/04/tutorial-app-im-mychannel-installieren/
Posted by: Anonym

Re: Fragen und Antworten - 20.11.2015, 15:08:59

Danke :)

Das hat mir schonmal sehr gut geholfen :)
Posted by: Anonym

Re: Fragen und Antworten - 20.11.2015, 15:20:06

Gibt es zu dem Rest vielleicht auch noch verständlicher geschriebene Anleitungen ? :D
Posted by: Kev777

Re: Fragen und Antworten - 20.11.2015, 15:22:33

Die frage ist was du mit ''dem rest'' meinst?
Aber auf https://knuddelsapi.wordpress.com gibt es bereits so einige interessante artikel die für den ein oder anderen ganz nützlich sein könnten. =)
Posted by: Anonym

Re: Fragen und Antworten - 20.11.2015, 15:27:36

Naja wenn ich nach der Wiki gehe ist der nächste Schritt zum Beispiel ja dieser FTP Kram, ich hab leider nur keine Ahnung wie ich das ganze finde und einrichten kann, was mir da auch leider nicht beschrieben wird... :/
Bin echt für jede Hilfe dankbar. :)
Posted by: Anonym

Re: Fragen und Antworten - 20.11.2015, 19:01:02

Eine Frage muss ich leider noch mal stellen... ich hab den Text in der main.js geändert und kann die Datei nicht mehr öffnen.. kann ich da irgendwie wieder was rückgängig machen ?
Posted by: Consider

Re: Fragen und Antworten - 20.11.2015, 19:29:07

Antwort auf: Queen of Raop +++
Eine Frage muss ich leider noch mal stellen... ich hab den Text in der main.js geändert und kann die Datei nicht mehr öffnen.. kann ich da irgendwie wieder was rückgängig machen ?




Wenn du es Gespeichert hast, kannst du es nicht mehr Rückgängig machen :-D

Ich denke ja mal, das du es mit Notepad ++ änders oder? ;-)
Posted by: Anonym

Re: Fragen und Antworten - 20.11.2015, 19:41:53

Ja richtig :x
Posted by: Bizarrus

Re: Fragen und Antworten - 20.11.2015, 21:05:35

Du kannst in N++ Backups in den Einstellungen setzen ;-)
Sobald du die Datei oder N++ geschlossen hast, kannst du kein Undo/Redo mehr durchführen, einzige Lösung wäre hier die oben genannten Backup-Einstellungen zu nutzen.
Posted by: Tagtraum

Re: Fragen und Antworten - 25.11.2015, 22:26:45

Mal eine kleine Frage am Rande.
Macht es einen Unterschied, ob man diverse Variablendefinitionen in onAppStart schreibt, oder sie einfach direkt in der main.js stehen? Für den Moment hatte ich letzteres getan - funktioniert einwandfrei.
Posted by: Ironist

Re: Fragen und Antworten - 26.11.2015, 01:10:37

Ahoi,

derzeit macht es tendenziell keinen (großen) Unterschied. Wir garantieren aber erst ab onAppStart, dass die API korrekt verfügbar ist. Es kann also durchaus sein, dass wir Optimierungen vornehmen und dann dein Code nicht mehr funktioniert, weil wir diese Änderungen vornehmen.

Du solltest dich also nicht darauf verlassen, dass es so bleibt und lieber onAppStart nutzen.

Knuddelige Grüße
Ironist
Posted by: Vampiric Desire

Re: Fragen und Antworten - 26.11.2015, 10:01:13

Prinzipiell - Setzt du variablen mit nem Nativ verfügbaren Code
var ABC = 1;
var APC = Math.rand();
etc... sollte es immer gehen


Nutzt du API Funktionen um einen Wert zuzuweisen, kann es zu Problemen führen

var ABC = KnuddelsServer.getChannel(); z.B.
Posted by: Tagtraum

Re: Fragen und Antworten - 26.11.2015, 22:56:40

Danke für die Antworten. Da ich aus manchen chatCommands keinen Zugriff mehr auf Variablen aus onAppStart hatte, habe ich das allerdings wieder zurückgebaut in die main.js. Das sind jedoch Variablen aus nativem Code.

Ich habe noch eine andere Frage. Aus der Doku habe ich mir zusammengesucht:

Code:
App.persistence = KnuddelsServer.getPersistence();
var toplistAccess = KnuddelsServer.getToplistAccess();
var appProfileEntryAccess = KnuddelsServer.getAppProfileEntryAccess();

var toplist = toplistAccess.createOrUpdateToplist('xp','Punkte');
appProfileEntryAccess.createOrUpdateEntry(toplist, ToplistDisplayType.ValueAndRank);


Das generiert eine Topliste und gibt sie in den Profilen aus. Nicht von der Doku auf den Syntax schließen konnte ich für einen Toplisten-Befehl. Gewünscht ist also die Ausgabe der Topliste, wenn jemand /rangliste eingibt.

Es funktioniert zum Beispiel nicht einfach nur:

toplist.getChatCommand(rangliste);
Posted by: TMboy

Re: Fragen und Antworten - 17.12.2015, 13:05:56

Ich hab mal versucht das dickere Ende einzubinden, jedoch bringt mir das einfach eine Fehlermeldung -.-

Warnung! Spoiler!

var App = (new function() {


this.onAppStart = function() {
var access = KnuddelsServer.getToplistAccess();
var profile = KnuddelsServer.getAppProfileEntryAccess();

// Definiere die Ränge

var rank = access.createOrUpdateToplist('points', 'StarWars-Rang', {

1: 'Rang 1',
1000: 'Rang 2',
2500: 'Rang 3',
5000: 'Rang 4',
7500: 'Rang 5',
10000: 'Rang 6',
12500: 'Rang 7',
15000: 'Rang 8',
17500: 'Rang 9',
20000: 'Rang 10',
22500: 'Rang 11',
25000: 'Rang 12',
27500: 'Rang 13',
30000: 'Rang 14',
50000: 'Rang 15',
100000: 'Rang 16',
});

profile.createOrUpdateEntry(rank, ToplistDisplayType.LabelAndRank);

toplist.addLabelChangeListener(function(toplistLabelChangeEvent) {
var user = toplistLabelChangeEvent.getUser();
var newLabel = toplistLabelChangeEvent.getNewLabel();
var bot = KnuddelsServer.getDefaultBotUser();
bot.sendPublicMessage('°20BB°' + user + ' hat den neuen Rang _' + newLabel + '_ erreicht.');

};


var _games = {};
var _users = {};
var _success = [
'',
''

];

var _failure = [
'',
''
];


Laut meinem Fehler liegt der Fehler an der Stelle, was ich rot makiert habe ....

Warnung! Spoiler!
Code:
App-Logs (privat): StarWarsOnline: FATAL: org.mozilla.javascript.EvaluatorException: missing ) after argument list (knuddelsDEV.30562559.StarWarsOnline@v0: main.js#41)
(no stacktrace)



Worin liegt nun das Problem ?
Ich habe das dicke schwarze eingefügt, und das rote ist auf einmal der Fehler ?-)


Ich weiß einfach nicht was noch fehlt oder wo der Fehler liegt, mach ich den stacktrace }; raus, entsteht ein neuer Fehler auf Zeile 251 bei mir, und nach meinem Wissen muss das doch mit einem stacktrace beendet werden oder nicht ? :-D
Posted by: Markus

Re: Fragen und Antworten - 17.12.2015, 13:11:55

Hallo,

probiere es doch mal so:

Code:
profile.createOrUpdateEntry(rank, ToplistDisplayType.LabelAndRank);

toplist.addLabelChangeListener(function(toplistLabelChangeEvent) {
var user = toplistLabelChangeEvent.getUser();
var newLabel = toplistLabelChangeEvent.getNewLabel();
var bot = KnuddelsServer.getDefaultBotUser();
bot.sendPublicMessage('°20BB°' + user + ' hat den neuen Rang _' + newLabel + '_ erreicht.');
});

Du musst die Klammer auch wieder schließen.

Markus
Posted by: TMboy

Re: Fragen und Antworten - 17.12.2015, 16:05:28

Ahhh ich Trottel, und ich such warlos den Fehler O:)

Kommt wohl davon, wenn man alles nur mit dem Text-Editor macht :-P :-D
Posted by: TMboy

Re: Fragen und Antworten - 18.12.2015, 14:35:03

Ich habe anbei festgestellt, auch nach dem einfügen der Klammer, das es nicht funktioniert.
Die App selbst läuft einwandfrei, jedoch bei einem Aufstieg im Label geschieht keine öffentliche Ansage, so das ich dann doch ein wenig überfragt bin, woran dies liegen könnte ....
Zweiteres ist, ich kann nur mit einem High Or Low-Bot Ränge erstllen, sofern ich dann mein anderes Script überspielt habe, ist das nicht mehr änderbar, egal wie sehr ich die Rangnamen oder Punkte veränder, das System behält dennoch selbst bei App-Neustart weiterhin die alten Ränge bei .... :-O
Woran kann das liegen ?
Hat sich beim eintragen irgendwas verändert oder manifestiert, das diese nicht mehr gehen ?
Bin dieser Sache ein wenig ratlos, wobei die App keine Fehlermeldungen macht und problemlos funktioniert , bis halt auf die besagten Punkten. O:)

Wenn ich andere Daten änder, so wie im Spiel selbst, das andere es im Spiel lesen können, geschieht jede Änderung direkt, nur nicht bei den Rängen, das raubt mir derzeit den Verstand :-D

So langsam rege ich mich auf, ich habe bestimmt keine Lust jedes mal das Spiel neu aufzusetzen mit all Spielepunkten und Rängen die verloren gehen, nur damit ich ein Update mit einbauen kann :-(


Als kleine Übersicht habe ich mal den Codeschnipsel mit eingebaut, damit ihr es euch mal anschauen könnt, ich blicke nicht durch, wo der Fehler liegen kann....
Ich ändere Ränge in der FTP und speichere sie auch ab, starte den Bot neu, der jedoch benutzt weiterhin die alten Ränge, als ob ich den nicht neu gestartet hätte ....

Hier der Einblick was irgendwie nicht reagiert :

Warnung! Spoiler!
Code:
var App = (new function() {


this.onAppStart = function() {
var access = KnuddelsServer.getToplistAccess();
var profile = KnuddelsServer.getAppProfileEntryAccess();

// Definiere die Ränge

var rank = access.createOrUpdateToplist('points', 'StarWars-Rang', {

            1: 'Rang 1',
            1000: 'Rang 2',
            2500: 'Rang 3',
            5000: 'Rang 4',
            7500: 'Rang 5',
           
});

profile.createOrUpdateEntry(rank, ToplistDisplayType.LabelAndRank);


toplist.addLabelChangeListener(function(toplistLabelChangeEvent) {
var user = toplistLabelChangeEvent.getUser();
var newLabel = toplistLabelChangeEvent.getNewLabel();
var bot = KnuddelsServer.getDefaultBotUser();
bot.sendPublicMessage('°25BB°' + user + ' hat den neuen Rang _' + newLabel + '_ erreicht.');
});


};



So sehe es normal aus , und wenn ich soetwas änder , angenommen so :
Warnung! Spoiler!
Code:
            1: 'Rang 1',
            1000: 'Rang 2',
            1500: 'Rang 2 B',
            2500: 'Rang 3',
            5000: 'Rang 4',
            7500: 'Rang 5',


Rang 2B würde hier nicht erkannt werden, obwohl er eingebaut ist, normal würde der Rang ja eigentlich sofort nach Appreaktivierung da stehen, bei mir geschieht jedoch rein garnichts .... X-)
Woran kann das jetzt nur liegen ? Ich bekomm noch Haarausfall bei dem kram :-D
Posted by: butterfisch

Re: Fragen und Antworten - 21.12.2015, 19:38:48

Hallo zusammen,

gibt es eine Übersicht der Möglichkeiten, die ich im HTML UI habe, wenn "knuddels-api.js" eingebunden ist?
Bisher bin ich nur auf client.executeSlashCommand() gestoßen...

Suchen hatten bisher keinen Erfolg, daher wende ich mich an euch. :-)
Posted by: Bizarrus

Re: Fragen und Antworten - 21.12.2015, 22:03:24

Alles das, was mit Client zu tun hat:

http://developer.knuddels.de/docs/classes/Client.html
http://developer.knuddels.de/docs/classes/Client.Color.html
http://developer.knuddels.de/docs/classes/Client.Event.html
http://developer.knuddels.de/docs/classes/Client.HostFrame.html
Posted by: Markus

Re: Fragen und Antworten - 03.01.2016, 15:40:34

Hallo zusammen,

hat jemand eine Idee, wie man am besten zwei Befehle verschmelzen könnte? Das heißt, ich könnte natürlich

Code:
a: function(user, params, command) { //code }

einfach zu

Code:
b: function(user, params, command) { //code }

kopieren.

Nur, das möchte ich aus dem Grund nicht, weil der Inhalt ziemlich viel ist und dann wäre es in Zukunft ziemlich umständlich, wenn man mal Änderungen vornimmt. Daher dachte ich an die Lösung, wenn man /a oder /b eingibt, wird /b ausgeführt. Eventuell hat ja jemand eine elegantere Lösung parat? Vielen Dank! :-)

Markus
Posted by: Ironist

Re: Fragen und Antworten - 03.01.2016, 15:47:21

Ahoi,

wie wäre es mit

this.chatCommands['a'](user, params, command);

? :)

Knuddelige Grüße
Ironist
Posted by: Markus

Re: Fragen und Antworten - 03.01.2016, 17:20:24

Hallo,

Dankeschön, werde ich mir dann mal vornehmen. :-)

Markus
Posted by: Bizarrus

Re: Fragen und Antworten - 03.01.2016, 17:51:12

Code:

App.chatCommands.ZweiterBefehl(user, params, command);
this.chatCommands['ZweiterBefehl'](user, params, command);

Gibt verschiedene Stile, die du anwenden kannst.
Posted by: TMboy

Re: Fragen und Antworten - 08.01.2016, 23:23:58

Ich habe mich auch mal gewagt an das Materium ranzuwagen ....

Das Beipiel schein ja ganz schick, nur nicht zu funktionieren ....

Code:


this.chatCommands =
{
   foo: function(user, params, command)
   {
      // Jemand im Chat hat /foo eingegeben.
      user.sendPrivateMessage('Foo ist etwas ganz Besonderes!');
   },
   bar: function(user, params, command)
   {
       if (params.length != 0)
       {
           // Jemand hat im Channel '/bar Getränk' eingegeben
           user.sendPrivateMessage('In der Bar trinke ich am liebsten ' + params + '!');
       }
       else
       {
           // Jemand hat im Channel '/bar' eingegeben
           user.sendPrivateMessage('In der Bar trinke ich am liebsten Coconut Kiss!');
       }
   }
};





Also ich weiss nicht was da fehlt oder nicht funktioniert, mein Bot meldet zwar keinen Error, aber sofern ich die Befehle aufrufe, sagt James mir, das sie nicht existieren :-D

James (privat): Die Funktion /Test gibt's hier leider nicht.

Ich habe es auch schon mit
App.chatCommands =
versucht, jedoch genauso wenig Erfolg, selbes Ergebnis ...

Woran kann das liegen ? :-|
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 08.01.2016, 23:58:37

Du hast die Funktion ja nicht /test genannt, sondern /foo und /bar. Wie kommst Du auf Test?
Posted by: TMboy

Re: Fragen und Antworten - 09.01.2016, 01:33:33

Egal wie ich sie nenne, ds würde nicht gehen ....
Ich habe es mit foo und bar auch getestet , ich hab auch /foo und /bar gemacht, selbes Ergebnis ;-)

Das ich Test geschrieben hatte, war weil ich es nochmal zurück geändert hatte, und da der Posting nicht mehr editierbar war wo es mir auffiel, hab ich Test einfach stehen lassen ...

Am Ende zählt jedoch, das es nicht geht :-|
Posted by: TMboy

Re: Fragen und Antworten - 09.01.2016, 14:15:36

Erledigt, Kev777 war so nett und hat mir mal das wichtigste erläutert und gezeigt was verkehrt war. :-O

Sehr großen Dank an dieser Stelle ;-)
Posted by: Tagtraum

Re: Fragen und Antworten - 10.01.2016, 19:34:11

Man kann öffentliche Nachrichten mit mayShowPublicMessage eventuell gar nicht anzeigen lassen. Kann man sie auch mit irgendeiner Funktion ändern? Ich könnte mir zum Beispiel hübsche optische Spielereien seitens der App vorstellen, die automatisch an eine öffentliche Nachricht angehängt werden.

Posted by: Kev777

Re: Fragen und Antworten - 10.01.2016, 19:39:34

Nein, das ist aktuell nicht möglich.
Aber du kannst dazu ja gern einen Vorschlag im API UserVoice erstellen. =)
Posted by: TobyB

Re: Fragen und Antworten - 11.01.2016, 08:17:27

Antwort auf: TMboy
Erledigt, Kev777 war so nett und hat mir mal das wichtigste erläutert und gezeigt was verkehrt war.

Damit alle was lernen: was war denn der Fehler?
Posted by: TMboy

Re: Fragen und Antworten - 13.01.2016, 20:10:55

Die so lieben onAppStart mehrmals ausführen bringt den Fehler, das einige gewissen Sachen nicht mehr geladen werden ...
Fazit : Alles was man ausführen will, sollte in einem onAppStart enthalten sein :-D
Posted by: partyboy@wob

Re: Fragen und Antworten - 24.01.2016, 20:17:59

Hallo erstmal :)

ich bin Neu als Entwickler unterwegs meine Erste halbwegs funktionstüchtige User app ist Knuddelsrunner
wo ich schonmal etwas stolz bin es hinbekommen zuhaben ^^
nur mein großes Problem liegt nun darin ich würde gerne die Gelaufene Strecke (also die Score aus der Haupt JS des Games ) die ein User gemeistert hat in einer Topliste auflisten lassen. Nur dazu happert es bei mir noch etwas an der API :D

wäre super jemand von den Anderen Entwicklern von euch mir bei dem Problemchen etwas unter die Arme greifen würde


Lg Partyboy@wob aka Chrizz :)

Posted by: IgelchenM

Re: Fragen und Antworten - 25.01.2016, 06:26:07

Hey,

speichern kannst du die Resultate mit Hilfe der UserPersistence. Hier geht's zur UserPersistence Funktionsübersicht

Damit kannst du die Werte speichern, abfragen, verändern, löschen und vieles Mehr.

Mit Hilfe der Toplisten Funktionen kannst du dir dann z.B. einen Link erzeugen lassen (getChatCommand), der dann ein Fenster öffnet wo die gespeicherten Werte als Topliste ausgegeben werden.

Les dich etwas rein. Wenn du danach immer noch Fragen hast, schreib ruhig deine Fragen. Wir beissen nicht. :-D
Posted by: Ironist

Re: Fragen und Antworten - 25.01.2016, 09:07:46

Ahoi,

du musst die gelaufenen Meter vom Client an den Server übermitteln mit:

http://developer.knuddels.de/docs/classes/Client.html#method_sendEvent


Auf dem Server fängst du die Antwort mit diesem AppHook ab:

http://developer.knuddels.de/docs/classes/App.html#event_onEventReceived


Knuddelige Grüße
Ironist
Posted by: Öwes

Re: Fragen und Antworten - 01.02.2016, 03:43:12

Moin :-)

ich bin dabei meine eigene App aufzubauen. Und würde gerne hinter den verlinkten Nicknamen + Alter das Geschlecht anzeigen lassen. Und das nicht nur als z.B.: "Male" sondern das richtige Symbol / Zeichen dafür. Wie es auch in der Nickliste im Chat zu sehen ist.

Kann mir jemand weiterhelfen? Wäre echt nett :-P

Liebe Grüße, Yves.
Posted by: Bizarrus

Re: Fragen und Antworten - 01.02.2016, 10:31:18

Zitat:


var text = user.getProfileLink();

if(user.getAge() > 0) {
text += ' (' + user.getAge() + ')';
}

switch(user.getGender()) {
case Gender.Male:
text += '°>male.gif<°';
break;
case Gender.Female:
text += '°>female.gif<°';
break;
}

Posted by: Anonym

Re: Fragen und Antworten - 10.03.2016, 15:14:24

Wie funktioniert eigentlich ein Zeilenumbruch? kenne es nur mit \n oder <br /> aber beides funktioniert nicht.
Posted by: Tjeri

Re: Fragen und Antworten - 10.03.2016, 15:20:07

Antwort auf: Sweeepy
Wie funktioniert eigentlich ein Zeilenumbruch? kenne es nur mit \n oder <br /> aber beides funktioniert nicht.

°#°
Posted by: Anonym

Re: Fragen und Antworten - 10.03.2016, 15:26:58

Antwort auf: Tjeri
Antwort auf: Sweeepy
Wie funktioniert eigentlich ein Zeilenumbruch? kenne es nur mit \n oder <br /> aber beides funktioniert nicht.

°#°


dankeschön :)
Posted by: PHP4ever

Re: Fragen und Antworten - 25.03.2016, 23:47:32

Huhu,

vieleicht eine etwas dumme Frage, aber wichtig, damit ich nicht später in Probleme laufe:

Apps laufen singlethreaded und ohne scheduling, richtig? (D.h., synchronisation ist nicht nötig,da das nächste event erst läuft wenn das vorherige komplett abgearbeitet ist)
Posted by: Tjeri

Re: Fragen und Antworten - 26.03.2016, 00:30:03

Ja deine App ist singlethreaded.
Du kannst aber timeouts bauen, also kann es durchaus sein, dass da ein bisschen was an Zeug "gleichzeitig" abläuft. Timeout läuft aus und Funktion dahinter wird aktiviert und gleichzeitig wird eine Funktion eingegeben oder eiun User joined

Aber du musst keine Race Conditions beachten.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 26.03.2016, 00:32:55

Ja, das ist korrekt. :-)


Ohje, habe ich lange gebraucht, um den Beitrag abzuschicken... da war Tjeri für einen deutlich längeren Beitrag knapp 3 Minuten schneller... :-D
Posted by: PHP4ever

Re: Fragen und Antworten - 26.03.2016, 00:49:56

Antwort auf: Tjeri
Du kannst aber timeouts bauen, also kann es durchaus sein, dass da ein bisschen was an Zeug "gleichzeitig" abläuft.

Naja, aber wenn JS singlethreaded ist und wie bei nodejs komplett eventbasiert abläuft sollte auch der onJoin-Handler oder /command handler in die event-queue gepackt werden und erst laufen, wenn die funktion die durch das timeout grade läuft abgearbeitet ist.
Posted by: PHP4ever

Re: Fragen und Antworten - 02.04.2016, 21:43:29

Hat jemand den Dev-Server bzw. den App-Server des Dev-Servers kaputt gemacht? :o
Posted by: IgelchenM

Re: Fragen und Antworten - 03.04.2016, 02:58:51

Der geht leider seit gestern nicht mehr. Man kann nur hoffen, dass am Wochenende die Server einmal neustarten und es danach wieder geht. Denn soweit ich weiß sind Iro und Fimo im Urlaub. :-|
Posted by: Anonym

Re: Fragen und Antworten - 25.04.2016, 07:58:50

Könnte mir jemand vielleicht einen Beispielcode geben wie ich die online Zeit eines Users im Channel definiere? Gibt ja das Persistenz tutorial mit Nachrichten aber an der Umschreibung harpert's noch.
Posted by: DerNeuanfang

Re: Fragen und Antworten - 25.04.2016, 14:33:54

naja, du kannst bei "onUserJoined" ein timestamp setzen und bei "onUserLeft" dann mit ein neuen Timestamp gegen rechnen... das ergebnis kannst du dann in die persistenz hinzufügen... Denke dafür brauchst du kein Tutorial :-)

Posted by: Anonym

Re: Fragen und Antworten - 25.04.2016, 21:54:52

Jetzt muss ich nurnoch wissen wie man eine timestamp setzt :D in der API finde ich da nichts
Posted by: Anonym

Re: Fragen und Antworten - 26.04.2016, 03:27:07

Habs jetzt so bei onUserJoined:

if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}

und bei onUserLeft einfach

Date.now = false;

Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 26.04.2016, 07:32:40

Zunächst musst Du Dir beim Login jedes Benutzers die aktuelle Zeit merken. Hierfür bietet sich ein Array an, welches nur lokal gehalten wird und als Key die Benutzer-ID verwendet.

Code:
 
App.UsersJoinedTime = [];

this.onUserJoined = function(user) {
    App.UsersJoinedTime[user.getUserId()) = Date.now();
} 


Im onUserLeft musst Du diesen Wert wieder mit der neuen Zeit verrechnen:
Code:
 
this.onUserLeft = function(user) {
    var onlineTime = Date.now() - App.UsersJoinedTime[user.getUserId());
} 


Die Variable "onlineTime" beinhaltet nun die Anzahl der Millisekunden, die der Nutzer im Channel war. Diese kannst Du nun in die Persistence speichern, dem User anzeigen oder sonstiges mit ihr anstellen.

Ich hoffe, ich konnte Dir helfen. Da das Ganze am Handy und aus dem Kopf heraus getippt wurde, kann ich Fehler nicht ausschließen.
Posted by: Bizarrus

Re: Fragen und Antworten - 26.04.2016, 13:07:22

Warum so kompliziert?

Erstelle ein Intervall beim onAppStart, was zum beispiel jede Sekunde läuft. Hier holst du dir dann alle Users aus dem Channel und fügst über der UserPersistence mit addNumber die Sekunde hinzu.

So kannst du Sekundengenau ein Timetracking realisiere n.
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 26.04.2016, 13:19:51

Ich würde sagen, dass auf Millisekunden gesichert deutlich genauer ist als auf Sekunden basierend. :-)
Posted by: PHP4ever

Re: Fragen und Antworten - 26.04.2016, 13:47:07

Macht ja auch so einen großen unterschied...
Posted by: TobyB

Re: Fragen und Antworten - 26.04.2016, 13:51:48

Hinweis von mir:
Ich selbst hatte auch anfänglich eine Variante implementiert die sich beim "join" einen Timestamp merkt und beim "leave" bzw. "shutdown" die Differenz zwischen Date.now() und diesem Timestamp als Onlinezeit speichert. Allerdings hatte ich damit dann auch ab dem ersten Server-Crash korrupte Daten, da dann kein "leave"/"shutdown" passiert auf das ich reagieren kann. Dagegen kann man sich theoretisch auch schützen indem man die Validität der Timestamps beim Differenz berechnen überprüft. Allerdings verliert man damit dann eine Session.
Robuster ist da tatsächlich ein Interval dass in der gewünschten Häufigkeit über alle User iteriert und deren Online-Counter hochzählt. Damit verliert man maximal den Zeitraum eines solchen Intervals. Das wäre also das vermutlich kleinere Übel und ist auch transparenter.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 26.04.2016, 14:02:18

Antwort auf: TobyB
Damit verliert man maximal den Zeitraum eines solchen Intervals. Das wäre also das vermutlich kleinere Übel und ist auch transparenter.

Sauberer ist es beides zu nutzen, mit einem each über die Persistenz im Intervall. In der ChannelMaster passiert das übrigens minütlich.
Posted by: Cyaz

Re: Fragen und Antworten - 27.04.2016, 23:37:41

Huhu,

ich habe eine Frage bzgl. Icons.
Und zwar versuche ich die ganze Zeit einen bestimmten Smiley bei mir als Icon einzusetzen, doch es haut nie hin. Mal ist er zu dick, mal zu dünn, mal zu verpixelt oder zu klein...

Ich habe nun bereits jede Zahl von 20 bis 45 versucht, aber keine davon klappt.
Habt ihr vielleicht einen Trick, den Smiley so, wie er als Datei ist, da rein zu bekommen?

Gruß
Posted by: Anonym

Re: Fragen und Antworten - 28.04.2016, 06:30:24

Meinst du ein NicklistIcon? Wenn ja dann einfach die png anpassen mit einer maximalen breite von 100 pixeln soweit ich weiß.. dann einfach:

var icon = KnuddelsServer.getFullImagePath('BILDNAME.png'); (wenn eigenes bild benutzt)

&

user.addNicklistIcon(icon, 1-100); zum anzeigen
Posted by: DdvOiD

Re: Fragen und Antworten - 28.04.2016, 09:20:25

Welche größe hat das von dir genutzt bild denn? (HöhexBreite), sowie welche Einstellungen bezüglich schriftgröße hast du in dem Mychannel?
Posted by: Cyaz

Re: Fragen und Antworten - 01.05.2016, 19:08:28

Antwort auf: Sweeepy
Meinst du ein NicklistIcon? Wenn ja dann einfach die png anpassen mit einer maximalen breite von 100 pixeln soweit ich weiß.. dann einfach:

var icon = KnuddelsServer.getFullImagePath('BILDNAME.png'); (wenn eigenes bild benutzt)

&

user.addNicklistIcon(icon, 1-100); zum anzeigen


Bringt leider nichts.

Antwort auf: DdvOiD
Welche größe hat das von dir genutzt bild denn? (HöhexBreite), sowie welche Einstellungen bezüglich schriftgröße hast du in dem Mychannel?


22x29, Schriftgröße 15
Posted by: IgelchenM

Re: Fragen und Antworten - 01.05.2016, 20:31:25

Poste doch mal bitte den Bereich in dem du das Icon setzen möchtest mit allen dazu gehörigen Variablen.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 04.05.2016, 10:03:09

der Trick ist mit pseudoCSS den Bildcontainer zu setzen, so dass kein resizing mehr stattfindet.
Posted by: Anonym

Re: Fragen und Antworten - 04.05.2016, 12:12:52

Mal eine frage.. Ich habe ein Kommando erstellt bei der die PublicMessage den Text auf °>CENTER<° setzt.. aber komischerweise wird dann ALLES auf zentriert gesetzt, also nicht nur dieser bestimmte Kommando.. sondern JEDE PublicMessage.. wie kann ich das ändern? :O
Posted by: Kev777

Re: Fragen und Antworten - 04.05.2016, 12:13:46

am ende deiner nachricht noch ein °>LEFT<° setzen
Posted by: Anonym

Re: Fragen und Antworten - 04.05.2016, 12:17:46

Darauf hätte ich gewiss selbst kommen können :D dankeschön :)
Posted by: IgelchenM

Re: Fragen und Antworten - 04.05.2016, 15:42:19

Die besten Ergebnisse erreicht man, wenn man dies immer Absatzweise macht.

z.B.

°#>CENTER<° ICH BIN ZENTRIERT°#>LEFT<°Ab hier geht's ganz normal linksbündig weiter.

Weil ich meine, dass die Verwendung von °>CENTER<°TEXT°>LEFT<° wieder alles nach links schiebt.

Posted by: Vampiric Desire

Re: Fragen und Antworten - 04.05.2016, 18:11:28

Antwort auf: IgelchenM

Weil ich meine, dass die Verwendung von °>CENTER<°TEXT°>LEFT<° wieder alles nach links schiebt.

Richtig.
Das bezieht sich immer auf die ganze Zeile. Da Left das Center überschreibt, landet wieder alles Links.
Daher ist es richtig, dass das LEFT dann zwingend in die neue Zeile muss.
Posted by: Bizarrus

Re: Fragen und Antworten - 04.05.2016, 19:21:19

Ich könnte das ganze, um Schlau zu wirken auch noch mal in einer anderen Form wiederholen, aber die Antwort wurde bereits durch Olli gegeben ;-)
Posted by: Anonym

Re: Fragen und Antworten - 04.05.2016, 22:30:26

Da ihr so nett seid und gerne helft habe ich noch eine Frage :D

Und zwar kann man ein Kommando ja z.b. so ausgeben.. BOTNAME: Sweeepy findet James super.

Aber wie bekomme ich es hin das der nick und nicht der bot diese Nachricht schreibt.. also /super James z.b. und dann kommt gleich Sweeepy findet James super.?
Posted by: Bizarrus

Re: Fragen und Antworten - 05.05.2016, 00:25:48

Du kannst keine Nachrichten über den Nutzer selbst schreiben lassen, das wurde vor langer Zeit zwar gewünscht, aber damit kann man viel unfug treiben :-)
Posted by: Anonym

Re: Fragen und Antworten - 05.05.2016, 09:09:04

okay hehe

Aber wie kann ich einen anderen user einbinden? Das wenn ich z.b. /super Bizarrus schreibe der bot ausgibt: Sweeepy findet Bizarrus super. Geht sowas?^^
Posted by: Vampire183

Re: Fragen und Antworten - 05.05.2016, 09:49:19

Um den Bot öffentlich schreiben zu lassen, gibt es sicherlich eine Methode. In deiner geschriebenen Funktion (App functions) gibst du bei dem Ausgabetext einfach den Parameter mit. Z.B (Beispiel anhand einer privaten Nachricht ) user.sendPrivateMessage (user.getNick () + " findet " + param + " super,"); param ist der in der Funktion übergebene Parameter.

Grüße
Vampire183
Posted by: Anonym

Re: Fragen und Antworten - 05.05.2016, 10:00:57

Du kannst den user dir ausgeben lassen wenn du einfacher "user" nutzt

also in dem fall wäre es denn sowas wie (wenn du es wie ich auslagerst)

Warnung! Spoiler!
function super (user, params,command) {
var message=(user + ' mag ' + params +' sehr);
botUser.sendPublicMessage('message');
};


Warnung! Spoiler!
this.chatCommands = {
'super':function (user, params, command){
super (user, params, command);
},
nächstes function
};

Wenn du es nicht auslagerst kommt es komplett unter chat command also :

Warnung! Spoiler!
this.chatCommands = {
'super':function (user, params, command) {
var message=(user + ' mag ' + params +' sehr);
botUser.sendPublicMessage('message');
}
};
Posted by: Anonym

Re: Fragen und Antworten - 05.05.2016, 10:26:35

okay danke hat soweit geklappt aber wenn ich den kommando ohne einen namen ausgebe steht ja nur da NICK mag sehr.. wie bekomme ich es hin das mir der bot dann z.b. sagt hey du musst schon jemanden ansprechen oder so?^^
Posted by: Bizarrus

Re: Fragen und Antworten - 05.05.2016, 10:37:34

In dem du params auf seine Gültigkeit prüfst.
Simples Beispiel einer Leereingabe:

Code:

if(params.trim().length == 0) {
user.sendPrivateMessage('Wen findest du denn super? Bitte verwende den Befehl wie folgt: °>/super Nickname|/tf-overridesb /super [Nickname]<°');
return;
}



Die Gültigkeit eines Nicknamens kannst du dann ja auch ausweiten, ob der Nickname tatsächlich existiert oder aber auch eine Autokorrektur durch falsche Groß-/Kleinschreibung...
Posted by: Anonym

Re: Fragen und Antworten - 05.05.2016, 11:00:44

okay dankeschön :)

Und wie macht man das um zu checken ob der Nickname existiert und im channel ist? mit getonlineUsers?
Posted by: Cyaz

Re: Fragen und Antworten - 05.05.2016, 12:28:54

Antwort auf: IgelchenM
Poste doch mal bitte den Bereich in dem du das Icon setzen möchtest mit allen dazu gehörigen Variablen.


Was spielt das denn für eine Rolle?
var icon = KnuddelsServer.getFullImagePath('mw.gif');
user.addNicklistIcon(icon,22);

Mehr benötigst du da doch eigentlich nicht, oder? :-D

Antwort auf: Vampiric Desire
der Trick ist mit pseudoCSS den Bildcontainer zu setzen, so dass kein resizing mehr stattfindet.


Und wie funktioniert das?

Antwort auf: Sweeepy
Und wie macht man das um zu checken ob der Nickname existiert und im channel ist? mit getonlineUsers?


Schau mal hier.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 05.05.2016, 22:26:14

Antwort auf: Cyaz
igentlich nicht, oder? :-D

Antwort auf: Vampiric Desire
der Trick ist mit pseudoCSS den Bildcontainer zu setzen, so dass kein resizing mehr stattfindet.


Und wie funktioniert das?


https://bitbucket.org/knuddels/user-apps/wiki/KCode/Bilder
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 09:59:10

noch eine kurze frage zu dem nick icon zeugs :P wie sorge ich dafür das ein user nur max 1/2 icons setzen darf?
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 10:23:29

Die icons in einer persistence speichern und dann prüfen ob der nutzer schon nen icon hat
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 10:28:14

Okay nun ja das mit persistence finde ich als anfänger sehr schwer :D
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 10:47:25

Schau mal hier
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 11:01:13

ja das hatte ich schon angeschaut aber ist trotzdem schwer :D
Posted by: Cyaz

Re: Fragen und Antworten - 06.05.2016, 11:58:35

Antwort auf: Vampiric Desire
Antwort auf: Cyaz
igentlich nicht, oder? :-D

Antwort auf: Vampiric Desire
der Trick ist mit pseudoCSS den Bildcontainer zu setzen, so dass kein resizing mehr stattfindet.


Und wie funktioniert das?


https://bitbucket.org/knuddels/user-apps/wiki/KCode/Bilder


Da steht aber nicht, wie ich es ins addNicklistIcon() rein bekomme. Das bleibt ja eigentlich immer gleich.
Posted by: DdvOiD

Re: Fragen und Antworten - 06.05.2016, 12:25:48

du fügst jenen Kcode direkt dem bild hinzu...

in deinem fall wäre es dann z.B.
var icon = KnuddelsServer.getFullImagePath('mw...mx_10.gif');

oder halt wie auch immer du es haben willst..
Posted by: Cyaz

Re: Fragen und Antworten - 06.05.2016, 13:35:11

Trotzdem wird beim addNicklistIcon(Icon,ZAHL) doch mit der Zahl bestimmt, wie groß das Bild sein wird. Demnach macht das dann doch gar keinen Unterschied? Oder was soll ich da dann für eine Zahl eingeben?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 06.05.2016, 13:41:53

Antwort auf: Cyaz
Trotzdem wird beim addNicklistIcon(Icon,ZAHL) doch mit der Zahl bestimmt, wie groß das Bild sein wird. Demnach macht das dann doch gar keinen Unterschied? Oder was soll ich da dann für eine Zahl eingeben?

es geht um die Höhe des Bildes, nicht die Breite. Wenn du den Container im KCode forced, dann lässt er das unangetastet... container kannst du z.B. auch auf 1px x 1px setzen
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 14:18:35

Doch bei (icon, ZAHL) geht es um die pixel breite nicht höhe.. und mit kcode kannst du das icon versetzen usw jedoch habe ich es selbst schon mit h_ oder _mh versucht die höhe zu vergrößern aber der standard bleibt bei 20px max..
Posted by: Vampiric Desire

Re: Fragen und Antworten - 06.05.2016, 14:28:44

Antwort auf: Sweeepy
Doch bei (icon, ZAHL)

Ich sprach nicht von der Funktion sondern vom pseudoCSS KCode wegen dem Resizing. Der Trick ist wiegesagt die Containerbreite entsprechend zu verändern, dass er nicht resized.. Wie groß das Bild ist spielt erstmal keine Rolle.
Posted by: Anonym

Re: Fragen und Antworten - 06.05.2016, 17:31:34

okay dann sorry :)

gibt es irgendwo vielleicht ein tut zur persistence?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 06.05.2016, 19:23:28

Antwort auf: Sweeepy
okay dann sorry :)

gibt es irgendwo vielleicht ein tut zur persistence?


ohne jetzt ein tutorial zu machen, vielleicht hilft dir meine funktion, diese nutzt die persistenz um icons einen schlüssel zu geben beim Nutzer, und wenn man ein neues icon schickt mit dem gleichen schlüssel wird das alte erst entfernt, sollte ungefähr dem entsprechen was du dir wünscht.

Code:
User.prototype._addNicklistIconWithId = function _addNickListIconWithId(path, width, id) {
    var icons = this.getPersistence().getObject("nickIcons", {});
    if(typeof icons[id] != 'undefined') {
        this.removeNicklistIcon(icons[id]);
    }
    icons[id] = path;
    this.addNicklistIcon(path, width);
    this.getPersistence().setObject("nickIcons", icons);
};

User.prototype._removeNicklistIconById = function _removeNicklistIconById(id) {
    var icons = this.getPersistence().getObject("nickIcons", {});
    if(typeof icons[id] != 'undefined') {
        this.removeNicklistIcon(icons[id]);
    }
    delete icons[id];
    this.getPersistence().setObject("nickIcons", icons);
};


Posted by: Anonym

Re: Fragen und Antworten - 07.05.2016, 09:56:39

okay habe ich gemacht aber ich muss ja nun auch ein icon anders definieren wenn ich es einem user zuweise oder?
Posted by: Anonym

Re: Fragen und Antworten - 27.05.2016, 15:15:08

keiner eine ahnung?=D
Posted by: Öwes

Re: Fragen und Antworten - 19.06.2016, 02:33:22

Hallöchen!

meine App begrüßt die männlichen User mit dem dazu gehörigen Symbol "&#9794;" richtig.
Leider hapert es bei den weiblichen Usern. Dort erscheint gar kein Symbol bei der Begrüßung.

Bitte seid nicht so hart zu mir ... gebe mein bestes als Anfänger :-)

Könnte mir jemand bitte meinen Fehler nennen ? :-(

Warnung! Spoiler!
function computeSalutation(user) {
var age = user.getAge();

var text = user.getProfileLink();

var gender = user.getGender();


if (gender == gender.Male) {
{
if (user.isAppDeveloper())
return 'TEXT °>_h' + user.getNick() + '|/w<° (' + age + ')_ °>icon_gender_male.b.my_3.gif<° °>http://apps4.knuddels.biz/kimg/states/mcm.png<°,TEXT';
}
if (user.isChannelModerator()) {
return 'TEXT °>_h' + user.getNick() + '|/w<° (' + age + ')_ °>icon_gender_male.b.my_3.gif<° °>http://apps4.knuddels.biz/kimg/states/mcm.png<° TEXT';
}
else {
return 'TEXT °>_h' + user.getNick() + '|/w<° (' + age + ') °>icon_gender_male.b.my_3.gif<°_°TEXT';
}
}
{
if (gender == gender.Female) {
return 'TEXT °>_h' + user.getNick() + '|/w<° (' + age + ')_ °>icon_gender_female.b.my_3.gif<° °>http://apps4.knuddels.biz/kimg/states/mcm.png<° TEXT';
}
else if (user.isChannelModerator()) {
return 'TEXT °>_h' + user.getNick() + '|/w<° (' + age + ')_ °>icon_gender_female.b.my_3.gif<° °>http://apps4.knuddels.biz/kimg/states/mcm.png<° TEXT';
}
else {
return 'TEXT °>_h' + user.getNick() + '|/w<° (' + age + ') °>icon_gender_male.b.my_3.gif<° TEXT';
}

}
}


Liebe Grüße vom Öwiii
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 19.06.2016, 03:02:57

Die Grafik, die Du so für das weibliche Geschlecht verwenden möchtest, gibt es mit diesem Namen nicht. Du kannst aber folgende Grafiken verwenden:
Männlich: http://apps4.knuddels.biz/kimg/states/male.png
Weiblich: http://apps4.knuddels.biz/kimg/states/female.png

Diese liegen dann auch an gleicher Stelle wie die von Dir verwendeten MCM-Icons :-)
Posted by: Öwes

Re: Fragen und Antworten - 19.06.2016, 03:24:01

Antwort auf: Dreamboy-1996 <3
Die Grafik, die Du so für das weibliche Geschlecht verwenden möchtest, gibt es mit diesem Namen nicht. Du kannst aber folgende Grafiken verwenden:
Männlich: http://apps4.knuddels.biz/kimg/states/male.png
Weiblich: http://apps4.knuddels.biz/kimg/states/female.png

Diese liegen dann auch an gleicher Stelle wie die von Dir verwendeten MCM-Icons :-)


Vielen Dank! :-)
Posted by: Vampiric Desire

Re: Fragen und Antworten - 19.06.2016, 09:24:22

Macht euch die Mühe und ladet die Bilder auf dem FTP. Verlasst euch nicht auf die Pfade auf den Appservern. z.B. waren die Bilder früher auf apps1. vorhanden.
Posted by: djchrisnet

Re: Fragen und Antworten - 19.06.2016, 23:12:15

nix eigener Space, einfach nur

KnuddelsServer.getFullSystemImagePath('states/male.png')
KnuddelsServer.getFullSystemImagePath('states/female.png')
Posted by: Vampiric Desire

Re: Fragen und Antworten - 20.06.2016, 08:25:23

Antwort auf: djchrisnet
nix eigener Space, einfach nur

KnuddelsServer.getFullSystemImagePath('states/male.png')
KnuddelsServer.getFullSystemImagePath('states/female.png')


In der Tat auch eine alternative. Nutzt man es aber im UI ist der eigene Space vorzuziehen.
Posted by: djchrisnet

Re: Fragen und Antworten - 20.06.2016, 23:40:13

Um UI reicht auch ein /kimg/states/[fe]male.png
Posted by: Anonym

Re: Fragen und Antworten - 09.09.2016, 14:30:39

Ich versuche seit gestern eine Topliste zu erstellen und Einträge im profil anzeigen zu lassen
Die Topliste anlegen scheint zu funktionieren aber es wird mir nichts im profil angezeigt und ich finde einfach nicht raus was ich da machen muss?
Warnung! Spoiler!

Code:
App.onAppStart = function() {

    var TopListAccess = KnuddelsServer.getToplistAccess();
    var ProfileEntryAccess = KnuddelsServer.getAppProfileEntryAccess();

    var rank = TopListAccess.createOrUpdateToplist('Points', 'Rang', {
        1: 'Unbekannt',
        5: 'Gast',
    });

    ProfileEntryAccess.createOrUpdateEntry(rank, ToplistDisplayType.Label);

};

App.onUserJoined = function(user) {
    
    user.getPersistence().addNumber('Points', 1);

    var points = user.getPersistence().getNumber('Points', 0);

    var position = UserPersistenceNumbers.getPosition('Points', user, {
        ascending: false
    });

    // Ausgabe wie oft im Channel und welche Toplist platzierung
    // Funktioniert auch
    BOTUSER.sendPrivateMessage('Du hast uns ' + points + ' mal besucht und Position ' + position + '!', user);

}


Es wird also einfach nur gezählt wie oft der user im channel war und danach ränge verteilt
Wenn ich nun den Channel betrete wird auch immer 1 hochgezählt und mir wird auch ausgegeben wie oft und auch das ich auf platz 1 bin

Nun möchte ich aber wissen wie ich den Rang auch im Profil anzeigen lassen kann denn das wird nicht gemacht
Posted by: DdvOiD

Re: Fragen und Antworten - 09.09.2016, 16:06:18

die Anzeige klappt soweit ich es beurteilen kann, nur in öffentlichen mychannels
Posted by: Anonym

Re: Fragen und Antworten - 09.09.2016, 16:09:42

Ah ok ich dachte irgendwie das wäre auf dem Entwicklungsserver anders weil man da ja auch 3 cms braucht zum öffentlich schalten :-D
Wenn es nur daran liegt hab ich wohl doch kein problem danke :-D
Posted by: MaximilianB

Re: Fragen und Antworten - 10.09.2016, 20:48:35

Hallo zusammen,

ich habe im Moment das Problem, dass meine App / mein Bot mir keine Nachrichten mehr zukommen lassen kann, wenn ich nicht mehr im Channel der App bin.
Als Minimalbeispiel habe ich folgenden Code:

Code:
var App = (new function() {
    // Hier weitere Hooks

    this.chatCommands = {
        // Hier weitere Funktionen

        'msgme': function(user, params, func) {
            var timeout = 0;
            var logger = KnuddelsServer.getDefaultLogger();
            var botuser = KnuddelsServer.getDefaultBotUser();

            if ( params.length != 0 && parseInt(params) > 0 ) {
                timeout = parseInt(params) * 1000;
            }

            setTimeout(function() {
                try {
                    logger.debug("Sende privateMessage");
                    user.sendPrivateMessage("Eine privateMessage");

                    logger.debug("Sende postMessage");
                    botuser.sendPostMessage(user, "Test-Topic", "Test-Text");
                } catch ( e ) {
                    logger.error(e);
                }
            }, timeout);
        }
}());


Solange ich im Channel erhalte ich nach Ausführung der Funktion /msgme (egal ob mit oder ohne Parameter) eine Nachricht per /p und eine Nachricht per /m. Verlasse ich nach Ausführung (mit Parameter für die Verzögerung) den Channel passiert das nicht mehr.
Auch wenn ich innerhalb eines anderen Code-Stücks bin, welches nicht durch einen Funktionsaufruf vom Nutzer durchlaufen wird, werden nur dann /p und /m zugestellt, wenn sich der Nutzer (d.h. auf dem Dev-Server ich) im Channel befindet.

Da zumindest die Zustellung von Nachrichten per /m (nicht aber per /p) vorgestern noch funktioniert hat, frage ich mich, was ich jetzt falsch mache. Der Code, der die betreffende Nachricht versendet hat sich seitdem nicht mehr geändert. Die Funktion /silence sagt mir, dass ich keine Channel still gestellt habe, meine /ig-Liste und auch die /block-Liste sind leer. Gibt es vielleicht noch eine andere Möglichkeit, Nachrichten zu blockieren und ich habe das (möglicherweise unbewusst) ausgeführt?

Ich hoffe, mir kann jemand weiterhelfen.

Viele Grüße
Max
Posted by: Vampiric Desire

Re: Fragen und Antworten - 10.09.2016, 20:51:54

Ist ein anderer User in der Zeit im Channel?
Ich habe die Erfahrung gemacht, dass in einem leeren MyChannel nicht zwangsweise alles durchgeführt wird, wenn keine User im Channel sind?
Posted by: MaximilianB

Re: Fragen und Antworten - 10.09.2016, 21:31:24

Antwort auf: Vampiric Desire
Ist ein anderer User in der Zeit im Channel?


Ohne das jetzt getestet zu haben (werde ich morgen nachholen, wenn jemand anderes mit mir auf dem DevServer im Channel sein kann): Daran dürfte es liegen - ich habe vorgestern mit anderen Leuten im Channel getestet, heute war niemand mit dabei.

Danke dir.
Posted by: djchrisnet

Re: Fragen und Antworten - 11.09.2016, 00:19:33

Private Nachrichten aus unsichtbaren MyChannels werden nicht zugestellt, wenn der User nicht im Channel ist.

Erfahrungen, dass CodeTeile nicht ausgeführt werden weil niemand im Channel ist, kann ich nicht vorweisen, soweit ich weiß werden lediglich öffentliche Nachrichten an leere Channel gedropt.
Posted by: Vampiric Desire

Re: Fragen und Antworten - 11.09.2016, 00:30:31

Antwort auf: djchrisnet
Private Nachrichten aus unsichtbaren MyChannels werden nicht zugestellt, wenn der User nicht im Channel ist.

Seit wann ist das so?
P.S. Comfirmed - habs eben getestet (P.S. schalte den Channel einfach öffentlich - Das geht auf dem DEV Server auch ohne CMs)


Zitat:

Erfahrungen, dass CodeTeile nicht ausgeführt werden weil niemand im Channel ist, kann ich nicht vorweisen, soweit ich weiß werden lediglich öffentliche Nachrichten an leere Channel gedropt.


Mehrfach beobachtet, z.B. bei setTopic Codeteilen.
Posted by: djchrisnet

Re: Fragen und Antworten - 11.09.2016, 01:04:51

schon ne ganze Weile, wenn nicht schon immer

setTopic mag sein, hab mich da auch ab&zu gewundert aber mehr wüsste ich grade nicht
Posted by: Anonym

Re: Fragen und Antworten - 11.09.2016, 17:49:53

Hallo

Ich möchte gerne eine "variable" Ausgabe bei einem Befehl erzeugen in diesem Fall: der user schaltet den newsletter ein/aus dann soll die meldung lauten "Du hast den newsletter erfolgreich NEUERSTATUS" wobei NEUERSTATUS einfach durch "deaktiviert" oder "aktiviert" getauscht werden soll

Das habe ich nun so gemacht:

Code:
    'lnewsletter': function (user, params, command) {

        var newsletter = user.getPersistence().getNumber('Newsletter', 0);
        var newsswitch;

        if(newsletter == 1) {
            newsswitch = 'deaktiviert';
            setUserNewsletter(user, 2);
        }
        else {
            newsswitch = 'aktiviert';
            setUserNewsletter(user, 1);
        }

        lang['AppNewsletterSwitch'] = lang['AppNewsletterSwitch'].replace(/\$SWITCH/g, newsswitch);
        BOTUSER.sendPrivateMessage(lang['AppNewsletterSwitch'], user);

    }


Problem ist nun:

das wort das beim ersten benutzen der funktion gesetzt wird, bleibt für immer
Wenn der Newsletter beim ersten mal also aktiviert war und dann deaktiviert wird, ist es egal wie oft ich die funktion verwende, es wird mir immer ausgegeben "Du hast den Newsletter erfolgreich deaktiviert"
Seltsamerweise wird sonst alles richtig ausgeführt (status von 1 auf 2 und umgekehrt funktioniert immer richtig) nur das wort ändert sich nie solange wie die app läuft

Was ich nun alles probiert habe:

Am ende variable auf den wert null setzen
Die variable zu einem leeren string ändern
Ich hab auch versucht die letzten beiden zeilen in die anweisungen zu packen und statt mit einer variable das wort zu ersetzen das wort direkt in die replace anweisung zu schreiben

Nichts geht... das kann doch nicht so schwer sein? :-D
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 11.09.2016, 18:29:49

Problem hier ist, dass du deine lang['AppNewsletterSwitch']-Variable (lang ist global verfügbar) änderst. Somit findet er nur beim ersten Mal ein "$SWITCH", das ersetzt werden kann. Ändere die entsprechenden Codezeilen wie folgt ab:

Code:
var userOutput = lang['AppNewsletterSwitch'].replace(/\$SWITCH/g, newsswitch);
BOTUSER.sendPrivateMessage(userOutput, user);
Danach sollte es funktionieren :-)
Posted by: Anonym

Re: Fragen und Antworten - 11.09.2016, 18:47:37

Zitat:
Danach sollte es funktionieren :-)


So funktioniert es nun tatsächlich vielen dank wär ich nie drauf gekommen :-D
Posted by: DdvOiD

Re: Fragen und Antworten - 11.09.2016, 23:50:32

Antwort auf: Leechi
Hallo

Ich möchte gerne eine "variable" Ausgabe bei einem Befehl erzeugen in diesem Fall: der user schaltet den newsletter ein/aus dann soll die meldung lauten "Du hast den newsletter erfolgreich NEUERSTATUS" wobei NEUERSTATUS einfach durch "deaktiviert" oder "aktiviert" getauscht werden soll

Code:
    'lnewsletter': function (user, params, command) {

        var newsletter = user.getPersistence().getNumber('Newsletter', 0);
        var newsswitch;

        if(newsletter == 1) {
            newsswitch = 'deaktiviert';
            setUserNewsletter(user, 2);
        }
        else {
            newsswitch = 'aktiviert';
            setUserNewsletter(user, 1);
        }

        lang['AppNewsletterSwitch'] = lang['AppNewsletterSwitch'].replace(/\$SWITCH/g, newsswitch);
        BOTUSER.sendPrivateMessage(lang['AppNewsletterSwitch'], user);

    }



evtl noch einfacher & schöner:
Code:
 'lnewsletter': function (user, params, command) {

        var newsletter = user.getPersistence().getNumber('Newsletter', 0);
        
        BOTUSER.sendPrivateMessage('Du hast den Newsletter '+ (newsletter==1?"aktiviert":"deaktiviert") + '.',user);

    }


Liest sich zum einen schöner und ist ohne replace gelöst, welches nicht ganz so performant ist wie diese abfrage hier.
Posted by: Anonym

Re: Fragen und Antworten - 12.09.2016, 07:09:00

Zitat:
Liest sich zum einen schöner und ist ohne replace gelöst, welches nicht ganz so performant ist wie diese abfrage hier.


Da hast du schon recht aber ich ich bin sehr vorsichtig geworden mit solchen 'Kurzanweisungen' wie du sie benutzt das verwirrt mich sonst irgendwann noch :-D
Irgendwie find ich es auf meine art übersichtlicher bzw klarer

Und was die performance angeht hab ich vor kurzem auch erst was im Entwicklerblog gelesen, ne funktion die das wohl besser und performanter macht als das einfache replace das wollt ich mir die tage nochmal anschauen :-)

Und noch ne Frage nebenbei ich hab dazu nichts gefunden bis jetzt:
Wie ist das eigentlich wenn ich jemandem das recht gebe meine app zu installieren
Kann der das auch auf dem Entwicklerserver bzw. könnte jemand anderes meine App für sich selber umschreiben? Weil bei dieser Hello There App geht das ja auch oder is das ne extra Ausnahme?
Posted by: Vampiric Desire

Re: Fragen und Antworten - 12.09.2016, 10:25:01

Antwort auf: Leechi

Kann der das auch auf dem Entwicklerserver bzw. könnte jemand anderes meine App für sich selber umschreiben? Weil bei dieser Hello There App geht das ja auch oder is das ne extra Ausnahme?


Nein die App bleibt auf deinem FTP. Keiner kommt ohne das FTP Passwort da ran.

Hello There (Hey There) ist da keine Ausnahme. Du erhältst nur eine KOPIE der App auf deinem FTP.
Posted by: Anonym

Re: Fragen und Antworten - 12.09.2016, 15:06:57

Zitat:
Hello There (Hey There) ist da keine Ausnahme. Du erhältst nur eine KOPIE der App auf deinem FTP.


Ja aber das meine ich ja
Das ich nich das original bearbeiten durfte war mir schon klar :-D

Also bekommen die leute eine kopie meiner app in ihrem ordner und können die bearbeiten?
Posted by: Dreamboy-1996 <3

Re: Fragen und Antworten - 12.09.2016, 15:17:09

Nein. Nur, wenn du entscheidest, die App Open Source zu machen. Dies bedeutet, dass du den Code auf einer Seite hochladen würdest und anderen Leuten per Download anbietest. Bis dahin ist der serverseitige Code (das, was in deiner main.js steht) nur von denjenigen einsehbar, die Zugriff auf die Server haben. Dies wird, denke ich zumindest, lediglich das Knuddelsteam haben.
Posted by: Anonym

Re: Fragen und Antworten - 12.09.2016, 16:35:40

Dann mach ich das wohl mit github
dankeschön :-)
Posted by: Drzewo <3

Re: Fragen und Antworten - 18.09.2016, 20:47:26

Hallo :-D

Also ich habe ein kleines Problem. Anhand meines Beispiels möchte ich, dass wenn ein User eine 1 würfelt sich sein Einsatz verdoppelt. Das ganze sieht so aus aber funktioniert nicht so ganz.. zwar verdoppelt der erste Wurf den Einsatz aber wenn ich das mit weiteren Runden mache wird der Einsatz nur ein mal verdoppelt und danach tut sich nichts.. wieso ?-)

Code:
	var playerBetList = "";	
		for (var i = 0; i < players.length; i++){
			playerBetList = playerBetList + players[i] + " " + deposit[i] + " °>"+ knuddel +"<°°#°";
		}


Code:
			if (valueRolled == 1) {
				var winmsg = "Verdoppelt"
				deposit[i]*2
				Bot.sendPublicMessage("Dein Einsatz wurde "+ winmsg +".°#° "+playerBetList+"")
			}
Posted by: Vampiric Desire

Re: Fragen und Antworten - 18.09.2016, 21:10:58

du meinst mit mehreren würfeln gleichzeitig? mit so wenig code kann man jetzt relativ wenig sehen was du da genau machst

Code:
deposit[i]*2

Das ist aber falsch.
Das muss entweder:
deposit[i] *= 2
sein oder
deposit[i] = deposit[i]*2;
Posted by: Drzewo <3

Re: Fragen und Antworten - 18.09.2016, 21:20:00

Naja ich probiere ein würfelspiel mit einsätzen..

wenn ich 5 knuddel setze und eine 1 würfel bleibt der gewinn dennoch bei 5 nicht bei 10.. und ich finde meinen fehler nicht xD sind zuviele zeilen um alles zu posten..
Posted by: Vampiric Desire

Re: Fragen und Antworten - 18.09.2016, 21:21:58

den fehler habe ich dir da geschrieben!


Das muss entweder:
deposit[i] *= 2
sein oder
deposit[i] = deposit[i]*2;
Posted by: Drzewo <3

Re: Fragen und Antworten - 18.09.2016, 21:24:38

ja habe ich probiert aber geht nicht, da ich vermutlich woanders den fehler drin habe :P
Posted by: Vampiric Desire

Re: Fragen und Antworten - 18.09.2016, 21:26:39

du musst die playerbetlist variable auch erst nach dem hochrechnen erzeugen.
Posted by: Drzewo <3

Re: Fragen und Antworten - 18.09.2016, 23:25:43

Okay danke hat mir geholfen. Allerdings wird jetzt nur der erste Wurf auch berechnet.. wenn ich es z.b 3 runden spiele klappt nur der erste Wurf der berechnet wird, woran kann das liegen?

Sprich
Runde 1 5*3 = 15
Runde 2 15*3 = 15
Runde 3 15*3 = 15
Posted by: Maexxchen

Re: Fragen und Antworten - 18.09.2016, 23:36:47

So von außen ist es ziemlich schwierig, den Fehler zu finden. Was genau berechnest du jetzt da? Eben war noch von verdoppeln die Rede und nun steht da etwas mit *3? Ich vermute, dass es daran liegen könnte, dass du möglicherweise noch mit dem Einsatz der ersten Runde spielst. Aber wie gesagt, ohne weitere Informationen, ist es da nun ziemlich schwierig einen Fehler zu finden. Was genau berechnest du und wie die die exakte Umsetzung aus?
Posted by: Drzewo <3

Re: Fragen und Antworten - 18.09.2016, 23:52:51

Also ob jetzt *2 oder *3 ist irrelevant sind nur Beispiele :P

Es geht darum das ein user einen einsatz bietet von nehmen wir mal 5 kn.. so das spiel beginnt

1. runde
user würfelt 1
5*3 = 15
2. runde
user würfelt 1
5*3 = 15 (sollte aber natürlich 15*3 = 45 sein)

Sprich es berechnet das ganze immer mit dem start einsatz.. und ich habe es so programmiert, das es nach onUserDiced (wo es auch berechnet wird) auf meine function userDice springt um einen neuen/den gleichen user würfeln zu lassen.. mir qualmt langsam der kopf :-D
Posted by: Maexxchen

Re: Fragen und Antworten - 18.09.2016, 23:57:53

Ich wollte auch nur sichergehen, dass ich deine Zeilen richtig interpretiert habe. Und wie sieht jetzt die genaue Umsetzung aus? Ich vermute weiterhin, dass du den Wurf einfach nur mit dem ursprünglichen Einsatz wiederholst ohne den Einsatz vorher zu aktualisieren. Es wäre gut, den relevanten Teil deiner Implementierung mal zu sehen, um nach dem Fehler in der Berechnung zu suchen.
Posted by: Anonym

Re: Fragen und Antworten - 19.09.2016, 12:44:43

Meine frage ist heute sehr einfach

Was ist die maximale länge die ich als String in der Persistence speichern kann?
Und was ist die maximale Zahl die ich als Number in der Persistence speichern kann?
Oder gibs da keine grenzen (sehr unwahrscheinlich)?

Beim Object steht es in der doku aber bei den anderen beiden gibt es dazu keine Info

Zitat:
Sprich es berechnet das ganze immer mit dem start einsatz


Wahrscheinlich überschreibst du die werte nicht wirklich nach der Berechnung.

Mein Tipp für sowas: ALLES ausgeben lassen, also direkt nach der berechnung mal die werte ausgeben lassen und davor und dazwischen. So finde ich bei mir die meisten solcher und ähnlicher fehler. Man weiß dann genau wo etwas nicht passt und wo man suchen muss. ;-)
Posted by: Vampiric Desire

Re: Fragen und Antworten - 19.09.2016, 12:56:05

maximale Zahl = signed 64bit variable? rechne es dir selbst aus :-D
Posted by: Anonym

Re: Fragen und Antworten - 19.09.2016, 13:11:48

Ok also ich weiß nichtmal wie man diesen zahlenraum nennt von daher ist "unendlich" doch schon fast erreicht :-D
Danke dir

Aber wie sieht das mit strings aus? Weiß das jemand oder hat schonmal jemand getestet? Das wäre noch interessant zu wissen
Posted by: Vampiric Desire

Re: Fragen und Antworten - 19.09.2016, 13:37:58

Auch da gehe ich von aus, dass wenn du es normal nutzt keinen Limit erreichen wirst . Zumindest ist es möglich ganze Wikipediartikel abzuspeichern.

Posted by: Anonym

Re: Fragen und Antworten - 19.09.2016, 14:40:20

Wunderbar danke nochmal
Dann brauch man sich da wohl keine sorgen machen irgendwo "zu viel" zu speichern
Posted by: djchrisnet

Re: Fragen und Antworten - 19.09.2016, 16:00:25

das Limit liegt wie bei objekten bei 100KB was schon ein echt langer string ist
Posted by: Anonym

Re: Fragen und Antworten - 19.09.2016, 19:06:49

Nun hab ich ein problem mit dem AppContent :-D

Ich habe 3 overlays (die werden natürlich nicht alle gleichzeitig angezeigt) von denen zwei ohne probleme funktionieren
das dritte hab ich heute hinzugefügt dort kommt aber immer der ausgegraute Inhalt und das Wort Lädt...

Ich habe nun einige Fehlerquellen ausgeschlossen, mittlerweile lade ich nur noch eine HTML-Datei in der das Wort "Hallo" steht, es gibt also kein problem damit das irgendwas nicht geladen werden kann oder zu groß ist oder oder
es ist nun wirklich NUR die HTML-Datei mit dem einzigem Inhalt "Hallo"

Den Code um das Overlay anzuzeigen bzw. an den User zu senden benutze ich so auch überall genau gleich und es geht überall nur bei diesem neuem Overlay nicht

Code:
        user.removeAppContent();

        file = new HTMLFile('box-min.html');

        content = AppContent.overlayContent(file, 300, 300);

        if(user.canSendAppContent(content)) {
            user.removeAppContent()
            user.sendAppContent(content);
        }
        else {
            user.sendPrivateMessage('Tut mir leid, aber diese Funktion ist auf deinem Gerät nicht verfügbar.');
        }


Und das ist die HTML-Datei:

Html:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">

</head>
<body>

Hallo

</body>
</html>


Ich verstehe nicht woran es liegt und was ich hier falsch mache?
Wie gesagt: Bei denanderen beiden mach ich es genauso und es funktioniert ohne probleme nur dieses neue Overlay geht nicht?
Posted by: Anonym

Re: Fragen und Antworten - 19.09.2016, 21:29:25

Ok problem is schon gefunden, ich vergaß die knuddels-api einzubinden :-D
Posted by: djchrisnet

Re: Fragen und Antworten - 20.09.2016, 14:46:41

Du brauchst den Befehl "user.removeAppContent();" nicht 2x ausführen, eigentlich sogar überhaupt nicht, da es nur ein Overlay gibt und der neue Content den alten einfach überschreibt
Posted by: Anonym

M's vom BOT am Handy lesbar machen - 08.11.2016, 21:15:41

Wie sieht es mit dem "Bug" aus das User am Handy die M's vom BOT nicht lesen können,
ist dort zu erwarten das dort sich was entwickelt oder kann man das iwie umgehen das man das auch am Handy iwie lesen kann?!?
Posted by: IgelchenM

Re: M's vom BOT am Handy lesbar machen - 08.11.2016, 21:39:19

Hallo Lichtisthoffnung,
die Problematik ist bereits bekannt und kann auch nicht mit einem "Hack" irgendwie umgangen werden. Hier ist Knuddels in der Pflicht, die das ganze auch auf ihrem Schirm haben. Wann es allerdings möglich ist, dass diese Nachrichten wie gewohnt zugestellt werden ist allerdings nicht bekannt.

Schön wäre es, wenn du für solche Fragen bitte den Fragen und Antworten-Thread nutzen könntest, da dieser genau für solche Fragen eigentlich gedacht ist. Denn mit zu vielen Fragen die mit einer Antwort beantwortet sind, wird das Forum nur noch unübersichtlicher.

Lg Olli
Posted by: Anonym

Re: M's vom BOT am Handy lesbar machen - 08.11.2016, 22:22:00

Entschuldige, dachte es wäre hier richtig. Tut mir leid. Es ist halt schon so lange in der UserVoice offen, dachte es würde was neues geben!?!
Posted by: Bizarrus

Re: M's vom BOT am Handy lesbar machen - 09.11.2016, 11:53:44

Das wurde doch damals mit Absicht deaktiviert, deshalb kein "Bug"?
Posted by: Keemo

Re: Fragen und Antworten - 09.11.2016, 13:25:11

Hey LichtIstHoffnung :-)

Alles kein Problem, dafür ist doch das hier ansässige Entwickler-Forum da :-) Deinen Thread hab ich an dieser Stelle mit dem Fragen und Antworten Thread verschmolzen, da dieses hier wohl besser aufgehoben ist. Eine entsprechende Verschiebe-Mitteilung an alter Stelle bleibt 7 Aktiv (bis jene sich aufhebt).

Bitte nicht wundern über Bizarrus editieren Beitrag. Inhaltlich wurde nichts an diesem geändert, sondern ich hatte zuerst nur das TopicThema welches durch den Threadstarter des alten Threads existierte - auf die Gegebenheiten des hier ansässigen Threads angepasst. Hatte in diesem Fall, dies ein bisschen zu voreilig umgesetzt. Mir ist erst danach eingefallen, das ich an dieser Stelle durch einen eigenen Post jenen Topic-bezogen hätte anpassen können. Entschuldige meinerseits an Bizarrus für meinen Denkfehler in dem Moment. Habe die Original-Überschrift in seinem Beitrag wieder hergestellt & das Topic-Thema durch meinen nachträglichen Post des hier ansässigen Threads wieder den Gegebenheiten angepasst.
Posted by: Anonym

Re: Fragen und Antworten - 09.11.2016, 17:35:21

So weit ich weiß steht es im User Voice unter "Issue" demnach würde ich es als Fehler/Bug ansehen, oder nicht?

---------------------------------------------------------------------------------------------------------------------------------------------------------
Dann stelle ich direkt mal ne neue Frage :

Mein "Auftraggeber" möchte das er bzw Moderatoren im Channel genrell in Farbe schreiben. Überlege gerade ob ich das umsetzen kann, aber ich kann nicht auf den Nick selber zugreifen oder? Also das die Texte des Nicks mit

Warnung! Spoiler!
Code:
this.mayShowPublicMessage = function(publicMessage) {
	if (user.isChannelModerator()) {
		
	}
}


Abgefangen werden und dann vor dem Params °BB° oder so gesetzt wird oder?
Posted by: IgelchenM

Re: Fragen und Antworten - 09.11.2016, 18:03:11

Hallo, bitte lies dazu die Beschreibung in der Doku richtig durch.

Zitat:

Rückgabewert:
Boolean: true, wenn die Nachricht angezeigt werden soll, false im anderen Fall.


Das heißt, dass nicht der Satz zurück gegeben wird, sondern lediglich die Information ob er öffentlich angezeigt werden soll oder eben nicht. Daher heißt die Methode auch "mayShowPublicMessage" - darf/kann die öffentliche Nachricht gezeigt werden.



Posted by: Vampiric Desire

Re: Fragen und Antworten - 09.11.2016, 18:57:00

Antwort auf: LichtIstHoffnung

Mein "Auftraggeber" möchte das er bzw Moderatoren im Channel genrell in Farbe schreiben.

Nicht möglich, ohne die CMs als VIP/MOD zusetzen.
Posted by: Anonym

Re: Fragen und Antworten - 09.11.2016, 21:02:49

Antwort auf: Vampiric Desire
Antwort auf: LichtIstHoffnung

Mein "Auftraggeber" möchte das er bzw Moderatoren im Channel genrell in Farbe schreiben.

Nicht möglich, ohne die CMs als VIP/MOD zusetzen.



Danke, iwann mal geplant. Mal im UserVoice schauen ob es dazu was gibt :D
Posted by: Anonym

Re: Fragen und Antworten - 30.01.2017, 20:10:57

Ich hätte mal eine Frage zum MyChannel Hintergrund.. Ich weiß nicht ob ich etwas Falsch mache oder ich was falschen gehört habe aber egal ob ich eine Auflösung von 800x600 (was mir gesagt wurde das optimal für MyChannels ist) oder 1280x768 nutze bleibt das Hintergrund Bild dennoch ziemlich verpixelt.. habs als .jpg gespeichert und auch versucht unter 80kb zu lassen aber nichts hilft so richtig und was noch komisch ist wenn ich bei /mychannel auf erweitern klicke passst sich das Hintergrund bild automatisch an und ist plötzlich hochauflösend und perfekt zu sehen aber nur für mich als Channelbesitzer..

Deshalb meine bitte wie erstelle ich mir ein perfektes Hintergrund Bild und wie stelle ich es am besten ein? :D danke im vorraus
Posted by: Tagtraum

Re: Fragen und Antworten - 18.02.2017, 12:54:24

Während beim Live-Server alles normal klappt, gibt es beim developer-Server ein Problem mit meiner App.

Unter /apps steht, sie würde laufen, aber es wird überhaupt nichts angezeigt und keiner der Befehle im Channel funktioniert. Hat noch jemand Probleme dieser Art?

P.S.: Ich habe übrigens nichts geändert, an der App selber kann es also nicht liegen.
Posted by: Markus

Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 11:29:30

Hallo,

wie kann ich den Server2Server Zugriff "http://api.game-socket.de:80" aus der Liste entfernen? Ich habe dieser Domain keinen Zugriff gewährt und möchte diese gerne aus der Liste der Server2Server Zugriffe entfernen, die Domain stand dort bereits nach der Installation einer App.

Markus
Posted by: Bizarrus

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 12:45:45

Die Frage ist, welche App du dafür installiert hast; Diese Schnittstelle ist nämlich ausschließlich für Apps, die über GameSockets laufen (Angry Knuddel, 8-Ball Beta, Mafia3, Montagsmaler/Besserwisser,...) und auch derzeit nur durch auserwählte Entwickler genutzt werden kann.
Posted by: Dreamboy-1996 <3

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 12:51:26

Der Eintrag findet sich auch bei sämtlichen meiner Apps. Manuell hinzugefügt habe auch ich sie nicht.
Posted by: Vampiric Desire

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 12:52:36

Das ist Knuddels. in /apps stehen alle URLs wo die Appzugriff hat, unabhängig davon ob die app jemals versucht hat damit zu verbinden. Ich finde es extrem fail aber naja...
Posted by: Bizarrus

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 12:54:03

Okay, das erklärt somit den Eintrag; Danke Dennis.

Anscheinend listet Knuddels wohl alle Domains des Entwicklers auf, sobald eine App von diesem genutzt wird; Da ihr alle die Blacklist verwendet, wird es sicherlich dadurch kommen.
Posted by: Vampiric Desire

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 12:58:16

Nein adrian, er listet die Auf, weil die domain statt einen DEV alle Devs freigibt....^^

selbst in der channelmaster steht die domain
Posted by: Bizarrus

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 13:02:22

Bei meinen Channels und Apps stehen nur die Domains drin, die auch dort drinstehen sollen.
Du selbst verwendest sicherlich auch ExternalAccess, genauso wie Chris für seine DiceOne-Seite, von denen habe ich keinerlei Einträge.
Posted by: Vampiric Desire

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 13:07:36

Ja weil wir kein * in knuddelsAccess.txt schreiben sondern nur unsere devid... du hast aber bei gamesockts ein *, das heißt du gibst ALLE devs frei und somit landet der eintrag dann auch bei allen apps
Posted by: Markus

Re: Server2Server Zugriff http://api.game-socket.de:80 - 11.06.2017, 13:17:01

Hallo,

ich habe nur meine eigene App installiert, keine fremden Apps wie die Blacklist oder Channelmaster, ...

Markus
Posted by: Danclight2016

Re: Server2Server Zugriff http://api.game-socket.de:80 - 23.08.2017, 13:01:59

Hallo....ich habe mal eine Frage an Dich, ich möchte mir gerne ein Nicklisten Icon machen, wie geht das am besten, wäre dir sehr dankbar für deine Hilfe
Posted by: IgelchenM

Re: Nicklisten Icon - 23.08.2017, 15:13:52

Hey Danclight2016,

willkommen im Kreis der User App Entwickler. Ich gehe mal davon aus, dass du ein Icon bereits hast und dieses nun nur noch in deine User App einbinden möchtest. Dafür gibt es im Knuddels-Blog ein Tutorial dazu. Eine kurze Beispielanwendung findest du hier zu aber auch in der API-Dokumentation addNicklistIcon(). Solltest du weitere Fragen haben, so kannst du jederzeit wieder Fragen hier stellen.

Lg IgelchenM
Posted by: Danclight2016

Re: Nicklisten Icon - 24.08.2017, 08:09:22

Guten Morgen....Danke für deine Antwort, habe leider noch kein Nicklisticon, dabei brauche ich eben Hilfe,wie mache ich einen.Danke im vorraus für Deine Hilfe
Posted by: Königspinguin

Re: Nicklisten Icon - 24.08.2017, 14:19:09

Antwort auf: Danclight2016
Guten Morgen....Danke für deine Antwort, habe leider noch kein Nicklisticon, dabei brauche ich eben Hilfe,wie mache ich einen.Danke im vorraus für Deine Hilfe


Wenn du welche direkt beim Channel joinen setzen magst, kann ich dir etwas aus meiner App zeigen, da nutze ich genau das.

Wenn du welche selbst erstmal erstellen willst, kannst du diese mit jedem Bildprogramm erstellen, selbst Paint geht da, nur dort kannst du keine transparenten Hintergründe erstellen.
Posted by: Danclight2016

Re: Nicklisten Icon - 24.08.2017, 16:28:10

Hallo, ja würde mir gerne deine anschauen....vielleicht könntest du mir ja schritt für schritt erklären wie ich mir eine bauen kann....
für mich ist das alles noch Neuland
Bedanke mich im Vorraus für deine Hilfe
Posted by: Königspinguin

Re: Nicklisten Icon - 24.08.2017, 22:04:23

Gerne, aber gut das wir nun dadurch wissen das du Nickeffekte meinst und keine Icons hinter dem Nick. :-D
Posted by: IgelchenM

Re: Nicklisten Icon - 24.08.2017, 23:52:00

Wenn du Nicklist-Icons erstellen willst und zum Beispiel Photoshop hast, so kannst du dich an diesem Beitrag im Knuddels Blog orientieren. Dabei geht's aber in erster Linie nur darum Icons im Stile von MCM, CM etc. zu gestalten.

Solltest du eigene Icons suchen und einfügen wollen, so gibt es in dem nachfolgenden Beitrag aus dem Knuddels Blog ein paar Seiten. Hierbei solltest du aber das Copyright der einzelnen Grafiken beachten!
Posted by: Öwes

Re: Fragen und Antworten - 27.08.2017, 02:23:14

Moin :-)

ich verzweifle gerade an meiner Begrüßung in meiner App.
Habe die Profilbilder in die Begrüßung eingebaut und direkt daneben auch das MCM Zeichen.

Sieht bei mir so aus:

Zitat:
°>https://apps3.knuddels.biz/kimg/states/mcm.png<° °>' + profilePhoto + '<°


Beides funktioniert einwandfrei. Sowohl MCM Symbol wie auch Profilbild werden angezeigt.

Leider rutscht das MCM Symbol neben mit dem Profilbild, mit nach oben und hängt einfach in der Luft.
Das heißt das MCM Symbol schwebt über dem Text, auf Höhe des Profilbildes.

Selbst wenn ich das Profilbild an einer anderen Stelle vom Text setze, bleibt das MCM Symbol stur und möchte nicht an die richtige Position. :-(

Wahrscheinlich ein kleiner Fehler der große Wirkung zeigt... :-[

Freue mich über Hilfe von euch =)
Liebe Grüße, Öwes.



Posted by: Markus

Re: Fragen und Antworten - 27.08.2017, 11:04:28

Hallo Öwes,

verwende bitte mal die Funktion .b im der Grafik an, um diese auf der baseline zu positionieren.

Markus
Posted by: Öwes

Re: Fragen und Antworten - 27.08.2017, 14:38:06

Antwort auf: Markus
Hallo Öwes,

verwende bitte mal die Funktion .b im der Grafik an, um diese auf der baseline zu positionieren.

Markus


Danke schonmal für den Tipp. :-)

Muss ich das in den Link einbauen vom MCM-Symbol ? Oder wie wendet man diese Funktion an?
Soweit reichen meine Kenntnisse denn doch nicht aus :-(
Posted by: Markus

Re: Fragen und Antworten - 27.08.2017, 14:52:44

Hallo Öwes,

das ist richtig. Der Zusatz kommt im Link zwischen dem Dateinamen und der Dateiendung zum Einsatz. Das sieht dann wie folgt aus:

Code:
mcm...b.png

Bitte achte darauf, dass genau so viele Punkte wie im Beispiel vor kommen. Am besten probierst du das ganze im Editor (/editor) einmal aus um zu sehen ob der Zusatz seine Wirkung so erzielt wie du es dir vorstellst.

Markus
Posted by: Öwes

Re: Fragen und Antworten - 27.08.2017, 14:57:55

Antwort auf: Markus
Hallo Öwes,

das ist richtig. Der Zusatz kommt im Link zwischen dem Dateinamen und der Dateiendung zum Einsatz. Das sieht dann wie folgt aus:

Code:
mcm...b.png

Bitte achte darauf, dass genau so viele Punkte wie im Beispiel vor kommen. Am besten probierst du das ganze im Editor (/editor) einmal aus um zu sehen ob der Zusatz seine Wirkung so erzielt wie du es dir vorstellst.

Markus



Vielen vielen Dank für deine Hilfe, ich habs hinbekommen! Eine schwierige Geburt...:-D
Posted by: LusoDelect

Re: Fragen und Antworten - 14.03.2018, 14:00:43

Ich beschäftige mich seit kurzem mit der API und den UserApps allgemein, deswegen wäre es gut möglich das ich etwas übersehen oder auch meine Programmierfähigkeiten eingerostet sind, aber...

Wie kann ich etwas in die Persistence eines Dritten schreiben, dessen Nick man aus einer Variable hat und eben nicht in die des Users der eine aktion durchführt?
Posted by: IgelchenM

Re: Fragen und Antworten - 14.03.2018, 15:00:51

Code:
var NICK = 'LusoDelect';
var USERID= userAccess.getUserId(NICK);
userAccess.getUserById(USERID).getPersistence().addNumber('points', 1);


Zielführend ist hierbei die Klasse UserAccess.

Lg IgelchenM
Posted by: LusoDelect

Re: Fragen und Antworten - 17.03.2018, 05:17:28

Ich danke dir, nach paar Versuchen hatte ich es drauf, vor allem mit der Instanz die vorher nötig war :P

Wie sieht es mit den frei verwendbaren Bildern aus, darf man diese auch bearbeiten?
Posted by: Bizarrus

Re: Fragen und Antworten - 17.03.2018, 11:09:33

Frei verwendbare Bilder sind frei verwendbare Bilder.
Ob du die bearbeitest, ausdruckst und über den Klo hängst oder ein T-Shirt damit bedruckst; Alles das bleibt dir überlassen. Nicht umsonst heißt es "frei verwendbar".
Posted by: LusoDelect

Re: Fragen und Antworten - 17.03.2018, 11:25:36

Antwort auf: Bizarrus
Frei verwendbare Bilder sind frei verwendbare Bilder.
Ob du die bearbeitest, ausdruckst und über den Klo hängst oder ein T-Shirt damit bedruckst; Alles das bleibt dir überlassen. Nicht umsonst heißt es "frei verwendbar".


Ja klingt schon logisch, aber..

"Von Knuddels bereitgestellte Bilder. Alle hier gezeigten Bilder kannst du in deiner App frei verwenden."

"Du darfst sie in deiner App verwenden" und
"Wir treten alle Rechte an den Bildern ab, mach damit was du willst"
Ist für mich schon ein Unterschied, sicher ist sicher, aber danke ;)
Posted by: Bizarrus

Re: Fragen und Antworten - 17.03.2018, 19:44:09

Du fragtest, ob du die Bilder verändern darfst. Du zitierst, dass du innerhalb deiner App jeden erdenklichen Mist damit anstellen kannst. Ob du nun ein Hintergrund, Smileys oder nackte Knuddel damit bastelst, bleibt dir überlassen,
Posted by: LusoDelect

Re: Fragen und Antworten - 21.03.2018, 18:37:09

Hallo nochmal,

hab viel experimentiert und komme nicht weiter und zwar..

habe ich eine function (setIcon) geschrieben die auf getUserByID zugreift, habe eine globale als auch testweise eine lokale Instanz von UserAccess angelegt, kann die Methode aber trotzdem nicht aufrufen.

Habe die function testweise innerhalb von App als auch außerhalb definiert, das gleiche Ergebnis

Code:
App-Logs: 
SafeFlirt: ERROR: org.mozilla.javascript.EcmaError: TypeError: Cannot call method "getUserById" of undefined
(knuddelsDEV.30570507.SafeFlirt@v0: main.js#23)
	at knuddelsDEV.30570507.SafeFlirt@v0: main.js:23 (setIcon)
	at knuddelsDEV.30570507.SafeFlirt@v0: main.js:135
Posted by: Bizarrus

Re: Fragen und Antworten - 21.03.2018, 21:02:36

Kannst du dazu ein Beispiel nennen?
Anscheinend hast du versucht deine Methode innerhalb des AppContainers aufzurufen; da bekommst du Probleme, da die Methoden als separaten Context aufgerufen werden - onUserJoin hat also eine andere Scope als onUserLeft (als Beispiel).

Du kannst das Problem lösen, in dem du den Context des AppContainers bindest:

Code:
this.onUserJoin = function(user) {
    this.setIcon(); // Methode nicht aufrufbar, da falscher Scope
};

this.onUserJoin = function(user) {
    this.setIcon(); // OK
}.bind(this); // Context an Methode binden
Posted by: LusoDelect

Re: Fragen und Antworten - 21.03.2018, 21:29:43

JavaScript ist nicht ganz meine Welt und ist generell einige Jahre her das ich was geschrieben habe, mein Code sieht wie folgt aus

Code:
var App =  {};

var userAccess = KnuddelsServer.getUserAccess();

function setIcon(userID)
{
		
	var GENDER = App.userAccess.getUserById(userID).getGender(); //auch ohne App versucht
			
        berechne dies und das;

	return ICON;
			
}
	
App.chatCommands = 
{
	test: function(user, params, command)										
		{
				var USERID = userAccess.getUserId(params);						
				userAccess.getUserById(USERID).getPersistence().addNumber('test', 1);								
				
				var Icon = setIcon(USERID);   // Ebenfalls Fehlermeldung
				userAccess.getUserById(USERID).addNicklistIcon(Icon, 13);
		},

}


Bei dem versuch es alles in "App" zu schreiben, gab es Probleme beim ausführen der Chat Funktionen, so hat es für mich am besten funktioniert, bis auf die eigene Methode. Wo ich hier bind() verwenden soll und ob überhaupt, blick ich leider nicht durch
Posted by: Bizarrus

Re: Fragen und Antworten - 21.03.2018, 21:41:42

Das initialisieren solltest du nicht außerhalb des AppContainers tätigen!

Die API ist erst am onAppStart komplett verfügbar, hier loegt auch sicherlich das Problem.
Posted by: LusoDelect

Re: Fragen und Antworten - 21.03.2018, 22:08:16

Okay, nach 180 Zeilen Code, setze ich mich lieber an paar JavaScript Tutorials, den ich blick grade nicht durch und verstehe nicht ganz :-D
Die Syntax sollte man halt doch besser kennen...

Trotzdem danke für die Hilfe
Posted by: LusoDelect

Re: Fragen und Antworten - 22.03.2018, 09:39:58

Hab leider nicht gefunden wie man dem Beitrag bearbeitet, jedenfalls läuft es jetzt halbswegs, zumindest werden keine Fehler angezeigt.

Hab den Code jetzt wieder umstrukturiert, vorher hatte es auf diese weiße nicht funktioniert weil ich eine Kleinigkeit, das "()" am ende vergessen hatte x.x
Code:
var App =  (new function()
{
    code;
}[b]()[/b]);


Jetzt muss ich nur noch herausfinden, warum das Icon trotzdem nicht gesetzt wird, es aber auch keine Fehlermeldung gibt^^
Posted by: RadioMacher

Re: Fragen und Antworten - 13.04.2018, 05:15:25

Hallo,

ich versuche Daten von meinem Server zu laden und nutze:

Code:
var externalServerAccess = KnuddelsServer.getExternalServerAccess();
externalServerAccess.getURL('http://meinserver.com/getinfo.php', {
    onSuccess: function(responseData, externalServerResponse)
    {
        var bot = KnuddelsServer.getDefaultBotUser();
        bot.sendPublicMessage('Antwort ist: ' + externalServerResponse);
    },
    onFailure: function(responseData, externalServerResponse)
    {
        var bot = KnuddelsServer.getDefaultBotUser();
        bot.sendPublicMessage('Fehler: ' + externalServerResponse);
    }
});


Wenn ich das Kommando in der / Funktion ausführe bekomme ich vom Bot angezeigt:

Antwort ist: ExternalServerResponse

statt dem Inhalt von meinem PHP Skript.

Jetzt zur Frage; Muss ich die Serverantwort speziell formatieren? Sprich als Objekt oder kann ich einfach ein print_r oder echo nutzen?


Danke
Posted by: Bizarrus

Re: Fragen und Antworten - 13.04.2018, 12:02:30

Schau doch mal, was du verwendest... Die Namen sind so eindeutig, dass man nur mit Müdigkeit ausreden suchen kann :-P

Du verwendest externalServerResponse, was das Response-Object mit Header & Co ist, du möchtest aber die Daten davon verwenden, deswegen heißt die Variable auch responseData ;-)

Ich hab's mal für dich extra farblich hervorgehoben:
Posted by: RadioMacher

Re: Fragen und Antworten - 13.04.2018, 16:13:03

Hallo,

ja, es war wohl die Uhrzeit... wie man sieht.. 5 Uhr morgens nach einer langen Nacht und einem neu erstellten Android App :) Und ja, man sollte manchmal nicht einfach den Beispielcode nutzen und ihm vertrauen wie er ist und doch mal die Augen aufmachen.

Danke für die schnelle Antwort :)
Posted by: LusoDelect

Re: Fragen und Antworten - 14.04.2018, 14:14:57

Hab mal wieder eine Frage und zwar, wie kann ich per App einen User bannen bzw /cl setzen?
Das Muten bzw. das öffentliche schreiben zu unterbinden war ja einfach, mit mayShowPublicMessage, aber bei cl blick ich nicht ganz durch und mayJoinChannel scheint auch nur das betreten zu unterbinden, aber nicht raus zu werfen.

Oder Notfalls, wie kann bzw. kann ich ich mit dem Bot Befehle ausführen? /lc NICK
Schreibt er einfach aus, wird aber nicht ausgeführt
Posted by: DdvOiD

Re: Fragen und Antworten - 14.04.2018, 14:42:29

Antwort auf: LusoDelect
Hab mal wieder eine Frage und zwar, wie kann ich per App einen User bannen bzw /cl setzen?
Das Muten bzw. das öffentliche schreiben zu unterbinden war ja einfach, mit mayShowPublicMessage, aber bei cl blick ich nicht ganz durch und mayJoinChannel scheint auch nur das betreten zu unterbinden, aber nicht raus zu werfen.

Oder Notfalls, wie kann bzw. kann ich ich mit dem Bot Befehle ausführen? /lc NICK
Schreibt er einfach aus, wird aber nicht ausgeführt


Du kannst einen User nicht ausschließlich per app aus dem Channel entfernen.
Lediglich cms/Inhaber informieren & einen entsprechenden Link/Button anbieten, für den /cl - mehr leider nicht
Posted by: LusoDelect

Re: Fragen und Antworten - 16.04.2018, 03:34:11

Wie kann ich prüfen ob ein User existiert oder in der App registriert ist?

In meinem Channel hat man mit
/like NICK
oder
/dislike NICK
die Möglichkeit andere zu bewerten, dabei wird geprüft ob ein Nickname eingegeben wurde, ob man es an sich selbst anwendet und ob der User aktuell im Channel online ist, das beseitigt viele mögliche Fehler, gibt man den Nick jedoch falsch ein, gibt es die Fehlermeldung das er nicht existiert und/oder nicht auf die Persistence zugegriffen werden kann und dazu konnte ich leider noch keine Lösung oder passende Methode finden.

Danke im voraus :)
Posted by: IgelchenM

Re: Fragen und Antworten - 16.04.2018, 09:38:19

Der Schlüssel zu deinem Glück ist hier UserAccess. Diese Klasse ermöglicht es dir zum Beispiel mayAccess zu nutzen um abzufragen ob du auf den User zugreifen darfst oder nicht.

Code:
var nick = 'Ironist';
var userAccess = KnuddelsServer.getUserAccess();
if (userAccess.exists(nick))
{
    var userId = userAccess.getUserId(nick);
    if (userAccess.mayAccess(userId))
    {
        // Der User ist zugreifbar...
    }
}
Posted by: RadioMacher

Re: Fragen und Antworten - 21.04.2018, 17:44:02

Hallo,

kurze Frage (nach ewigem suchen) zu Knuddeltransfers. Ich möchte meinen Channelbesuchern Knuddel zukommen lassen (random) und habe ein Beispiel gefunden welches so aussieht:

Code:
KnuddelsServer.getDefaultBotUser().transferKnuddel(user, 1, "...weil du cool bist");


Bei mir sieht es also wie folgt aus:

Code:
var bot = KnuddelsServer.getDefaultBotUser();
var gameuser = user.getNick();
var gewinnsumme = '0.01';
bot.transferKnuddel(gameuser, gewinnsumme, 'Auszahlung');


Wenn ich das so laufen lasse bekomme ich:

Code:
ERROR: org.mozilla.javascript.EvaluatorException: Can't find method com.knuddels.apps.user.BotUser.transferKnuddel(string,string,string). (knuddelsDEV.30567835.MyWebradio@v0: main.js#860)

	at knuddelsDEV.30567835.MyWebradio@v0: main.js:860


Zeile 860 ist in dem Fall

Code:
bot.transferKnuddel(gameuser, gewinnsumme, 'Auszahlung');



Ja, ich habe wieder zu lange gearbeitet und vielleicht ist es so offensichtlich.. aber na ja manchmal erleuchtet mich eine Antwort von anderen Entwicklern :)
Posted by: Kev777

Re: Fragen und Antworten - 21.04.2018, 17:47:50

würde ich erstmal tippen das

var gewinnsumme = '0.01';

nicht so optimal ist und da eine numerische variable besser wäre als ein string.
Posted by: Bizarrus

Re: Fragen und Antworten - 21.04.2018, 22:22:20

gewinnsumme muss den Typ "KnuddelAmount" besitzen.

Schaue dir mal die Fehlermeldung an:
Zitat:
transferKnuddel(string,string,string)

Du übergibst drei Strings - Die Methode wurde ganz einfach nicht gefunden, weil diese in der Form nicht existiert.

Siehe hier dazu in der Dokumentation: http://developer.knuddels.de/docs/classes/BotUser.html#method_transferKnuddel
Die Methode benötigt folgende Parameter:
Zitat:

transferKnuddel(User | KnuddelAccount,KnuddelAmount,Object)


Hier gibt es auch Beispiele in der Doku.
Posted by: Keemo

Re: Fragen und Antworten - 23.04.2018, 11:40:25

Hallo :-)

Bin selber kein Entwickler und damit nicht mit der Materie vertraut. In einem anderen Thread erwähnte ein Nutzer einem AppStore (innerhalb von Knuddels). Ich habe dazu in den UA-Vorstellungen innerhalb des Forums leider nichts gefunden - würde mir das aber sehr gerne mal aus Neugier anschauen. Wie müsste ich hier vorgehen um diesen AppStore zu öffnen? (Ich vermute es handelt sich um ein Macro?)
Posted by: Bizarrus

Re: Fragen und Antworten - 23.04.2018, 15:34:42

Die AppStore stammt von mir, nicht von Knuddels. Diese musst du vorher erst installieren:
/apps install 30558139.AppStore



Posted by: Keemo

Re: Fragen und Antworten - 23.04.2018, 16:00:03

Danke dir für die Auskunft. Habe mir das jetzt nur auf die Schnelle mal angeschaut - aber du hast da was sehr schönes programmiert; sieht echt gut aus. :-)
Posted by: TobyB

Re: Fragen und Antworten - 01.04.2019, 17:53:40

HINWEIS

Wer den Changelog aufmerksam verfolgt hat, der hat es vielleicht schon mitbekommen.

Wir haben in den letzten Tagen zwei Entscheidungen getroffen, die auch User Apps betreffen und die euch die Entwicklung vereinfachen. Wir haben den Support für Android 5.x und älter, sowie den Support für Internet Explorer (alle Versionen) eingestellt. Das heißt wir werden diese Clients bei Updates und Bugfixes nicht mehr berücksichtigen. Und mit der Zeit, manchmal früher als später, werden auch Features von diesen Plattformen und Clients verschwinden, die es jetzt dort gibt. Das ist Teil des üblichen Lebenszyklus einer Software, bzw eines Clients.

Happy Coding. :)
Posted by: TobyB

Re: Fragen und Antworten - 06.05.2019, 16:19:01

Antwort auf: TobyB
Kleiner Breaking-Change der bald kommt

Betrifft: LoadConfiguration

Vorher:
War ein "Loading-Indicator-Image" gesetzt, dann wurde auschließlich dieses angezeigt und nicht der "Text". War kein Image aber ein Text gesetzt, dann wurde dieser Text angezeigt.

Nachher:
Das "Loading-Indicator-Image" und der "Text" des Loading-Indicators werden gleichzeitig angezeigt wenn sie beide gesetzt sind. Ist nur eins von beidesn gesetzt, dann wird nur dieses angezeigt.
Wer jetzt nur das Bild und keinen Text anzeigen möchte kann den Text auf einen leeren Wert (oder null oder undefined) setzen um ihn zu entfernen.

APIs:
LoadConfiguration.setLoadingIndicatorImage()
LoadConfiguration.setText()

wurde nun live ausgerollt.
Posted by: TobyB

Re: Fragen und Antworten - 21.05.2019, 15:54:55

Hallo allerseits. :)


Wir haben die neue Teamverwaltung auf allen Servern ausgerollt (außer DEV). Der knuddels.at hat sie seit Freitag dem 11.05. und knuddels.de war eben dran.
Diese Teamverwaltung ist grundsätzlich vollständig abwärtskompatibel mit der die es bisher gab, ist aber intern ein kompletter re-write und bringt dadurch nun auch vollen Support für Android und HTMLChat mit (das ist vor allem für Teamleiter-Funktionen).

Für euch als User Apps Entwickler gibt es an einer Stelle Berührungspunkte: User.isInTeam()

Daher wäre es super, wenn ihr das in den nächsten Tagen im Auge behalten könnt, ob das weiterhin so funktioniert wie bisher. Falls nicht, bitte meldet euch bei mir.


Dankeschön. :)
Posted by: TobyB

Re: Fragen und Antworten - 23.05.2019, 15:51:50

Antwort auf: TobyB
Wir haben die neue Teamverwaltung auf allen Servern ausgerollt (außer DEV)

Der DEV-Server hat sie jetzt auch. :)
Posted by: Keemo

Re: Fragen und Antworten - 20.07.2019, 11:34:02

Hallo, ich wollte jetzt den anderen Thread: Richtlinie zur Nutzung vom KnuddelAccount nicht mit meiner Frage stören; deswegen an dieser Stelle:

Was ist die K-Bank (und was hat damit auf sich)?
Posted by: Sephiroth ME

Re: Fragen und Antworten - 20.07.2019, 12:12:25

Bei der KBank handelt es sich um ein Unterkonto, welches rein durch die App verwaltet wird. Die meisten größeren Apps arbeiten auf diese Weise. Dabei werden Knuddel auf ein AppInternes Konto übertragen und davon/darüber wieder ausgezahlt/genutzt.

Knuddel <=> AppInterne Währung <=> Knuddel

Dieses bietet allerdings ein paar kleine Vorteilen und reduziert auch Anfragen an den ChatServer selbst:
  • Knuddel, welche gelöschte Nutzer hatten, können einbehalten werden, da sie niemals vom Nutzer angefordert wurden oder an diesen übergeben wurden.
  • Syncrone Handhabung von Werten innerhalb der App, der KnuddelsTransfer ist Asyncron und damit schwerer für die Entwicklung nachzuverfolgen/darauf zu reagieren.
  • geringere Belastung für den ChatServer selbst, da nicht jeder Transfer (kleine Beträge die man nahezu regelmäßig bekommt) direkt verrechnet werden müssen
  • leichtere Prüfungen von Knuddel, welche von der App aus in Umlauf sind, da man diese mit diversen Methoden leichter durchgehen kann ohne sämtliche Nutzer zu prüfen

Aber auch Nachteile sind vorhanden:
  • Bei einem löschen der App sind sämtliche Knuddel welche auf dem Unterkonto verfügbar sind, verloren.
    Knuddels selbst hat hier keine Möglichkeit zur Nachverfolgung mehr, außer die AppInternen Datenbank zu analyisieren, falls diese nicht vorher auch geleert wurden.
  • Betreiber könnten jederzeit Kleinstbeträge unbemerkt von allen Nutzerkonten entfernen, da es keinen KnuddelTransfer gibt, bei dem der Nutzer informiert würde.
  • Übersicht, in welcher App, man was investiert/verfügbar hat, geht für die Nutzer mitunter verloren.
Posted by: Keemo

Re: Fragen und Antworten - 20.07.2019, 13:14:45

Uiii, :-)

das ist ja mal eine sehr ausführliche Antwort & hat mir sehr weitergeholfen. Ich bedanke mich recht-herzlichst für deine Hilfestellung. :)
Posted by: Exe92

Re: Fragen und Antworten - 07.02.2020, 22:38:10

Hallo, ich habe noch nie etwas entwickelt.
Erfahrung mit Gameserver und ContentManagementSysteme für Webseiten, habe ich zwar bereits aber das entspricht ja nicht das was hier gefordert wird.

Ich möchte gerne das der Channelbot in seiner Begrüßung einen Link enthält (innerhalb von Knuddels).
Wenn dieser Link angeklickt wird, möchte ich gerne darunter mehrere unterlinks verteilen. ( Kategorien ).

Wenn man sich dann für eine dieser Kategorien entscheidet möchte ich den Inhalt mit Text und wenn möglich mit Bild gestalten unter diesen Informationen die man dann erhält möchte ich darunter wieder die Auswahl haben der Kategorien.

Im Grunde klingt es Simple nur wie ich das umsetzen kann weiß ich eben nicht, aus der https://developer.knuddels.de/ bin ich auch nicht schlauer geworden.
Posted by: 0oMiro0

Re: Fragen und Antworten - 08.02.2020, 07:05:18

hilft das vielleicht weiter?
beispiel apps
https://bitbucket.org/knuddels/user-apps/downloads/
wiki
https://bitbucket.org/knuddels/user-apps/wiki/Tutorial

hier sachen zum reinbauen
https://developer.knuddels.de/docs/

mfg
Posted by: 0oMiro0

Re: Fragen und Antworten - 08.02.2020, 07:38:06

und button oder links findest du hier
https://bitbucket.org/knuddels/user-apps/wiki/KCode


viel mir grade ein
Posted by: Exe92

Re: Fragen und Antworten - 08.02.2020, 08:52:16

Dankeschön
Posted by: its good

Re: Fragen und Antworten - 12.02.2020, 14:04:02

Huhu,

sofern du möchtest, helfe ich dir gerne bei der Umsetzung, wenn es zeitlich passt. Kannst mir diesbezüglich im Chat schreiben, wenn du da einen Denkanstoß brauchst. :-)

Grüße
Posted by: Keemo

Re: Fragen und Antworten - 12.02.2020, 15:04:43

Hallo ihr Lieben, :-)

ich wollte hierzu gerne folgendes nachfragen: 50% der NeuRegs (über PC) landen ja automatisch in K3-Web bzw. die Nutzergruppe die an der 2.NickReg für K3 teilgenommen hat. Dort gibt es bisher keine UAs. Für mich, der sich sehr wenig mit der Programmierung auskennt, aber sich immer noch mit dem Thema als Solches beschäftigt - würde gerne wissen:

Wenn man Apps für Android/HTML-Chat entwickelt - sind diese (zumindest) von der reinen Theorie in K3 (Web-Variante, Browser) lauffähig?

Voraussetzung ist hier natürlich das die UAs + zugehörige API von Knuddels in K3-Web in ferner Zukunft vllt. freigeschaltet werden (Quelle). Meine eigene Annahme war dazu bisher - das der Unterbau (HTML-Basis im MiniChat) recht ähnlich zu K3-Web ist und ggf. auch so vom Browser als Solches umgesetzt wird. Kurzrum das man K3-WebChat = als HTML-/Mini-Chat 2.0 in Bezug auf die UA´s als solches theoretisch betrachten kann.

Ist diese Annahme von der reinen Theorie richtig oder ist diese falsch?

Ich hoffe ich trete hier niemanden mit dieser Newbie-Frage böswillig auf den Schlips. Jene Grundgedanken-Frage hatte ich mir aber u.a. selbst gestellt; weil hier die eigene Überlegung war - das man den eigenen Fokus evtl. auf besagte HTML-Apps legt (und so fernab der StAPP ) zutreffenden Clienten ggf. erreicht. ?-)
Posted by: Sephiroth ME

Re: Fragen und Antworten - 12.02.2020, 16:37:20

Antwort auf: Keemo
Wenn man Apps für Android/HTML-Chat entwickelt - sind diese (zumindest) von der reinen Theorie in K3 (Web-Variante, Browser) lauffähig?

Ja, die User Apps (UIs) sind reine Websites. Du kannst sie ja im HTML Chat genauso verwenden. Im Vergleich dazu, die Java Applet Dialoge wie /mychannel mussten komplett für den HTML Chat geschrieben werden und sind aktuell nur notdürftige Lösungen.

Antwort auf: Keemo
Ist diese Annahme von der reinen Theorie richtig oder ist diese falsch?

Ja, auch das ist korrekt. Sobald die nötigen Schnittstellen dort vorhanden sind, könne die UIs dort auch empfangen und dargestellt werden.

Sodele~
Posted by: Keemo

Re: Fragen und Antworten - 13.02.2020, 09:16:13

Hallo Sephi,

wie immer ein großes Dankeschön, aber auch ein Lob für deine Hilfestellung. Nun verstehe ich einige Zusammenhänge diesbezüglich etwas besser, Danke ! :-)
Posted by: its good

Re: Fragen und Antworten - 19.04.2021, 08:12:05

Moin, weiß einer, ob sendPostMessage() inzwischen auf allen Geräten dargestellt wird?
Posted by: DdvOiD

Re: Fragen und Antworten - 19.04.2021, 16:22:33

bot nachrichten (postMessage) sind inzwischen in den messenger integriert und somit Plattform unabhängig sichtbar
Posted by: its good

Re: Fragen und Antworten - 19.04.2021, 22:57:42

Ja super, danke! :-D
Posted by: Tagtraum

Re: Fragen und Antworten - 20.05.2021, 22:16:30

Heute gab es per /m eine Warnung vom Bot meines Channels:

Die Persistence-Datenbank hat mehr als 90% des Maximal-Werts erreicht.
Bei 100% wird die App automatisch deaktiviert. Besser bald drum kümmern ...

DB-Größe: 90% (171,73 MB)
Channel: /Insel
App: knuddelsDEV.30562432.Insel
Besitzer: Tagtraum
Entwickler: Tagtraum


Wem muss man das melden bzw. wer kümmert sich um die Erweitertung der Ressourcen?

Danke & Gruß
Posted by: its good

Re: Fragen und Antworten - 21.05.2021, 07:59:28

Huhu, diesbezüglich musst du dich an den Entwickler der App wenden, also dich selber. Meine Apps haben noch nie das Limit erreicht, weshalb diese App wohl eine große Menge Daten speichern muss und diese wohl nicht löscht. Wenn die Warnung vom App-Bot kam, hat der Entwickler, also du, diese Meldung wohl zur Sicherheit eingebaut. Andernfalls käme sie von James, denke ich.

Die Persistenz hat also ein Limit an Daten, die gespeichert werden können. Wenn du manuell die Möglichkeit hast, welche zu löschen, dann würde ich das machen. Auch eine externe Datenbank könnte Abhilfe schaffen, wenn keine dieser Informationen gelöscht werden darf. Letztendlich weißt nur du, was du da speicherst. Am besten entwickelt man sich für solche Fälle ein eigenes Management, welches unbenötigte Daten entfernt.
Posted by: DdvOiD

Re: Fragen und Antworten - 21.05.2021, 12:12:55

Grundsätzlich hat mein vorposter natürlich recht.
Man sollte nur die Dinge speichern die auch wirklich notwendig sind, es kann dennoch vorkommen, dass aufgrund der Menge an Nutzern die Standard-groesse der Datenbank nicht ausreicht).
In diesem Fall wendest du dich einfach mal per /m an BTCM. Und nennst ihm die relevanten Infos (Channel, app-Id, und dass du die angesprochene Warnung erhalten hast) - nach kurzer Prüfung wird dann das Limit für dich (und diese eine App) erhöht, sodass es keinerlei Probleme gibt.
Posted by: Tagtraum

Re: Fragen und Antworten - 29.05.2021, 22:30:37

Antwort auf: DdvOiD
Grundsätzlich hat mein vorposter natürlich recht.
Man sollte nur die Dinge speichern die auch wirklich notwendig sind, es kann dennoch vorkommen, dass aufgrund der Menge an Nutzern die Standard-groesse der Datenbank nicht ausreicht).
In diesem Fall wendest du dich einfach mal per /m an BTCM. Und nennst ihm die relevanten Infos (Channel, app-Id, und dass du die angesprochene Warnung erhalten hast) - nach kurzer Prüfung wird dann das Limit für dich (und diese eine App) erhöht, sodass es keinerlei Probleme gibt.


DdvOiD, deine Vermutung ist korrekt. Eine weitere Optimierung der App bzgl. Speicherplatz ist nicht möglich und die Masse der Daten hat sich durch die Menge der User angesammelt.

Von BTCM gibt es bisher leider keine Reaktion auf meine /m - wo kann man sich denn noch hinwenden? Irgendwer sollte ja idealerweise verantwortlich und außerdem auch erreichbar sein ;-)
Posted by: SchlechteOnkelz

Re: Fragen und Antworten - 02.06.2021, 07:35:57

In erster Linie ist das BTCM, du kannst dich aber auch an Sirez wenden.
Am besten nutzt du dafür die DM auf dem Entwickler Discord. Da siehst du auch gleich wer da ist bzw online ist.

Im Normalfall hast du dann innerhalb 1 Tages definitiv eine Rückmeldung.