def onmessage(self, msg): m = msg.data logging.info('ONMESSAGE < %s ; %s'%(msg.data,m['op'])) if m['op'] in 'auth': rauth = RedisConn.get('auth.%s'%m['authck']) if rauth == m['user']: self.authenticated=True self.user = m['user'] self.authck = m['authck'] if not self.authenticated: raise Exception('not authenticated') if m['op'] in 'auth': pass elif m['op'] in 'logout': RedisConn.delete('auth.%s'%self.authck) logging.info('signing out %s/%s'%(self.user,self.authck)) self.send({'op':'signoutresult','status':'ok'}) elif m['op']=='msg': pass elif m['op']=='join': pass elif m['op'] in ['create','update']: o = m['obj'] if m['objtype']=='joinedroom': roomname = o['id'] r = getroom(roomname) ; assert r roomkey='rooms.%s'%self.user myrooms = RedisConn.smembers(roomkey) if roomname not in [json.loads(mr)['id'] for mr in myrooms]: logging.info('%s not in myrooms %s, hence adding'%(roomname,myrooms)) RedisConn.sadd(roomkey,json.dumps(o)) myrooms = RedisConn.smembers(roomkey) lo = {'op':'join','room':roomname,'user':self.user,'stamp':nowstamp(),'obj':o} writelog(roomname,json.dumps(lo)) RedisConn.sadd('users.%s'%roomname,self.user) self.resub() self.send({'op':'joinresult','status':'ok','roomname':roomname,'obj':o,'content':self.roomcontent(roomname),'users':list(RedisConn.smembers('users.%s'%roomname))}) elif m['objtype']=='message': o['sender'] = self.user #self.request.remote_addr o['stamp'] = nowstamp() line = json.dumps(o) writelog(o['room'],line) pubchan = channelpref+o['room'] assert o['room'] logging.info('PUBLISH(%s) > %s'%(pubchan,m)) RedisConn.publish(pubchan,json.dumps(m)) #publish a copy to self in case of privmsg if o['room'][0]=='@': no = o.copy() # snd = no['sender'] no['sender'] = no['room'][1:] # no['room']='@'+no['sender'] nm = m.copy() nm['o']=no pchan = channelpref+'@'+self.user #Exception: {u'objtype': u'message', u'obj': {u'stamp': '2011-08-26 09:50', u'content': u'w00t', u'sender': u'milez', u'room': u'@milez2'}, u'options': {}, u'op': u'create'} logging.info('PUBLISHSELF %s < %s'%(pchan,json.dumps(nm))) RedisConn.publish(pchan,json.dumps(m)) else: raise Exception('unknown objtype %s'%m['objtype']) elif m['op'] in ['delete']: if m['objtype']=='joinedroom': roomname = m['obj']['id'] r = getroom(roomname) ; assert r roomkey = 'rooms.%s'%self.user myrooms = RedisConn.smembers(roomkey) if roomname in [json.loads(mr)['id'] for mr in myrooms]: RedisConn.srem(roomkey,json.dumps({'id':roomname})) lo = {'op':'leave','room':roomname,'user':self.user,'stamp':nowstamp(),'obj':m['obj']} writelog(roomname,json.dumps(lo)) logging.info('DEPARTTURE of %s from %s -> %s'%(self.user,roomname,RedisConn.smembers(roomkey))) RedisConn.srem('users.%s'%roomname,self.user) self.resub() self.send({'op':'leaveresult','status':'ok','roomname':roomname}) else: raise Exception('unknown objtype %s'%m['objtype']) elif m['op']=='leaveall': while len(RedisConn.smembers('rooms.%s'%self.user)): RedisConn.spop('rooms.%s'%self.user) self.resub() else: raise Exception('unknown op %s'%m['op'])