Skip to content

Commit b897a33

Browse files
author
dodortus
committed
* 유저 목록, 귓속말 base
1 parent 6632ef4 commit b897a33

File tree

4 files changed

+96
-33
lines changed

4 files changed

+96
-33
lines changed

contents/css/style.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ input[type="text"] { padding: 2px 5px; border: solid 1px #bbb; font-size: 1.3em;
8888
#chat-content .me { position: relative; }
8989
#chat-content .me .message { background-color: rgba(243, 178, 176, 0.3); }
9090

91+
#user-list {
92+
position: absolute; padding: 10px 10px 10px 30px;
93+
width: 100px; height: 200px; top: 10px; right: -141px;
94+
border: solid 1px #ccc; font-size: 14px;
95+
}
96+
#user-list li { cursor: pointer; }
97+
#user-list li:hover { text-decoration: underline; }
98+
9199
/* typing */
92100
#typing-icon {
93101
position: absolute; bottom: 68px; right: 142px; height: 14px; line-height: 12px;

contents/js/base.js

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
$(function() {
88
var socket = io();
9-
var nickName = /* prompt('닉네임을 입력해 주세요') || */ 'Guest-' + new Date().getTime();
9+
var nickName = /*prompt('닉네임을 입력해 주세요') ||*/ 'Guest-' + getRandomNum(1000);
1010
var roomId = '';
1111
var $body = $('body');
1212
var $roomName = $('#room-name');
@@ -20,13 +20,13 @@ $(function() {
2020
}
2121

2222
function addUserMessage(nickName, msg, isMe) {
23-
$('#chat-content').append([
24-
"<li class='" + (isMe ? 'me' : '') + "'>",
25-
"<strong class='name'>" + (isMe ? 'Me' : nickName) + "</strong>",
26-
"<p class='message'>" + msg +
27-
"<span class='date'>" + getTime() + "</span>",
28-
"</p>",
29-
"</li>"
23+
$('#chat-content').append([
24+
"<li class='" + (isMe ? 'me' : '') + "'>",
25+
"<strong class='name'>" + (isMe ? 'Me' : nickName) + "</strong>",
26+
"<p class='message'>" + msg +
27+
"<span class='date'>" + getTime() + "</span>",
28+
"</p>",
29+
"</li>"
3030
].join('\n'));
3131
}
3232

@@ -38,49 +38,77 @@ $(function() {
3838
].join('\n'));
3939
}
4040

41-
function getRandomNum() {
42-
return Math.floor(Math.random() * 10000) + 1; // 1~10000
41+
function getRandomNum(max) {
42+
return Math.floor(Math.random() * max) + 1; // 1 ~ max
4343
}
4444

4545
// 해시 체크
4646
if (location.hash.length >= 2) {
47-
$roomName.val(location.hash.split('#')[1]);
47+
$roomName.val(location.hash.split('#')[1]);
4848
}
4949

5050
// 룸생성, 참여 이벤트
5151
$('#create-room').click(function() {
52-
socket.emit('joinRoom', getRandomNum(), nickName);
52+
socket.emit('joinRoom', getRandomNum(10000), nickName);
5353
});
5454

5555
$('#join-room').click(function() {
5656
socket.emit('joinRoom', $roomName.val(), nickName);
5757
});
5858

59-
socket.on('joinRoom', function(roomId, nickName) {
60-
roomId = roomId;
59+
socket.on('joinRoom', function(roomNum, nickName, userList) {
60+
// console.log('userList', userList);
61+
roomId = roomNum;
6162
location.hash = roomId;
63+
6264
$body.addClass('is-room');
6365
addSystemMessage("<strong>" + nickName + "</strong> 님이 참여하였습니다.");
66+
setUserList(userList);
6467
});
6568

69+
function setUserList(userList) {
70+
var users = [];
71+
$.each(userList, function(i, val) {
72+
users.push("<li>" + val + "</li>");
73+
});
74+
75+
$('#user-list').html(users.join('\n'));
76+
}
77+
6678
// 로비로 이동
6779
$('#leave-room').click(function() {
80+
alert(roomId);
81+
6882
socket.emit('leaveRoom', roomId, nickName);
6983
location.hash = '';
7084
location.reload();
7185
});
7286

73-
socket.on('leaveRoom', function(nickName) {
87+
socket.on('leaveRoom', function(nickName, userList) {
7488
addSystemMessage("<strong>" + nickName + "</strong> 님이 나갔습니다.");
89+
setUserList(userList);
7590
});
7691

7792
// 메시지 이벤트
7893
$('form').submit(function() {
7994
var msg = $msgInput.val();
80-
socket.emit('message', {
81-
nickName: nickName,
82-
body: msg
83-
});
95+
96+
if (msg.match('/')) {
97+
var receiverNickName = msg.split(" ")[0].replace('/', '');
98+
msg = msg.replace('/' + receiverNickName + ' ', '');
99+
100+
socket.emit('message', {
101+
nickName: nickName,
102+
body: msg,
103+
to: receiverNickName
104+
});
105+
} else {
106+
socket.emit('message', {
107+
nickName: nickName,
108+
body: msg,
109+
to: 'all'
110+
});
111+
}
84112
$msgInput.val('');
85113
addUserMessage(nickName, msg, true);
86114

@@ -113,4 +141,9 @@ $(function() {
113141
}, 3000);
114142
*/
115143
});
144+
145+
// 귓속말 해당 유저 추가
146+
$('#user-list').on('click', 'li', function() {
147+
$('#message').val('/' + $(this).text() + " ");
148+
});
116149
});

server.js

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,51 @@ app.get('/', function(req, res) {
1515
});
1616

1717
// socket
18-
io.on('connection', function(socket){
19-
console.log('a user connected');
18+
/*
19+
* io - 소켓 서버
20+
* socket - 클라이언트와 연결된 소켓
21+
* io.sockets.in(roomId) - 타겟 룸에 전체 메시지 전달.
22+
*/
23+
var socketIds = [];
24+
io.on('connection', function(socket) {
2025
var roomId = null;
2126

2227
// 룸접속
23-
socket.on('joinRoom', function(room, nickName) {
24-
roomId = room;
28+
socket.on('joinRoom', function(roomNum, nickName) {
29+
roomId = roomNum;
2530
socket.join(roomId);
26-
io.sockets.in(roomId).emit('joinRoom', roomId, nickName);
31+
32+
// 유저 목록
33+
socketIds[nickName] = socket.id;
34+
io.sockets.in(roomId).emit('joinRoom', roomId, nickName, Object.keys(socketIds));
2735
console.log('ROOM LIST', io.sockets.adapter.rooms);
2836
});
2937

3038
// 룸퇴장
31-
socket.on('leaveRoom', function(room, nickName) {
32-
socket.leave(roomId);
33-
socket.broadcast.to(roomId).emit('leaveRoom', nickName);
39+
socket.on('leaveRoom', function(roomNum, nickName) {
40+
socket.leave(roomNum);
41+
delete socketIds[nickName];
42+
43+
console.log('leaveRoom', roomNum, Object.keys(socketIds));
44+
socket.broadcast.to(roomNum).emit('leaveRoom', nickName, Object.keys(socketIds));
3445
});
3546

3647
// 메시징
37-
socket.on('message', function(msg) {
38-
//console.log('message: ' + msg);
48+
socket.on('message', function(data) {
49+
//console.log('message: ' + data);
3950

40-
socket.broadcast.to(roomId).emit('message', msg); // 자신 제외 룸안의 유저
41-
//socket.broadcast.emit('message', msg); // 자신 제외 메시지 전송
42-
//io.emit('message', msg); // 자신 포함 전체 룸 메시지 전송
43-
//io.sockets.in(roomId).emit('message', msg); // 자신 포함 룸안의 유저
51+
if (data.to == 'all') {
52+
socket.broadcast.to(roomId).emit('message', data); // 자신 제외 룸안의 유저
53+
} else {
54+
var targetSocket = socketIds[data.to];
55+
56+
if (targetSocket) {
57+
io.sockets.in(targetSocket).emit('message', data);
58+
}
59+
}
60+
//socket.broadcast.emit('message', data); // 자신 제외 메시지 전송
61+
//io.emit('message', data); // 자신 포함 전체 룸 메시지 전송
62+
//io.sockets.in(roomId).emit('message', data); // 자신 포함 룸안의 유저
4463
});
4564

4665
// 타이핑

views/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<meta name="description" content="" />
88
<meta name="author" content="Administrator" />
99
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
10+
<link rel="shortcut icon" href="https://cdn3.iconfinder.com/data/icons/stroke/53/Smile-64.png">
1011
<link href="/css/style.css" type="text/css" rel="stylesheet" media="screen" />
1112
</head>
1213
<body class="is-lobby">
@@ -40,6 +41,8 @@ <h1>Simple Chatting</h1>
4041
<input type="text" name="message" id="message" value="" placeholder="메시지를 입력해 주세요.">
4142
<button type="submit">전송</button>
4243
</form>
44+
45+
<ul id="user-list"></ul>
4346
</div>
4447
</section>
4548
</div>

0 commit comments

Comments
 (0)