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 vorschlgst.

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. Natrlich 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 Mglichkeiten 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.602
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 mchte fr jede der 20 Punktarten eine Topliste ausgeben und auerdem eine Topliste, die alle Punktarten enthlt (hier knnte also auch ein User mit mehreren Punktarten mehrfach auftreten).

Letzteres wre einfacher, wenn smtliche 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 msste das doch ok sein?


Vielleicht verstehe ich das Problem vllig falsch, aber irgendwie hrt sich das alles danach an als wre das eigentlich ein Job fr
http://developer.knuddels.de/docs/classes/UserPersistenceNumbers.html
_________________________
Orwell war ein Optimist
________

Wrden die Menschen das Geldsystem verstehen, htten wir eine Revolution noch vor morgen frh.
- 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 ausfhre:
Code:
var toplistAccess = KnuddelsServer.getToplistAccess();

var labelMap = {
 '1': 'Anfnger',
 '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 mchte gerade Bilder gestaucht oder gestreckt darstellen knnen. 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.602
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
________

Wrden die Menschen das Geldsystem verstehen, htten wir eine Revolution noch vor morgen frh.
- Henry Ford

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Tagtraum] - #2755580 - 31.10.2015, 14:21:07
Bizarrus
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.581
Ort: Dortmund
Das ist auch falsch:
Zitat:
test.png.mw_20.mh_20


Das ganze muss so aussehen:
Zitat:

test...mw_20.mh_20.png
_________________________
Bot.public('I love >features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<');

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Bizarrus] - #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 knnte noch fr 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 unbersichtlich. Wie genau msste der Syntax sein, damit man die einzelnen Funktionen (die alle zu den chatCommands gehren) in Dateien funktion1.js, funktion2.js, ... funktionX.js auslagern knnte?


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
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.581
Ort: Dortmund
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 auszufhren!');
			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('BBDurchsage 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 auszufhren!');
				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 prfe 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 eingefgt.
_________________________
Bot.public('I love >features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<');

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Bizarrus] - #2755745 - 01.11.2015, 19:54:46
Bizarrus
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.581
Ort: Dortmund
Ich habe das ganze mal als Boilerplate-Code auf GitHub OpenSource gestellt:
https://github.com/MyChannel-Apps/Boilerplate

Ich habe mir sogar kurz die Mhe gemacht alles zu Dokumentieren (Siehe /docs/ Ordner)


Bearbeitet von Bizarrus (01.11.2015, 19:55:30)
_________________________
Bot.public('I love >features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<');

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

Registriert: 08.04.2003
Beiträge: 117
Hi Bizarrus, die Lsung ist insofern schn, dass du so gewissermaen eine Abstraktionsebene hher bist.

Fr das was ich gerade mache / noch vor habe, ist es mir aber zu aufwendig, so komplett auf Objektorientierung umzubauen. Auch wenn das bei dir hbsch aussieht.

Ist hier vielleicht noch jemand ohne Objektorientierung unterwegs und hat das Problem gelst? Diese chatCommands-Funktion wird bei mir einfach so gro, lsst sich das nicht irgendwie einfach aufteilen?

So wie ich es verstanden habe, klappt require in JS nmlich nur fr 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

Fr das was ich gerade mache / noch vor habe, ist es mir aber zu aufwendig, so komplett auf Objektorientierung umzubauen. Auch wenn das bei dir hbsch 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 ausgefhrt
};


_________________________
/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


strzt 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. Drfte 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
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.581
Ort: Dortmund
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)
_________________________
Bot.public('I love >features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<');

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

Registriert: 15.09.2013
Beiträge: 1.681
sry hast vollkommen recht, wei ich natrlich - 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 mchte.
Kann man chatCommands dazu gewissermaen ineinander bauen?
Beispiel: Es gibt eine mgliche 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 ausgefhrt werden
i++;
}
*noch weiterer code* // soll auch ausgefhrt werden
}


Ich mchte also nicht einfach nur einen chatCommand /zocken definieren, sondern /spiel msste 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, bentigst Du einen extra Bereich fr /zocken, in welchem Du prfst, 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 Mglichkeit, das Ganze so wie Du mchtest 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 fr die Antwort.

Ein Bereich in /zocken, der prft ob /spiel bereits aufgerufen ist wrde nicht reichen, denn in Zeile 2 meines Codebeispiels (dort stand *ein bischen Code*) werden bereits diverse Variablen definiert,
von denen auch abhngt, welche /zocken-Varianten berhaupt mglich sind. Vielleicht war der Pseudocode nicht ausfhrlich genug.

Ich bruchte weiter Zugriff auf die Variablen aus /spiel, auch wenn jemand schon /zocken aufgerufen hat.. die alle per Persistenz merken wrde die Komplexitt extrem erhhen.
Hat hier vielleicht Jemand ein Spiel, das mehrere voneinander abhngige 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, knnte das mal jemand anpassen? So kann man einige Beitrge 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