Du bist nicht angemeldet. [Anmelden]
Seite 12 von 26 < 1 2 ... 10 11 12 13 14 ... 25 26 >
Optionen
Thema bewerten
Re: Fragen und Antworten * [Re: Tagtraum] - #2755348 - 29.10.2015, 19:46:35
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
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
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2755355 - 29.10.2015, 20:50:11
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
@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?

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755358 - 29.10.2015, 21:04:42
UltimateG4ming
​#WirSindKeineBots

Registriert: 15.06.2010
Beiträge: 4.024
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.
_________________________
if ($ahnung == 'keine' ) { use ( FAQ ) && ( Google | | Suche ) }
if ($antwort == 0 ) { post ( Frage ) }

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755366 - 29.10.2015, 21:40:18
Kev777
​Forumsengel

Registriert: 03.09.2010
Beiträge: 7.607
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
_________________________
Orwell war ein Optimist
________

„Würden die Menschen das Geldsystem verstehen, hätten wir eine Revolution noch vor morgen früh.“
- Henry Ford

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Kev777] - #2755385 - 29.10.2015, 23:16:09
IgelchenM
​Laubhaufenbewohner

Registriert: 10.02.2005
Beiträge: 1.479
Ort: Bochum
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)
_________________________
Wo zum Teufel ist dieser Wayne wenn man ihn braucht?!

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: IgelchenM] - #2755386 - 29.10.2015, 23:27:51
IgelchenM
​Laubhaufenbewohner

Registriert: 10.02.2005
Beiträge: 1.479
Ort: Bochum
Hat sich erledigt. Hab noch nen alten Code verwendet ;-)
_________________________
Wo zum Teufel ist dieser Wayne wenn man ihn braucht?!

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: IgelchenM] - #2755577 - 31.10.2015, 13:59:46
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
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..

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755579 - 31.10.2015, 14:20:43
Kev777
​Forumsengel

Registriert: 03.09.2010
Beiträge: 7.607
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);
_________________________
Orwell war ein Optimist
________

„Würden die Menschen das Geldsystem verstehen, hätten wir eine Revolution noch vor morgen früh.“
- Henry Ford

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755580 - 31.10.2015, 14:21:07
Bizarrus
Nicht registriert


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


Das ganze muss so aussehen:
Zitat:

test...mw_20.mh_20.png

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: ] - #2755683 - 01.11.2015, 14:41:09
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
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?


Bearbeitet von Tagtraum (01.11.2015, 14:43:07)

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755730 - 01.11.2015, 18:39:07
Bizarrus
Nicht registriert


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



Bearbeitet von Kev777 (08.11.2015, 12:20:04)
Bearbeitungsgrund: Zeilenumbruch im Code-Block eingefügt.

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: ] - #2755745 - 01.11.2015, 19:54:46
Bizarrus
Nicht registriert


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)


Bearbeitet von Bizarrus (01.11.2015, 19:55:30)

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: ] - #2755747 - 01.11.2015, 20:06:28
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
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. ;-)






Bearbeitet von Tagtraum (01.11.2015, 20:09:48)

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755775 - 01.11.2015, 22:05:16
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
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
};


_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2755800 - 01.11.2015, 22:58:11
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
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?






Bearbeitet von Tagtraum (01.11.2015, 22:59:29)

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755804 - 01.11.2015, 23:10:43
Bizarrus
Nicht registriert


Zitat:
var App.chatCommands = {};

Eine (Unter-)Eigenschaft einer Variable (oder ehergesagt eines Objektes) wird nicht mit "var" betitelt.


Bearbeitet von Bizarrus (01.11.2015, 23:11:10)

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: ] - #2755811 - 01.11.2015, 23:35:39
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
sry hast vollkommen recht, weiß ich natürlich - hatte nur schnell runtergetippt


Bearbeitet von Vampiric Desire (01.11.2015, 23:36:04)
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2756982 - 07.11.2015, 21:42:43
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
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?


Bearbeitet von Tagtraum (07.11.2015, 21:48:28)

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2757009 - 08.11.2015, 02:37:29
UltimateG4ming
​#WirSindKeineBots

Registriert: 15.06.2010
Beiträge: 4.024
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.
_________________________
if ($ahnung == 'keine' ) { use ( FAQ ) && ( Google | | Suche ) }
if ($antwort == 0 ) { post ( Frage ) }

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: UltimateG4ming] - #2757048 - 08.11.2015, 11:23:23
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 117
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 ;-)


Bearbeitet von Tagtraum (08.11.2015, 11:27:14)

[zum Seitenanfang]  
Seite 12 von 26 < 1 2 ... 10 11 12 13 14 ... 25 26 >


Moderator(en):  Misterious