From 635e02c3bd486ffff2175b4458b6cb0e0a1e4e7d Mon Sep 17 00:00:00 2001 From: Darren Date: Fri, 25 Jan 2013 18:49:49 +0000 Subject: [PATCH] Removed irc_events from the prototype; Untied IrcEventBinder from other objects; .dispose() on all IRC objects; --- server/irc/binder.js | 27 ----------------- server/irc/channel.js | 46 ++++++++++++++-------------- server/irc/eventbinder.js | 32 ++++++++++++++++++++ server/irc/server.js | 64 +++++++++++++++++++++------------------ server/irc/user.js | 44 +++++++++++++++------------ 5 files changed, 113 insertions(+), 100 deletions(-) delete mode 100755 server/irc/binder.js create mode 100644 server/irc/eventbinder.js diff --git a/server/irc/binder.js b/server/irc/binder.js deleted file mode 100755 index 7f3f0e5..0000000 --- a/server/irc/binder.js +++ /dev/null @@ -1,27 +0,0 @@ -var _ = require('lodash'); - -var Binder = function () {}; - -module.exports = Binder; - -Binder.prototype.bindEvents = function () { - var that = this; - _.each(this.irc_events, function (fn, event_name, irc_events) { - // Bind the event to `that` context, storing it with the event listing - if (!irc_events[event_name].bound_fn) { - irc_events[event_name].bound_fn = fn.bind(that); - } - - that.irc_connection.on(that.scope + ':' + event_name, irc_events[event_name].bound_fn); - }); -}; - - -Binder.prototype.unbindEvents = function () { - var that = this; - _.each(this.irc_events, function(fn, event_name, irc_events) { - if (irc_events[event_name].bound_fn) { - that.irc_connection.removeListener(that.scope + ':' + event_name, irc_events[event_name].bound_fn); - } - }); -}; \ No newline at end of file diff --git a/server/irc/channel.js b/server/irc/channel.js index 57d197c..e75bcf0 100644 --- a/server/irc/channel.js +++ b/server/irc/channel.js @@ -1,46 +1,44 @@ var util = require('util'), - Binder = require('./binder.js'); + EventBinder = require('./eventbinder.js'); function IrcChannel(irc_connection, name) { this.irc_connection = irc_connection; this.name = name; - this.scope = 'channel:' + name; - Binder.call(this); - this.members = []; this.ban_list_buffer = []; + + // Listen for events on the IRC connection + this.irc_events = { + join: onJoin, + part: onPart, + kick: onKick, + quit: onQuit, + privmsg: onMsg, + notice: onNotice, + ctcp_request: onCtcpRequest, + ctcp_response: onCtcpResponse, + topic: onTopic, + nicklist: onNicklist, + nicklistEnd: onNicklistEnd, + banlist: onBanList, + banlist_end: onBanListEnd, + topicsetby: onTopicSetby, + mode: onMode + }; + EventBinder.bindIrcEvents('channel:' + this.name, this.irc_events, this, irc_connection); } -util.inherits(IrcChannel, Binder); module.exports = IrcChannel; IrcChannel.prototype.dispose = function (){ - this.unbindEvents(); + EventBinder.unbindIrcEvents('channel:' + this.name, this.irc_events); this.irc_connection = undefined; }; -IrcChannel.prototype.irc_events = { - join: onJoin, - part: onPart, - kick: onKick, - quit: onQuit, - privmsg: onMsg, - notice: onNotice, - ctcp_request: onCtcpRequest, - ctcp_response: onCtcpResponse, - topic: onTopic, - nicklist: onNicklist, - nicklistEnd: onNicklistEnd, - banlist: onBanList, - banlist_end: onBanListEnd, - topicsetby: onTopicSetby, - mode: onMode -}; - function onJoin(event) { this.irc_connection.clientEvent('join', { diff --git a/server/irc/eventbinder.js b/server/irc/eventbinder.js new file mode 100644 index 0000000..0f4fe8d --- /dev/null +++ b/server/irc/eventbinder.js @@ -0,0 +1,32 @@ +var _ = require('lodash'); + +var IrcEventBinder = function () {}; + +module.exports = IrcEvents; + + + +IrcEvents.prototype.bindIrcEvents = function (events_scope, event_map, context, irc_connection) { + _.each(event_map, function (fn, event_name) { + // Bind the event to `context`, storing it with the event listing + if (!event_map[event_name].bound_fn) { + event_map[event_name].bound_fn = fn.bind(context); + } + + // Add the listener to the IRC connection object + irc_connection.on(events_scope + ':' + event_name, event_map[event_name].bound_fn); + }); +}; + + +IrcEvents.prototype.unbindIrcEvents = function (events_scope, event_map, irc_connection) { + _.each(event_map, function(fn, event_name) { + if (event_map[event_name].bound_fn) { + // Remove the listener from the IRC connection object + irc_connection.removeListener(events_scope + ':' + event_name, event_map[event_name].bound_fn); + + // Remove the bound function as no longer needed + event_map[event_name].bound_fn = undefined; + } + }); +}; \ No newline at end of file diff --git a/server/irc/server.js b/server/irc/server.js index f52748d..afd4d68 100755 --- a/server/irc/server.js +++ b/server/irc/server.js @@ -1,47 +1,53 @@ var util = require('util'), - Binder = require('./binder.js'); + EventBinder = require('./eventbinder.js'); var IrcServer = function (irc_connection, host, port) { this.irc_connection = irc_connection; this.host = host; this.port = port; - - this.scope = 'server:' + host; - - Binder.call(this); - + this.list_buffer = []; this.motd_buffer = ''; + + this.irc_events = { + connect: onConnect, + options: onOptions, + list_start: onListStart, + list_channel: onListChannel, + list_end: onListEnd, + motd_start: onMotdStart, + motd: onMotd, + motd_end: onMotdEnd, + error: onError, + channel_redirect: onChannelRedirect, + no_such_nick: onNoSuchNick, + cannot_send_to_channel: onCannotSendToChan, + too_many_channels: onTooManyChannels, + user_not_in_channel: onUserNotInChannel, + not_on_channel: onNotOnChannel, + channel_is_full: onChannelIsFull, + invite_only_channel: onInviteOnlyChannel, + banned_from_channel: onBannedFromChannel, + bad_channel_key: onBadChannelKey, + chanop_privs_needed: onChanopPrivsNeeded, + nickname_in_use: onNicknameInUse + }; + EventBinder.bindIrcEvents('server:' + this.host, this.irc_events, this, irc_connection); + + }; -util.inherits(IrcServer, Binder); module.exports = IrcServer; -IrcServer.prototype.irc_events = { - connect: onConnect, - options: onOptions, - list_start: onListStart, - list_channel: onListChannel, - list_end: onListEnd, - motd_start: onMotdStart, - motd: onMotd, - motd_end: onMotdEnd, - error: onError, - channel_redirect: onChannelRedirect, - no_such_nick: onNoSuchNick, - cannot_send_to_channel: onCannotSendToChan, - too_many_channels: onTooManyChannels, - user_not_in_channel: onUserNotInChannel, - not_on_channel: onNotOnChannel, - channel_is_full: onChannelIsFull, - invite_only_channel: onInviteOnlyChannel, - banned_from_channel: onBannedFromChannel, - bad_channel_key: onBadChannelKey, - chanop_privs_needed: onChanopPrivsNeeded, - nickname_in_use: onNicknameInUse + +IrcServer.prototype.dispose = function (){ + EventBinder.unbindIrcEvents('server:' + this.host, this.irc_events); + this.irc_connection = undefined; }; + + function onConnect(event) { this.irc_connection.clientEvent('connect', { nick: event.nick diff --git a/server/irc/user.js b/server/irc/user.js index 2ca5117..40fdf90 100755 --- a/server/irc/user.js +++ b/server/irc/user.js @@ -1,36 +1,40 @@ var util = require('util'), - Binder = require('./binder.js'); + EventBinder = require('./eventbinder.js'); var IrcUser = function (irc_connection, nick) { this.irc_connection = irc_connection; this.nick = nick; - this.scope = 'user:' + nick; - Binder.call(this); + this.irc_events = { + nick: onNick, + away: onAway, + quit: onKick, + whoisuser: onWhoisUser, + whoisoperator: onWhoisOperator, + whoischannels: onWhoisChannels, + whoismodes: onWhoisModes, + whoisidle: onWhoisIdle, + whoisregnick: onRegNick, + endofwhois: onEhoisEnd, + notice: onNotice, + ctcp_response: onCtcpResponse, + privmsg: onPrivmsg, + ctcp_request: onCtcpRequest, + mode: onMode + }; + EventBinder.bindIrcEvents('user:' + this.nick, this.irc_events, this, irc_connection); }; -util.inherits(IrcUser, Binder); module.exports = IrcUser; -IrcUser.prototype.irc_events = { - nick: onNick, - away: onAway, - quit: onKick, - whoisuser: onWhoisUser, - whoisoperator: onWhoisOperator, - whoischannels: onWhoisChannels, - whoismodes: onWhoisModes, - whoisidle: onWhoisIdle, - whoisregnick: onRegNick, - endofwhois: onEhoisEnd, - notice: onNotice, - ctcp_response: onCtcpResponse, - privmsg: onPrivmsg, - ctcp_request: onCtcpRequest, - mode: onMode + +IrcUser.prototype.dispose = function (){ + EventBinder.unbindIrcEvents('user:' + this.nick, this.irc_events); + this.irc_connection = undefined; }; + function onNick(event) { this.irc_connection.clientEvent('nick', { nick: event.nick, -- 2.25.1