/
room.js
165 lines (144 loc) · 4.38 KB
/
room.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
/**
* socket.io chat
*
*/
var web = require('QuickWeb');
// undefined
var _ = undefined;
/**
* 创建一个房间
*
* @param {string} room 房间名称
* @param {socket.io} io socket.io实例
*/
var Room = module.exports = function (room, io) {
// 初始化socket.io实例,仅在第一次创建房间时需要设置io参数
if (typeof io != 'undefined')
Room.prototype.io = io;
var io = this.io;
// 房间成员列表
var nicknames = this.nicknames = {};
var onlinesum = this.onlinesum = 0;
// 握手验证,如果是登录用户,则自动获取其昵称
io.set('authorization', function (handshakeData, callback) {
// 通过客户端的cookie字符串来获取其session数据
var sessionObject = handshakeData.sessionObject = web.session.getByCookie(handshakeData.headers.cookie);
// 如果不是登录用户,则自动为其设置一个昵称
var nickname = sessionObject.data.nickname;
if (typeof nickname != 'string' || nickname == '')
nickname = '#' + Math.floor(Math.random() * 1000) + '' + (new Date().getTime() % 86400000);
sessionObject.data.nickname = nickname;
callback(null, true);
});
/** 连接处理 */
var connectionHandle = function (socket) {
onlinesum++;
// 获取session
var session = socket.handshake.sessionObject.data;
var nickname = session.nickname;
// 保持session,以免session过期
var hold_session = socket.handshake.sessionObject.hold;
/** 刷新在线列表 */
refresh_online = function () {
var n = [];
for (var i in nicknames)
n.push(i);
socket.broadcast.emit('online list', n);
socket.emit('online list', n);
}
// 新成员加入时,通知其他成员
nicknames[nickname] = socket;
refresh_online();
socket.broadcast.emit('system message', nickname + '回来了,大家赶紧去喷他~~');
/** 公共消息 */
socket.on('public message', function (msg, cb) {
hold_session();
var timestamp = new Date().getTime();
socket.broadcast.emit('public message', nickname, msg, timestamp);
cb();
});
/** 私人消息 */
socket.on('private message', function (to, msg, cb) {
hold_session();
var timestamp = new Date().getTime();
var err = '';
for (var i in to) {
var target = nicknames[to[i]];
if (target) {
cb();
target.emit('private message', nickname, msg, timestamp);
}
else {
err += '“' + to[i] + '”不在线\n';
}
}
if (err != '')
cb(err);
});
/** 断开来连接 */
socket.on('disconnect', function () {
delete nicknames[nickname];
onlinesum--;
socket.broadcast.emit('system message', nickname + '悄悄地离开了。。。');
refresh_online();
});
/** 命令 */
socket.on('command', function (args, cb) {
if (args.length < 1) {
cb('无效的命令');
return;
}
switch (args[0]) {
/* 查询或更改昵称 */
case 'nick':
var nick = args[1];
if (typeof nick == 'undefined')
cb(_, '你的昵称是:' + nickname);
else
if (nick == nickname)
cb('你的昵称本来就是“' + nick + '”嘛,不需要改');
else if (nicknameIsUsed(nick))
cb('昵称“' + nick + '”已被占用');
else {
nicknames[nick] = nicknames[nickname];
delete nicknames[nickname];
var oldnick = nickname;
session.nickname = nickname = nick;
cb(_, '昵称已更改为“' + nick + '”');
// 通知其他人
refresh_online();
socket.broadcast.emit('system message', '“' + oldnick + '”的昵称已改为“' + nick + '”');
}
break;
/* 在线人数 */
case 'online':
cb(_, '当前共有' + onlinesum + '个人在线');
break;
/* 帮助 */
default:
cb(_, strHelp);
}
});
}
/* 注册聊天室 */
if (typeof room == 'undefined')
room = '';
io.of('/' + room).on('connection', connectionHandle);
/** 检查昵称是否被占用 */
var nicknameIsUsed = function (nickname) {
for (var i in nicknames)
if (i == nickname)
return true;
return false;
}
}
var strHelp = '输入$help获取帮助\n\
========= 系统命令 ========\n\
**$nick** [昵称] 查看或更改昵称\n\
**$online** 当前在线人数\n\
**$clear** 清空消息\n\
========= 使用技巧 ========\n\
**给某人发送消息** @对方昵称 消息内容(可同时@多个人)\n\
**发送图片** !图片url\n\
**发送链接** [网址]\n\
';