PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/channel.coffee

http://github.com/brianewing/irked
CoffeeScript | 45 lines | 31 code | 12 blank | 2 comment | 3 complexity | 81bdedbe2a91094a4b6ff075a940e4a1 MD5 | raw file
  1. _ = require('underscore')
  2. protocol = require('./protocol')
  3. class Channel
  4. constructor: (@name, @server) ->
  5. @users = []
  6. addUser: (user) ->
  7. return if @hasUser(user)
  8. @users.push user
  9. user.channels.push @
  10. @dispatch user, 'join', null, @name
  11. @sendNames user
  12. @sendTopic user
  13. removeUser: (user) ->
  14. @users.splice @users.indexOf(user), 1
  15. user.channels.splice user.channels.indexOf(@), 1
  16. hasUser: (user) -> _.include @users, user
  17. # dispatch something to *all* channel inhabitants
  18. dispatch: (actor, verb, args, extended, filter) ->
  19. @users.forEach (user) ->
  20. unless filter and filter(user)
  21. user.dispatch actor, verb, args, extended
  22. sendNames: (user) ->
  23. # check the rfc when implementing private/secret channels, as this changes
  24. nicks = _.pluck @users, 'nick'
  25. while nicks.length
  26. names = nicks.splice(0, 25)
  27. user.dispatch @server, protocol.reply.nameReply, [user.nick, '=', @name], names.join(' ')
  28. user.dispatch @server, protocol.reply.endNames, [user.nick, @name], 'End of NAMES list'
  29. setTopic: (topic) ->
  30. @topic = topic
  31. sendTopic: (user) ->
  32. user.dispatch @server, protocol.reply.topic, [user.nick, @name], @topic if @topic
  33. exports.Channel = Channel