moduls.js refactor; Removed existing module events; Modules now laoding from config
authorDarren <darren@darrenwhitlen.com>
Sat, 24 Nov 2012 16:51:27 +0000 (16:51 +0000)
committerDarren <darren@darrenwhitlen.com>
Sat, 24 Nov 2012 16:51:27 +0000 (16:51 +0000)
config.example.js
server/client.js
server/clientcommands.js
server/kiwi.js
server/modules.js

index bf107638ba8e0e17151d087ac81ccb295d280245..e17c8f39498e6865ee1a76b13da1f9ff6702fb91 100644 (file)
@@ -66,7 +66,7 @@ conf.cap_options = [];
 conf.module_dir = "./kiwi_modules/";
 
 // Which modules to load
-conf.modules = ["spamfilter", "statistics"];
+conf.modules = [];
 
 
 
index 6ffe38c5a9330420e01a750782cb7903aad81b22..36edf0c0254088b4a797f7c90b48cd172a24bb31 100755 (executable)
@@ -46,8 +46,6 @@ var Client = function (websocket) {
     websocket.on('error', function () {
         websocketError.apply(that, arguments);
     });
-
-    global.modules.emit('client:connected', {client:this});
 };
 util.inherits(Client, events.EventEmitter);
 
index 13b5243488fe7045091dbfbb2bba05d21bbfda13..f5c870b02f27d35bc4852ff23912b7fcc14aa448 100644 (file)
@@ -22,18 +22,8 @@ ClientCommands.prototype.run = function (command, args, irc_connection, callback
 \r
 var listeners = {\r
     PRIVMSG: function (args, irc_connection, callback) {\r
-        var data = {};\r
-        data.args = args;\r
-        data.client = null;\r
-\r
-        global.modules.emit('client:commands:msg', data);\r
-\r
-        if (args.target && (args.msg)) {\r
-            // TODO: Enable plugin support here again\r
-            //obj = kiwi.kiwi_mod.run('msgsend', args, {websocket: websocket});\r
-            //if (obj !== null) {\r
-                irc_connection.write('PRIVMSG ' + args.target + ' :' + args.msg, callback);\r
-            //}\r
+         if (args.target && (args.msg)) {\r
+            irc_connection.write('PRIVMSG ' + args.target + ' :' + args.msg, callback);\r
         }\r
     },\r
     \r
index 91b204e2e8cc652cd21a8177b6e5079a5b4aa0d6..1c7520d33cae028a249d5b17ffa918476248460b 100755 (executable)
@@ -3,7 +3,7 @@ var fs          = require('fs'),
     WebListener = require('./weblistener.js'),
     config      = require('./configuration.js'),
     rehash      = require('./rehash.js'),
-    modules = require('./modules.js');
+    modules     = require('./modules.js');
 
 
 
@@ -62,7 +62,14 @@ global.modules = new modules.Publisher();
 // Register as the active interface
 modules.registerPublisher(global.modules);
 
-require('../server_modules/example.js');
+// Load any modules in the config
+(global.config.modules || []).forEach(function (module_name) {
+    if (modules.load('../server_modules/' + module_name + '.js')) {
+        console.log('Module ' + module_name + ' loaded successfuly');
+    } else {
+        console.log('Module ' + module_name + ' failed to load');
+    }
+});
 
 
 
index 73d4553522747b31667bdfa9b8374488aa571abd..aed7743ffd91710e718f0f2fb14a46449cb2c815 100644 (file)
@@ -1,33 +1,81 @@
 var events = require('events'),
-       util = require('util');
+    util = require('util'),
+    _ = require('lodash');
 
 
+/**
+ * Publisher
+ * The main point in which events are fired and bound to
+ */
+
 // Where events are bound to
 var active_publisher;
 
 
 // Create a publisher to allow event subscribing
 function Publisher (obj) {
-       var EventPublisher = function modulePublisher() {};
-       util.inherits(EventPublisher, events.EventEmitter);
+    var EventPublisher = function modulePublisher() {};
+    util.inherits(EventPublisher, events.EventEmitter);
 
-       return new EventPublisher();
+    return new EventPublisher();
 }
 
 
 // Register an already created Publisher() as the active instance
 function registerPublisher (obj) {
-       active_publisher = obj;
+    active_publisher = obj;
+}
+
+
+
+
+
+
+/**
+ * Keeping track of modules
+ */
+
+// Hold the loaded modules
+var registered_modules = {};
+
+function loadModule (module_file) {
+    var module;
+
+    // Get an instance of the module and remove it from the cache
+    try {
+        module = require(module_file);
+        delete require.cache[require.resolve(module_file)];
+    } catch (err) {
+        // Module was not found
+        return false;
+    }
+
+    return module;
 }
 
 
+// Find a registered collection, .dispose() of it and remove it
+function unloadModule (module) {
+    registered_modules = _.reject(registered_modules, function (registered_module) {
+        if (module === registered_module) {
+            module.dispose();
+            return true;
+        }
+    });
+}
+
+
+
+
 
 
 /**
  * Module object
  * To be created by modules to bind to server events
  */
-function Module (module_name) {}
+function Module (module_name) {
+    registered_modules[module_name] = this;
+}
 
 
 // Holder for all the bound events by this module
@@ -35,51 +83,63 @@ Module.prototype._events = {};
 
 
 // Keep track of this modules events and bind
-Module.prototype.subscribe = function (event_name, fn) {
-       this._events[event_name] = this._events[event_name] || [];
-       this._events[event_name].push(fn);
+Module.prototype.on = function (event_name, fn) {
+    var internal_events = ['dispose'];
+
+    this._events[event_name] = this._events[event_name] || [];
+    this._events[event_name].push(fn);
 
-       active_publisher.on(event_name, fn);
+    // If this is an internal event, do not propogate the event
+    if (internal_events.indexOf(event_name) !== -1) {
+        active_publisher.on(event_name, fn);
+    }
 };
 
 
 // Keep track of this modules events and bind once
 Module.prototype.once = function (event_name, fn) {
-       this._events[event_name] = this._events[event_name] || [];
-       this._events[event_name].push(fn);
+    this._events[event_name] = this._events[event_name] || [];
+    this._events[event_name].push(fn);
 
-       active_publisher.once(event_name, fn);
+    active_publisher.once(event_name, fn);
 };
 
 
 // Remove any events by this module only
-Module.prototype.unsubscribe = function (event_name, fn) {
-       var idx;
-
-       if (typeof event_name === 'undefined') {
-               // Remove all events
-               this._events = [];
-
-       } else if (typeof fn === 'undefined') {
-               // Remove all of 1 event type
-               delete this._events[event_name];
-
-       } else {
-               // Remove a single event + callback
-               for (idx in (this._events[event_name] || [])) {
-                       if (this._events[event_name][idx] === fn) {
-                               delete this._events[event_name][idx];
-                       }
-               }
-       }
-
-       active_publisher.removeListener(event_name, fn);
+Module.prototype.off = function (event_name, fn) {
+    var idx;
+
+    if (typeof event_name === 'undefined') {
+        // Remove all events
+        this._events = [];
+
+    } else if (typeof fn === 'undefined') {
+        // Remove all of 1 event type
+        delete this._events[event_name];
+
+    } else {
+        // Remove a single event + callback
+        for (idx in (this._events[event_name] || [])) {
+            if (this._events[event_name][idx] === fn) {
+                delete this._events[event_name][idx];
+            }
+        }
+    }
+
+    active_publisher.removeListener(event_name, fn);
 };
 
 
+
 // Clean up anything used by this module
 Module.prototype.dispose = function () {
-       this.unsubscribe();
+    // Call any dispose callbacks
+    (this._events['dispose'] || []).forEach(function (callback) {
+        callback();
+    });
+
+    // Remove all bound event listeners
+    this.off();
 };
 
 
@@ -88,10 +148,13 @@ Module.prototype.dispose = function () {
 
 
 module.exports = {
-       // Objects
-       Module: Module,
-       Publisher: Publisher,
-
-       // Methods
-       registerPublisher: registerPublisher
+    // Objects
+    Module: Module,
+    Publisher: Publisher,
+
+    // Methods
+    registerPublisher: registerPublisher,
+    load: loadModule,
+    unload: unloadModule,
+    getRegisteredModules: function () { return registered_modules; }
 };
\ No newline at end of file