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

ÔÇ×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
​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 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
​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 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.
_________________________
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 M├╝he 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 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
​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 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