Skip to content

Instantly share code, notes, and snippets.

@deltaepsilon
Created October 14, 2011 20:21
Show Gist options
  • Save deltaepsilon/1288223 to your computer and use it in GitHub Desktop.
Save deltaepsilon/1288223 to your computer and use it in GitHub Desktop.
Simple Node.js/Socket.io Chat Server
Array.prototype.getUnique = ->
u = {}
a = []
for i in [0..this.length]
if this[i] in u
continue
a.push this[i]
u[this[i]] = 1
return a
sideLoad = (socket) ->
v_name = $('#username').text()
socket.emit 'register', v_name
return v_name
chatForm = (socket, v_name) ->
v_message = ''
$('#chat-form form').keypress (e) ->
if e.keyCode != 13
return
if e.keyCode == 13
e.preventDefault()
v_message = $('#chat-form .input input').val()
socket.emit 'chat', v_message
$('#chat-text ul').append '<li><b>' + v_name + ':</b> ' + v_message + '</li>'
$('#chat-text').scrollTop $('#chat-text')[0].scrollHeight
$('#chat-form input').val ''
chatShow = ->
$('#footer a').click (e) ->
e.preventDefault()
if $('#chat').is(":visible")
return $('#chat').hide()
$('#chat').show()
$('#chat-form .input input').focus()
commandFilter = (data, v_name, callback) ->
v_message = data.msg
if v_message == '<open ' + v_name + '>'
$('#chat').show()
else if v_message == '<close ' + v_name + '>'
$('#chat').hide()
callback(v_message.replace /<.+>/, '')
chatDisplay = (socket, v_name) ->
socket.on 'chat', (data) ->
v_nothing = commandFilter data, v_name, (v_result) ->
if v_result != ''
$('#chat-text ul').append '<li><b>' + data.msgr + ':</b> ' + v_result + '</li>'
$('#chat-text').scrollTop $('#chat-text')[0].scrollHeight
socket.on 'users', (data) ->
$('#chat-users ul').empty()
a_users = data.users.getUnique()
$.each a_users, (key, value) ->
if value
$('#chat-users ul').append '<li><b>' + value + '</b></li>'
$(document).ready ->
$.getScript "http://10.104.17.207:8000/socket.io/socket.io.js", ->
socket = io.connect 'http://10.104.17.207:8000'
v_name = sideLoad socket
chatShow()
chatDisplay socket, v_name
chatForm socket , v_name
io = require('socket.io').listen 8000
a_active_users = []
io.sockets.on 'connection', (socket) ->
console.log io.sockets
socket.on 'chat', (data) ->
sender = 'unregistered';
socket.get 'nickname', (err, name) ->
console.log 'Chat message by ', name
console.log 'error ', err
sender = name
socket.broadcast.emit 'chat', msg : data, msgr : sender
socket.on 'register', (name) ->
socket.set 'nickname', name, ->
a_active_users.push(name);
io.sockets.emit 'users', users : a_active_users
#socket.broadcast.emit 'chat', msg : 'Welcome ' + name, msgr : ''
#io.sockets.emit 'chat', msg : name + ' has joined.', msgr : ''
socket.on 'disconnect', ->
socket.get 'nickname', (err, name) ->
console.log 'Log off by ', name
console.log 'error ', err
a_active_users.splice a_active_users.indexOf name, 1
#io.sockets.emit 'chat', msg : name + ' has left.', msgr : ''
io.sockets.emit 'users', users : a_active_users
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment