-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
236 lines (199 loc) · 8.01 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
// Webserver fun
var app = require('express')();
var http = require('http').Server(app);
app.get('/', function(req, res){
res.sendfile('html/index.html');
});
app.get('/jquery.tinysort.min.js', function(req, res){
res.sendfile('html/jquery.tinysort.min.js');
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
// Socket.io fun
var io = require('socket.io')(http);
io.on('connection', function(socket){
console.log('a user connected');
// send all important information like channels joined etc
// so the node-irc client keeps a list of .chans, but no member information
// so let's do this ourselves by keeping track of 'names' (on self join) and join,part and mode events
processConnect(ircclient.nick,ircclient.chans);
socket.on('disconnect', function(){
console.log('user disconnected');
});
});
io.on('connection', function(socket){
socket.on('chat send', function(data){
// data:from,to,message
if(data.message.charAt(0) == "/") {
var raw = data.message.substring(1, data.message.length);
var split = raw.split(" ");
var command = split.shift();
var command_message = split.join(" ");
console.log("command recieved: " + command);
ircclient.emit("webcommand." + command, command_message);
return;
}
//say it on irc
ircclient.say(data.to, data.message);
// keep track of time
data.time_string = get_time();
// add nickname_prefix
data.nickname_prefix = '';
Object.keys(ircclient.chans).forEach(function(key) {
if(ircclient.chans[key].key.toLowerCase() === data.to.toLowerCase()) {
data.nickname_prefix = ircclient.chans[key].users[data.from];
}
});
// broadcast it back
io.emit('chat recieve', data);
save_message(data);
console.log('message: ' + data.message);
});
socket.on('refresh tab', function(active_tab) {
console.log("refresh : " + active_tab);
// is this a channel?
var is_channel = false;
Object.keys(ircclient.chans).forEach(function(key) {
if(ircclient.chans[key].key.toLowerCase() === active_tab.toLowerCase()) {
io.emit('refresh users', {channel:ircclient.chans[key].key, users:ircclient.chans[key].users});
is_channel = true;
}
});
// TODO: if is_channel == false, it's a privmsg window
});
});
function get_time() {
var currentdate = new Date();
return currentdate.getHours() + ":" + currentdate.getMinutes() + ":" + currentdate.getSeconds();
}
// history
var history = {};
var counter = 0;
function save_message(data) {
// data:from,to,message
history[counter] = data;
console.log(history);
counter++;
}
// Webchat functions
// (don't shoot me, i'm just adding everything in one file and split it
// up later)
function processConnect(nickname, channels) {
var my_nickname = nickname;
var my_channels = Object.keys(channels);
console.log('Hello im ' + my_nickname + ' and i joined channels ' + my_channels);
io.emit('welcome', { my_nickname: my_nickname, my_channels:my_channels } );
io.emit('history', history);
}
function refreshNicklist() {
Object.keys(ircclient.chans).forEach(function(key) {
io.emit('refresh users', {channel:ircclient.chans[key].key, users:ircclient.chans[key].users});
});
}
// IRC fun
var irc = require("irc");
var ircclient = new irc.Client('mujo.be.krey.net', 'ircporxy', {
channels: ['#irchacks', '#irchacks2', '#irchacks3'],
});
ircclient.addListener('message', function (from, to, message) {
// send it to the socket
// if to is a channel, then from is a member, so we need to add channel status to nickname
var nickname_prefix = '';
Object.keys(ircclient.chans).forEach(function(key) {
if(ircclient.chans[key].key.toLowerCase() === to.toLowerCase()) {
nickname_prefix = ircclient.chans[key].users[from];
}
});
io.emit('chat recieve', {from:from, to:to, message:message, nickname_prefix:nickname_prefix, time_string:get_time()});
save_message({from:from, to:to, message:message, nickname_prefix:nickname_prefix, time_string:get_time()});
console.log(from + ' => ' + to + ': ' + message);
});
ircclient.addListener('pm', function (from, message) {
console.log(from + ' => ME: ' + message);
});
ircclient.addListener('raw', function(message) {
console.log('<< ', message);
});
/* Changing nicks! */
// so this is coming from the web client
ircclient.addListener('webcommand.nick', function(message) {
ircclient.changenick(message);
});
// and this is coming from the irc server
// self.emit('nick', message.nick, message.args[0], channels, message);
ircclient.addListener('nick', function(old_nick, new_nick, channels, message) {
// we need to print this on the screen for each of the channels
//console.log(channels);
Object.keys(channels).forEach(function (key) {
// send message
var message = old_nick + " is now known as " + new_nick;
io.emit('chat recieve', {from:"-", to:channels[key], message:message, nickname_prefix:"-", time_string:get_time()});
save_message({from:"-", to:channels[key], message:message, nickname_prefix:"-", time_string:get_time()});
});
// this is so the webside can figure out if his own nick changes
io.emit('nickchange', {old_nick:old_nick, new_nick:new_nick});
// and force a nicklist refresh
refreshNicklist();
});
/* Joining channels */
// this is coming from thw web client
//this is coming from the irc server
// self.emit('join', message.args[0], message.nick, message);
ircclient.addListener('join', function(channel, nickname, message) {
// print this on the screen
var message = nickname + " joined " + channel;
io.emit('chat recieve', {from:"-", to:channel, message:message, nickname_prefix:"-", time_string:get_time()});
save_message({from:"-", to:channel, message:message, nickname_prefix:"-", time_string:get_time()});
//force nicklist refresh
refreshNicklist();
});
/* Leaving channels */
// this is coming from thw web client
//this is coming from the irc server
ircclient.addListener('part', function(channel, nickname, reason, message) {
// print this on the screen
if(reason) {
var message = nickname + " left " + channel + " (" + reason + ")";
} else {
var message = nickname + " left " + channel;
}
io.emit('chat recieve', {from:"-", to:channel, message:message, nickname_prefix:"-", time_string:get_time()});
save_message({from:"-", to:channel, message:message, nickname_prefix:"-", time_string:get_time()});
//force nicklist refresh
refreshNicklist();
});
/* Channel kicks */
// this is coming from the web client
//this is coming from the irc server
// TODO: what if it's me thats being kicked ? handle this properly in webinterface
ircclient.addListener('kick', function(channel, nickname, by_nickname, reason, message) {
// print this on the screen
if(reason) {
var message = nickname + " kicked by " + by_nickname + " (" + reason + ")";
} else {
var message = nickname + " kicked by " + by_nickname;
}
io.emit('chat recieve', {from:"-", to:channel, message:message, nickname_prefix:"-", time_string:get_time()});
save_message({from:"-", to:channel, message:message, nickname_prefix:"-", time_string:get_time()});
//force nicklist refresh
refreshNicklist();
});
/* Quit event */
// this is coming from the web client
//this is coming from the irc server
ircclient.addListener('quit', function(nickname, reason, channels, message) {
// print this on the screen
if(reason) {
var message = nickname + " has quit " + " (" + reason + ")";
} else {
var message = nickname + " has quit";
}
Object.keys(channels).forEach(function (key) {
// send message
io.emit('chat recieve', {from:"-", to:channels[key], message:message, nickname_prefix:"-", time_string:get_time()});
save_message({from:"-", to:channels[key], message:message, nickname_prefix:"-", time_string:get_time()});
});
//force nicklist refresh
refreshNicklist();
});