Merge pull request #239 from M2Ys4U/key
[KiwiIRC.git] / server / irc / channel.js
1 var util = require('util'),
2 EventBinder = require('./eventbinder.js'),
3 IrcUser = require('./user.js');
4
5 var IrcChannel = function(irc_connection, name) {
6 this.irc_connection = irc_connection;
7 this.name = name;
8
9 this.members = [];
10 this.ban_list_buffer = [];
11
12 // Listen for events on the IRC connection
13 this.irc_events = {
14 join: onJoin,
15 part: onPart,
16 kick: onKick,
17 quit: onQuit,
18 privmsg: onMsg,
19 notice: onNotice,
20 ctcp_request: onCtcpRequest,
21 ctcp_response: onCtcpResponse,
22 topic: onTopic,
23 userlist: onNicklist,
24 userlist_end: onNicklistEnd,
25 banlist: onBanList,
26 banlist_end: onBanListEnd,
27 topicsetby: onTopicSetBy,
28 mode: onMode
29 };
30 EventBinder.bindIrcEvents('channel ' + this.name, this.irc_events, this, irc_connection);
31 }
32
33
34 module.exports = IrcChannel;
35
36
37 IrcChannel.prototype.dispose = function (){
38 EventBinder.unbindIrcEvents('channel ' + this.name, this.irc_events, this.irc_connection);
39 this.irc_connection = undefined;
40 };
41
42
43
44 function onJoin(event) {
45 this.irc_connection.clientEvent('join', {
46 channel: this.name,
47 nick: event.nick,
48 ident: event.ident,
49 hostname: event.hostname
50 });
51
52 // If we've just joined this channel then request get a nick list
53 if (event.nick === this.irc_connection.nick) {
54 this.irc_connection.write('NAMES ' + this.name);
55 }
56 };
57
58
59 function onPart(event) {
60 this.irc_connection.clientEvent('part', {
61 nick: event.nick,
62 ident: event.ident,
63 hostname: event.hostname,
64 channel: this.name,
65 message: event.message
66 });
67 };
68
69
70 function onKick(event) {
71 this.irc_connection.clientEvent('kick', {
72 kicked: event.kicked, // Nick of the kicked
73 nick: event.nick, // Nick of the kicker
74 ident: event.ident,
75 hostname: event.hostname,
76 channel: this.name,
77 message: event.message
78 });
79 };
80
81
82 function onQuit(event) {
83 this.irc_connection.clientEvent('quit', {
84 nick: event.nick,
85 ident: event.ident,
86 hostname: event.hostname,
87 message: event.message
88 });
89 };
90
91
92 function onMsg(event) {
93 this.irc_connection.clientEvent('msg', {
94 nick: event.nick,
95 ident: event.ident,
96 hostname: event.hostname,
97 channel: this.name,
98 msg: event.msg
99 });
100 };
101
102
103 function onNotice(event) {
104 this.irc_connection.clientEvent('notice', {
105 nick: event.nick,
106 ident: event.ident,
107 hostname: event.hostname,
108 target: event.target,
109 msg: event.msg
110 });
111 };
112
113
114 function onCtcpRequest(event) {
115 this.irc_connection.clientEvent('ctcp_request', {
116 nick: event.nick,
117 ident: event.ident,
118 hostname: event.hostname,
119 target: event.target,
120 type: event.type,
121 msg: event.msg
122 });
123 };
124
125
126 function onCtcpResponse(event) {
127 this.irc_connection.clientEvent('ctcp_response', {
128 nick: event.nick,
129 ident: event.ident,
130 hostname: event.hostname,
131 target: event.target,
132 type: event.type,
133 msg: event.msg
134 });
135 };
136
137
138 // TODO: Split event.users into batches of 50
139 function onNicklist(event) {
140 this.irc_connection.clientEvent('userlist', {
141 users: event.users,
142 channel: this.name
143 });
144 // TODO: uncomment when using an IrcUser per nick
145 //updateUsersList.call(this, event.users);
146 };
147
148
149 function onNicklistEnd(event) {
150 this.irc_connection.clientEvent('userlist_end', {
151 users: event.users,
152 channel: this.name
153 });
154 // TODO: uncomment when using an IrcUser per nick
155 //updateUsersList.call(this, event.users);
156 };
157
158 function updateUsersList(users) {
159 var that = this;
160 if (users) {
161 users.forEach(function (user) {
162 if (!that.irc_connection.irc_users[user.nick]) {
163 that.irc_connection.irc_users[user.nick] = new IrcUser(that.irc_connection, user.nick);
164 }
165 });
166 }
167 }
168
169
170 function onTopic(event) {
171 this.irc_connection.clientEvent('topic', {
172 nick: event.nick,
173 channel: this.name,
174 topic: event.topic
175 });
176 };
177
178
179 function onBanList(event) {
180 this.ban_list_buffer.push(event);
181 };
182
183 function onBanListEnd(event) {
184 var that = this;
185 this.ban_list_buffer.forEach(function (ban) {
186 that.irc_connection.clientEvent('banlist', ban);
187 });
188 this.ban_list_buffer = [];
189 };
190
191 function onTopic(event) {
192 this.irc_connection.clientEvent('topic', {
193 channel: event.channel,
194 topic: event.topic
195 });
196 };
197
198 function onTopicSetBy(event) {
199 this.irc_connection.clientEvent('topicsetby', {
200 nick: event.nick,
201 channel: event.channel,
202 when: event.when
203 });
204 };
205
206 function onMode(event) {
207 this.irc_connection.clientEvent('mode', {
208 target: event.target,
209 nick: event.nick,
210 modes: event.modes
211 });
212 };