Skip to content

Instantly share code, notes, and snippets.

@itsbth
Created December 14, 2011 18:31
Show Gist options
  • Select an option

  • Save itsbth/1477847 to your computer and use it in GitHub Desktop.

Select an option

Save itsbth/1477847 to your computer and use it in GitHub Desktop.
Uploaded by UploadToGist for Sublime Text 2
class Room
constructor: (@name) ->
owner: (cb) ->
R.get "rooms:#{@name}:owner", (err, owner) ->
cb owner
members: (cb) ->
R.smembers "rooms:#{@name}:members", (err, members) ->
cb members
join: (session, cb=->) ->
if session.user.loggedIn()
R.sadd "rooms:#{@name}:members", session.user_id
session.channel.subscribe "rooms:#{@name}"
cb true
else
cb false
leave: (session, cb=->) ->
if session.user.loggedIn()
@owner (owner) =>
if owner == session.user_id
# TODO: Random member? Hm...
R.srandmember "rooms:#{@name}:members", (err, res) =>
if res
R.set "rooms:#{@name}:owner", res
else
# Last member left the room
@delete()
R.srem "rooms:#{@name}:members", session.user_id
session.channel.unSubscribe "rooms:#{@name}"
else
cb false
delete: (cb=->) ->
R.del "rooms:#{@name}:owner", "rooms:#{@name}:members",
R.srem 'rooms', @name
cache = {}
@get: (name) ->
cache[name] or new Room(name)
@list: (cb) ->
R.smembers 'rooms', (err, rooms) ->
cb rooms
@create: (name, owner, cb=->) ->
room = new Room name
R.sadd 'rooms', name
R.set "rooms:#{room.name}:owner", owner.user_id
room.join(owner)
exports.actions =
list: (cb) ->
Room.list cb
create: (name, cb) ->
if @session.user.loggedIn()
Room.create name, @session
cb true
else
cb false
members: (name, cb) ->
Room.get(name).members cb
join: (name, cb) ->
Room.get(name).join @session, cb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment