room.coffee 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. define [
  2. "libs/underscore"
  3. "libs/backbone"
  4. "collections/messages"
  5. "collections/connectedUsers"
  6. "models/user"
  7. "models/message"
  8. ], (_, Backbone, Messages, ConnectedUsers, User, Message) ->
  9. Room = Backbone.Model.extend
  10. initialize: () ->
  11. @chat = @get("chat")
  12. @set "messages", new Messages([], chat: @chat, room: @)
  13. @set "connectedUsers", new ConnectedUsers([], chat: @chat, room: @)
  14. @get("connectedUsers").on "change", () ->
  15. @get("connectedUsers").on "add", () ->
  16. @get("connectedUsers").on "remove", () ->
  17. @connected = false
  18. @chat.on "authed", () => @join()
  19. @chat.on "disconnected", () => @_onDisconnect()
  20. join: () ->
  21. @chat.socket.emit "joinRoom", room: project_id: @get("project_id"), (error, data) =>
  22. return @chat.handleError(error) if error?
  23. room = data.room
  24. @set("id", room.id)
  25. @chat.rooms[room.id] = @
  26. @addConnectedUsers(room.connectedUsers)
  27. @_onJoin()
  28. _onJoin: () ->
  29. @trigger "joined"
  30. @connected = true
  31. if @get("messages").models.length == 0
  32. @get("messages").fetchMoreMessages preloading: true, () =>
  33. @trigger("afterMessagesPreloaded")
  34. _onDisconnect: () ->
  35. @trigger "disconnected"
  36. @connected = false
  37. addConnectedUsers: (users) ->
  38. for user in users
  39. @addConnectedUser(user)
  40. addConnectedUser: (user) ->
  41. if user not instanceof User
  42. user = User.findOrCreate(user)
  43. @get("connectedUsers").add user
  44. removeConnectedUser: (user) ->
  45. if user not instanceof User
  46. user = User.findOrCreate(user)
  47. @get("connectedUsers").remove user
  48. sendMessage: (content, callback = (error) ->) ->
  49. if !@connected
  50. return callback(new Error("Not connected"))
  51. @chat.socket.emit "sendMessage", {
  52. message:
  53. content: content
  54. room:
  55. id: @get("id")
  56. }
  57. fetchMessages: (query, callback = (error, messages) ->) ->
  58. if !@connected
  59. return callback(new Error("Not connected"))
  60. query.room = id: @get("id")
  61. @chat.socket.emit "getMessages", query, callback
  62. onMessageReceived: (data) ->
  63. message = data.message
  64. user = User.findOrCreate message.user
  65. message = new Message(
  66. content : data.message.content
  67. timestamp : data.message.timestamp
  68. user : user
  69. )
  70. @get("messages").add message