Exemple #1
0
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'
Exemple #2
0
    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")
Exemple #3
0
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'