PageRenderTime 45ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/socket/socket.coffee

https://github.com/Gacnt/DotaFinder
CoffeeScript | 107 lines | 87 code | 17 blank | 3 comment | 15 complexity | 9308112f5afea6a1ff4b81040eef450f MD5 | raw file
  1. exports.start = (server) ->
  2. io = require('socket.io').listen server
  3. db = require('mongojs').connect('mongodb://nodejitsu:28446ba8ab35884da1f9b5f22006025a@linus.mongohq.com:10013/nodejitsudb4542302081', ['users'])
  4. # My Little Helper Ponys /////////////////////////////////////////////////////
  5. parseCookie = (cookie) ->
  6. returnObj = {}
  7. cookie = cookie.split ';'
  8. for i in cookie
  9. parsedCookie = i.split '='
  10. returnObj[parsedCookie[0].trim()] = parsedCookie[1].trim()
  11. returnObj
  12. class User
  13. constructor: (@username, @rank, @roll, @hero, @steamurl, @language, @location, @socket) ->
  14. class Room
  15. constructor: (owner) ->
  16. @occupants = []
  17. sendMsg: (msg, user) ->
  18. for client in @occupants
  19. io.sockets.socket(client.socket).emit 'updateChat', 'user': user, 'msg': msg
  20. checkDoubles: (user) ->
  21. returnVal = false
  22. for client in @occupants
  23. if client.username is user
  24. returnVal = true
  25. returnVal
  26. leaveRoom: (user) ->
  27. @occupants.forEach (client, index, arr) ->
  28. if client.username is user
  29. arr.splice index, 1
  30. getUsers: () ->
  31. returnOccupants = []
  32. @occupants.forEach (client, index, arr) ->
  33. returnOccupants.push client.username
  34. returnOccupants
  35. # End Helper ////////////////////////////////////////////////////////////////
  36. # Begin socket request management ///////////////////////////////////////////
  37. users = {}
  38. rooms = {}
  39. io.sockets.on 'connection', (socket) ->
  40. if socket.handshake.headers.cookie
  41. cookies = parseCookie socket.handshake.headers.cookie
  42. db.users.find rememberToken: cookies.rememberToken, (err, found) ->
  43. console.log 'Couldn\'t connect to server, error: ' + err if err
  44. if found.length is 0
  45. console.log 'Couldn\'t find user'
  46. else
  47. user = new User found[0].username, found[0].rank, found[0].roll,
  48. found[0].hero, found[0].steamurl, found[0].language, found[0].location, socket.id
  49. users[found[0].username] = user
  50. socket.username = user.username
  51. io.sockets.emit 'updatePlayers', users
  52. socket.emit 'setUsername', socket.username
  53. socket.on 'disconnect', ->
  54. if socket.currentroom
  55. socket.currentroom.leaveRoom socket.username
  56. socket.currentroom.occupants.forEach (client, index, arr) ->
  57. io.sockets.socket(client.socket).emit 'updateUsers', socket.currentroom.getUsers()
  58. delete socket.currentroom
  59. delete users[socket.username]
  60. io.sockets.emit 'removePlayer', socket.username
  61. socket.on 'inviteUser', (data) ->
  62. if not socket.currentroom
  63. socket.currentroom = new Room socket.username
  64. rooms[socket.username] = socket.currentroom
  65. socket.currentroom.occupants.push 'socket': socket.id, 'username': socket.username
  66. io.sockets.socket(users[data].socket).emit 'alertInvite', socket.username
  67. else
  68. if not socket.currentroom.checkDoubles data
  69. io.sockets.socket(users[data].socket).emit 'alertInvite', socket.username
  70. socket.on 'manageParty', (data, username, yesno) ->
  71. if yesno is true
  72. rooms[data].occupants.push 'socket': socket.id, 'username': username
  73. socket.currentroom = rooms[data]
  74. io.sockets.socket(users[data].socket).emit 'notifyStatus', username + ' accepted your party invite'
  75. rooms[data].occupants.forEach (client, i) ->
  76. io.sockets.socket(client.socket).emit 'updateUsers', rooms[data].getUsers()
  77. else
  78. io.sockets.socket(users[data].socket).emit 'notifyStatus', username + ' declined your party invite'
  79. socket.on 'sendMessage', (msg) ->
  80. if socket.currentroom
  81. socket.currentroom.sendMsg msg, socket.username
  82. socket.on 'leaveParty', ->
  83. if socket.currentroom
  84. if socket.currentroom.occupants.length <= 1
  85. delete socket.currentroom
  86. else
  87. socket.currentroom.leaveRoom socket.username
  88. socket.currentroom.occupants.forEach (client, index, arr) ->
  89. io.sockets.socket(client.socket).emit 'updateUsers', socket.currentroom.getUsers()
  90. delete socket.currentroom