66 lines
1.8 KiB
CoffeeScript
66 lines
1.8 KiB
CoffeeScript
{_} = require('underscore')
|
|
{EventEmitter} = require('events')
|
|
redis = require('./redis')
|
|
errors = require('../shared/errors')
|
|
|
|
class @Room extends EventEmitter
|
|
constructor: (@name) ->
|
|
@users = {}
|
|
@userCounts = {}
|
|
@sparks = []
|
|
|
|
add: (spark) ->
|
|
return if spark in @sparks
|
|
@send('joinChatroom', @name, @userJSON(spark.user)) unless @users[spark.user.id]
|
|
@sparks.push(spark)
|
|
|
|
userId = spark.user.id
|
|
if userId not of @users
|
|
@userCounts[userId] = 1
|
|
@users[userId] = spark.user
|
|
else
|
|
@userCounts[userId] += 1
|
|
spark.send('listChatroom', @name, @toJSON())
|
|
|
|
remove: (spark) ->
|
|
index = @sparks.indexOf(spark)
|
|
return if index == -1
|
|
@sparks.splice(index, 1)
|
|
|
|
userId = spark.user.id
|
|
@userCounts[userId] -= 1
|
|
if @userCounts[userId] == 0
|
|
@send('leaveChatroom', @name, @transformName(spark.user.name))
|
|
delete @users[userId]
|
|
delete @userCounts[userId]
|
|
|
|
userMessage: (user, message) ->
|
|
@send('userMessage', @name, @transformName(user.name), message)
|
|
|
|
message: (message) ->
|
|
@send('rawMessage', @name, message)
|
|
|
|
announce: (klass, message) ->
|
|
@send('announce', @name, klass, message)
|
|
|
|
send: ->
|
|
user.send.apply(user, arguments) for name, user of @users
|
|
|
|
userJSON: (user) ->
|
|
json = user.toJSON(alt: @transformName(user.name))
|
|
|
|
# Hook to transform a user's name to something else. Does the identity func.
|
|
transformName: (name) ->
|
|
name
|
|
|
|
# Set the room's topic. Does not work for battle rooms.
|
|
# TODO: Or rather, it shouldn't work for battle rooms. Once a distinction is
|
|
# possible, block it for battle rooms
|
|
setTopic: (topic) ->
|
|
redis.hset "topic", "main", topic
|
|
@send('topic', topic) if topic
|
|
|
|
toJSON: ->
|
|
for name, user of @users
|
|
@userJSON(user)
|