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 "<°');