def postMessage(): chat = request.form['chat'] if 'line' in request.form and g.user.meta['group']!='silent': # Remove linebreaks and truncate to 1500 characters. line = request.form['line'].replace('\n', ' ')[:1500] send_message(g.redis, chat, g.user.meta['counter'], 'message', line, g.user.character['color'], g.user.character['acronym']) if 'state' in request.form and request.form['state'] in ['online', 'idle']: change_state(g.redis, chat, g.user.session_id, request.form['state']) # Mod options. if g.user.meta['group'] in MOD_GROUPS: if 'set_group' in request.form and 'counter' in request.form: set_group = request.form['set_group'] set_session_id = g.redis.hget('chat.'+chat+'.counters', request.form['counter']) or abort(400) ss_key = 'session.'+set_session_id+'.chat.'+chat ss_meta_key = 'session.'+set_session_id+'.meta.'+chat current_group = g.redis.hget(ss_meta_key, 'group') # You can't promote people to or demote people from a group higher than your own. if ( GROUP_RANKS[current_group]>GROUP_RANKS[g.user.meta['group']] or GROUP_RANKS[set_group]>GROUP_RANKS[g.user.meta['group']] ): return 'ok' if current_group!=set_group and set_group in GROUP_RANKS.keys(): g.redis.hset(ss_meta_key, 'group', set_group) set_message = None # XXX make a function for fetching name and acronym? # Convert the name and acronym to unicode. ss_character = g.redis.hget(ss_key, 'character') set_session_name = unicode( g.redis.hget(ss_key, 'name') or CHARACTER_DETAILS[ss_character]['name'], encoding='utf8' ) set_session_acronym = unicode( g.redis.hget(ss_key, 'acronym') or CHARACTER_DETAILS[ss_character]['acronym'], encoding='utf8' ) if set_group=='mod': set_message = '%s [%s] set %s [%s] to Professional Wet Blanket. They can now silence, kick and ban other users.' elif set_group=='mod2': set_message = '%s [%s] set %s [%s] to Bum\'s Rusher. They can now silence and kick other users.' elif set_group=='mod3': set_message = '%s [%s] set %s [%s] to Amateur Gavel-Slinger. They can now silence other users.' elif set_group=='user': if current_group in MOD_GROUPS: set_message = '%s [%s] removed moderator status from %s [%s].' else: set_message = '%s [%s] unsilenced %s [%s].' elif set_group=='silent': set_message = '%s [%s] silenced %s [%s].' if set_message is not None: set_message = set_message % ( g.user.character['name'], g.user.character['acronym'], set_session_name, set_session_acronym ) send_message(g.redis, chat, -1, 'user_change', set_message) if 'user_action' in request.form and 'counter' in request.form and request.form['user_action'] in MINIMUM_RANKS: # Check if we're high enough to perform this action. if GROUP_RANKS[g.user.meta['group']]<MINIMUM_RANKS[request.form['user_action']]: return 'ok' their_session_id = g.redis.hget('chat.'+chat+'.counters', request.form['counter']) or abort(400) their_group = g.redis.hget('session.'+their_session_id+'.meta.'+chat, 'group') # Check if we're high enough to affect the other user. if GROUP_RANKS[g.user.meta['group']]<GROUP_RANKS[their_group]: return 'ok' # XXX make a function for fetching name and acronym? # Fetch their name and convert to unicode. their_chat_key = 'session.'+their_session_id+'.chat.'+chat their_character = g.redis.hget(their_chat_key, 'character') their_session_name = unicode( g.redis.hget(their_chat_key, 'name') or CHARACTER_DETAILS[their_character]['name'], encoding='utf8' ) their_session_acronym = unicode( g.redis.hget(their_chat_key, 'acronym') or CHARACTER_DETAILS[their_character]['acronym'], encoding='utf8' ) if request.form['user_action']=='kick': g.redis.publish('channel.'+chat+'.'+their_session_id, '{"exit":"kick"}') disconnect(g.redis, chat, their_session_id, "%s [%s] kicked %s [%s] from the chat." % ( g.user.character['name'], g.user.character['acronym'], their_session_name, their_session_acronym )) # Don't ban people from the oubliette because that'll just put us in an infinite loop. elif request.form['user_action']=='ip_ban' and chat!='theoubliette': their_ip_address = g.redis.hget('session.'+their_session_id+'.meta', 'last_ip') ban_id = chat+'/'+their_ip_address if their_ip_address is not None: g.redis.zadd('ip-bans', ban_id, get_time(IP_BAN_PERIOD)) if 'reason' in request.form: g.redis.hset('ban-reasons', ban_id, request.form['reason']) g.redis.publish('channel.'+chat+'.'+their_session_id, '{"exit":"ban"}') disconnect(g.redis, chat, their_session_id, "%s [%s] IP banned %s [%s]." % ( g.user.character['name'], g.user.character['acronym'], their_session_name, their_session_acronym )) if 'meta_change' in request.form: for flag in CHAT_FLAGS: if flag in request.form: if request.form[flag]=='1': g.redis.hset('chat.'+chat+'.meta', flag, '1') else: g.redis.hdel('chat.'+chat+'.meta', flag) send_message(g.redis, chat, -1, 'meta_change') if 'topic' in request.form: if request.form['topic']!='': truncated_topic = request.form['topic'][:1500] g.redis.hset('chat.'+chat+'.meta', 'topic', truncated_topic) send_message(g.redis, chat, -1, 'meta_change', '%s changed the conversation topic to "%s".' % ( g.user.character['name'], truncated_topic )) else: g.redis.hdel('chat.'+chat+'.meta', 'topic') send_message(g.redis, chat, -1, 'meta_change', '%s removed the conversation topic.' % g.user.character['name']) return 'ok'
while True: for dead in redis.zrangebyscore("chats-alive", 0, get_time()): chat, session = dead.split("/") disconnect_message = None if redis.hget("session." + session + ".meta." + chat, "group") != "silent": session_name = redis.hget("session." + session + ".chat." + chat, "name") if session_name is None: session_name = CHARACTER_DETAILS[redis.hget("session." + session + ".chat." + chat, "character")][ "name" ] disconnect_message = ( "%s's connection timed out. Please don't quit straight away; they could be back." % (session_name) ) disconnect(redis, chat, session, disconnect_message) print "dead", dead for dead in redis.zrangebyscore("searchers", 0, get_time()): print "reaping searcher", dead redis.zrem("searchers", dead) new_time = datetime.datetime.now() # Every minute if new_time.minute != current_time.minute: mysql = sm() # Send blank messages to avoid socket timeouts. for chat in redis.zrangebyscore("longpoll-timeout", 0, get_time()): send_message(redis, chat, -1, "message")
def quitChatting(): disconnect_message = '%s [%s] disconnected.' % (g.user.character['name'], g.user.character['acronym']) if g.user.meta['group']!='silent' else None disconnect(g.redis, request.form['chat'], g.user.session_id, disconnect_message) return 'ok'