-
Notifications
You must be signed in to change notification settings - Fork 0
/
slack_server.js
262 lines (225 loc) · 7.14 KB
/
slack_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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
/*
* connect-server
* https://github.com/Charles/plugin
*
* Copyright (c) 2015 charles
* Licensed under the MIT license.
*/
'use strict';
module.exports = function(grunt, config) {
// Please see the Grunt documentation for more information regarding task
// creation: http://gruntjs.com/creating-tasks
//grunt.registerMultiTask('connect_server', 'The best Grunt plugin ever.', function() {
// Merge task-specific and/or target-specific options with these defaults.
/*var options = this.options({
punctuation: '.',
separator: ', '
});*/
// Iterate over all specified file groups.
/*this.files.forEach(function(f) {
// Concat specified files.
var src = f.src.filter(function(filepath) {
// Warn on and remove invalid source files (if nonull was set).
if (!grunt.file.exists(filepath)) {
grunt.log.warn('Source file "' + filepath + '" not found.');
return false;
} else {
return true;
}
}).map(function(filepath) {
// Read file source.
return grunt.file.read(filepath);
}).join(grunt.util.normalizelf(options.separator));
// Handle options.
src += options.punctuation;
// Write the destination file.
grunt.file.write(f.dest, src);
// Print a success message.
grunt.log.writeln('File "' + f.dest + '" created.');
});*/
var fs = require('fs');
var url = require('url');
var path = require('path');
var http = require('http');
var connect = require('connect');
var options = config;
/*var options = {
port:9000,
hostname:'localhost',
base:[
'app'
]
}*/
//console.log(options.port);
var app = connect();
// gzip/deflate outgoing responses
var compression = require('compression');
app.use(compression());
// parse urlencoded request bodies into req.body
//var bodyParser = require('body-parser');
//app.use(bodyParser());
app.use('/', function(req, res, next) {
//res.end("hello connect!");
//res.write('<h1>Welcome to Slack </h1>');
});
//console.log(http);
var server = http.createServer(app);
server.listen(options.port, options.hostname);
var io = require('socket.io')(server);
var onlineUsers = {};
//var channel_sockets={};
var onlineCount = 0;
var getJpegsFromFiles = function(_path, callback) {
_path = path.normalize(_path);
_path = path.resolve(process.cwd(), _path);
//console.log(_path);
var result = [];
fs.readdir(_path, function(err, files) {
// body
if (err) {
console.log('get Jpegs error:' + err);
return;
}
files.forEach(function(file) {
fs.stat(_path + path.sep + file, function(err, stat) {
if (err) {
console.log(err);
return;
}
if (stat.isFile()) {
//console.log(path.sep);
//console.log(process.cwd()+path.sep+'app');
//console.log(_path + path.sep + file);
callback(path.relative(process.cwd()+path.sep+'app', _path + path.sep + file));
}
});
});
});
}
var head_url_array = [];
getJpegsFromFiles('./app/img/', function(jpeg_url) {
// console.log(jpeg_url);
head_url_array.push(jpeg_url);
});
io.on('connection', function(socket) {
console.log('new user connected');
socket.on('login', function(obj) {
socket.name = obj.userid;
var channel = obj.channel;
//检查在线列表,如果不在里面就加入
// if (!onlineUsers[channel].hasOwnProperty(obj.userid)) {
// onlineUsers[obj.userid] = obj.username;
//在线人数+1
//onlineCount++;
//}
if (!onlineUsers.hasOwnProperty(channel)) {
onlineUsers[channel] = {};
}
/*if(!channel_sockets.hasOwnProperty(channel)){
channel_sockets[channel]=[];
}*/
if (!onlineUsers[channel].hasOwnProperty(obj.userid)) {
onlineUsers[channel][obj.userid] = obj.username;
}
//channel_sockets.push(socket);
//在线人数+1
onlineCount++;
io.emit('login', {
onlineUsers: onlineUsers,
onlineCount: onlineCount,
user: obj
});
io.emit('pushHeads', {
heads: head_url_array
});
console.log(obj.username + '加入了聊天室,在线人数为' + onlineCount);
});
socket.on('newchannel', function(obj) {
if (!onlineUsers.hasOwnProperty(obj.channel)) {
onlineUsers[obj.channel] = {};
io.emit('newchannel', {
onlineUsers: onlineUsers,
onlineCount: onlineCount,
user: obj
});
console.log(obj.username + '添加了channel ' + obj.channel);
}
});
//监听用户退出
socket.on('disconnect', function() {
//将退出的用户从在线列表中删除
/*
if (onlineUsers.hasOwnProperty(socket.name)) {
//退出用户的信息
var obj = {
userid: socket.name,
username: onlineUsers[socket.name]
};
//删除
delete onlineUsers[socket.name];
//在线人数-1
onlineCount--;
//向所有客户端广播用户退出
io.emit('logout', {
onlineUsers: onlineUsers,
onlineCount: onlineCount,
user: obj
});
console.log(obj.username + '退出了聊天室');
}*/
//将退出的用户从在线列表中删除
for (var x in onlineUsers) {
if (onlineUsers.hasOwnProperty(x)) {
//访问每个在线的channel
if (onlineUsers[x].hasOwnProperty(socket.name)) {
//退出用户的信息
var obj = {
userid: socket.name,
username: onlineUsers[x][socket.name],
};
//删除
delete onlineUsers[x][socket.name];
// break;
}
}
}
onlineCount--;
//向所有客户端广播用户退出
io.emit('logout', {
onlineUsers: onlineUsers,
onlineCount: onlineCount,
user: obj
});
//console.log('mmm');
console.log(obj.username + '退出了聊天室,在线人数为' + onlineCount);
});
//监听用户发布聊天内容
socket.on('message', function(obj) {
//向所在channel广播发布的消息
/* var socket_array=channel_sockets[obj.channel];
console.log(socket_array instanceof Array);
for(var i=0;i<socket_array.length;i++){
socket_array[i].emit('message',obj);
}*/
io.emit('message', obj);
console.log(obj.username + '在' + obj.channel + 'channel中发表一句话');
});
//监听用户跳转channel
socket.on('changeChannel', function(obj) {
//提醒别的用户当前用户的转channel行为
io.emit('changeChannel', obj);
//在onlineUsers对象中更改当前用户的channel
var to_channel=obj.channel;
var uid= obj.userid;
var username = obj.username;
for(var x in onlineUsers){
if(onlineUsers.hasOwnProperty(x)){
delete onlineUsers[x][uid];
}
}
onlineUsers[to_channel][uid] = username;
console.log(obj.username + '跳转入channel ' + obj.channel);
});
});
//});
};