示例#1
0
def speaker():
    idx = {
        k.split('_')[-1]: k for k in request.cookies
        if k.startswith(options.discuz_cookiepre)
    }

    if not ('auth' in idx and 'saltkey' in idx):
        response.status = 403
        return

    auth = unquote(request.get_cookie(idx['auth']))
    saltkey = unquote(request.get_cookie(idx['saltkey']))
    member = member_service.validate_by_cookie(auth, saltkey)
    if not member:
        return 'false'

    if member['credits'] < 10:
        return 'false'

    message = request.forms.get('message').decode('utf-8', 'ignore')
    username = member['username'].decode('utf-8', 'ignore')
    member_service.add_credit(member['uid'], 'credits', -10)

    Interconnect.publish('speaker', [username, message])

    return 'true'
示例#2
0
def speaker():
    idx = {
        k.split('_')[-1]: k
        for k in request.cookies if k.startswith(options.discuz_cookiepre)
    }

    if not ('auth' in idx and 'saltkey' in idx):
        response.status = 403
        return

    auth = unquote(request.get_cookie(idx['auth']))
    saltkey = unquote(request.get_cookie(idx['saltkey']))
    member = member_service.validate_by_cookie(auth, saltkey)
    if not member:
        return 'false'

    if member['credits'] < 10:
        return 'false'

    message = request.forms.get('message').decode('utf-8', 'ignore')
    username = member['username'].decode('utf-8', 'ignore')
    member_service.add_credit(member['uid'], 'credits', -10)

    Interconnect.publish('speaker', [username, message])

    return 'true'
示例#3
0
    def publish(self, topic, data):
        lock = self.lock
        if not lock:
            lock = RLock()
            self.lock = lock

        with lock:
            return InterconnectBase.publish(self, topic, data)
示例#4
0
    def publish(self, topic, data):
        lock = self.lock
        if not lock:
            lock = RLock()
            self.lock = lock

        with lock:
            return InterconnectBase.publish(self, topic, data)
示例#5
0
def gamehall_status_updator():
    last_update = time.time()
    evt = evt_datachange
    time_limit = 1
    while True:
        evt.wait()
        t = time.time()
        delta = t - last_update
        if delta > time_limit:
            last_update = t

            ul = [u for u in users.values() if u.state == 'hang']
            Pool(5).map_async(send_hallinfo, ul)

            Interconnect.publish('current_users', users.values())
            Interconnect.publish('current_games', games.values())

            evt.clear()

        else:
            gevent.sleep(time_limit - delta)
示例#6
0
def gamehall_status_updator():
    last_update = time.time()
    evt = evt_datachange
    time_limit = 1
    while True:
        evt.wait()
        t = time.time()
        delta = t - last_update
        if delta > time_limit:
            last_update = t

            ul = [u for u in users.values() if u.state == 'hang']
            Pool(5).map_async(send_hallinfo, ul)

            Interconnect.publish('current_users', users.values())
            Interconnect.publish('current_games', games.values())

            evt.clear()

        else:
            gevent.sleep(time_limit - delta)
示例#7
0
def main():
    global options, member_service, interconnect
    parser = argparse.ArgumentParser(sys.argv[0])
    parser.add_argument('--host', default='127.0.0.1')
    parser.add_argument('--port', type=int, default=7001)
    parser.add_argument('--redis-url', default='redis://localhost:6379')
    parser.add_argument('--member-service', default='localhost')
    parser.add_argument('--discuz-cookiepre', default='VfKd_')
    options = parser.parse_args()

    member_service = RPCClient((options.member_service, 7000), timeout=2)
    interconnect = Interconnect.spawn('forum', options.redis_url)

    run(server='gevent', host=options.host, port=options.port)
示例#8
0
def main():
    global options, member_service, interconnect, log
    parser = argparse.ArgumentParser('aya_charger')
    parser.add_argument('--redis-url', default='redis://localhost:6379')
    parser.add_argument('--member-service', default='localhost')
    parser.add_argument('--log', default='INFO')
    options = parser.parse_args()

    logging.basicConfig(stream=sys.stdout, level=getattr(logging, options.log))
    log = logging.getLogger('aya_charger')

    member_service = RPCClient((options.member_service, 7000), timeout=2)
    interconnect = Interconnect.spawn('charger', options.redis_url)

    gevent.hub.get_hub().join()
示例#9
0
            self.notify('current_users', rst)

        if topic == 'speaker':
            # [node, username, content]
            message.insert(0, node)
            self.notify('speaker', message)

    def notify(self, key, message):
        @gevent.spawn
        def _notify():
            events_history.rotate()
            events_history[0] = [[key, message], time.time()]
            [evt.set() for evt in list(event_waiters)]


Interconnect = Interconnect.spawn('forum', options.redis, options.redis_port)


@route('/interconnect/onlineusers')
def onlineusers():
    rst = []
    map(rst.__iadd__, current_users.values())
    return json.dumps(rst)


@route('/interconnect/events')
def events():
    try:
        last = float(request.get_cookie('interconnect_last_event'))
    except:
        last = time.time()
示例#10
0
            self.notify('current_users', rst)

        if topic == 'speaker':
            # [node, username, content]
            message.insert(0, node)
            self.notify('speaker', message)

    def notify(self, key, message):
        @gevent.spawn
        def _notify():
            events_history.rotate()
            events_history[0] = [[key, message], time.time()]
            [evt.set() for evt in list(event_waiters)]


Interconnect = Interconnect.spawn('forum', options.redis, options.redis_port)


@route('/interconnect/onlineusers')
def onlineusers():
    rst = []
    map(rst.__iadd__, current_users.values())
    return json.dumps(rst)


@route('/interconnect/events')
def events():
    try:
        last = float(request.get_cookie('interconnect_last_event'))
    except:
        last = time.time()
示例#11
0
 def worker():
     if user.account.other['credits'] < 10:
         user.write(['system_msg', [None, u'您的节操掉了一地,文文不愿意帮你散播消息。']])
     else:
         user.account.add_credit('credits', -10)
         Interconnect.publish('speaker', [user.account.username, msg])
示例#12
0
def forum_noti():
    parser = argparse.ArgumentParser('forum_noti')
    parser.add_argument('--redis-url', default='redis://*****:*****@localhost/ultrax?charset=utf8')
    parser.add_argument('--discuz-dbpre', default='pre_')
    parser.add_argument('--forums', default='2,36,38,40,78,82')
    parser.add_argument('--forums-thread-only', default='78')
    options = parser.parse_args()

    text = lambda t: sq_text(t.replace('cdb_', options.discuz_dbpre))

    engine = create_engine(
        options.connect_str,
        encoding='utf-8',
        convert_unicode=True,
    )

    forum_ids = map(int, options.forums.split(','))
    forums = engine.execute(text('''
        SELECT fid, name FROM cdb_forum_forum
        WHERE fid IN :fids
    '''),
                            fids=forum_ids).fetchall()
    forums = {i.fid: i.name for i in forums}

    r = redis.from_url(options.redis_url)
    interconnect = Interconnect('forum', options.redis_url)

    pid = int(r.get('aya:forum_lastpid') or 495985)

    post_template = u'|G{user}|r在|G{forum}|r发表了新主题|G{subject}|r:{excerpt}'
    reply_template = u'|G{user}|r回复了|G{forum}|r的主题|G{subject}|r:{excerpt}'

    threads_only = set(map(int, options.forums_thread_only.split(',')))

    while True:
        time.sleep(5)
        posts = engine.execute(text('''
            SELECT * FROM cdb_forum_post
            WHERE pid > :pid AND
                  fid IN :fids
            ORDER BY pid ASC
        '''),
                               pid=pid,
                               fids=forum_ids)

        if not posts:
            continue

        for p in posts:
            if not p.first and p.fid in threads_only:
                continue

            t = engine.execute(text('''
                SELECT * FROM cdb_forum_thread
                WHERE tid = :tid
            '''),
                               tid=p.tid).fetchone()

            template = post_template if p.first else reply_template

            excerpt = p.message.replace(u'\n', '')
            excerpt = HTMLParser.HTMLParser().unescape(excerpt)
            excerpt = re.sub(r'\[quote\].*?\[/quote\]', u'', excerpt)
            excerpt = re.sub(r'\[img\].*?\[/img\]', u'[图片]', excerpt)
            excerpt = re.sub(r'\[.+?\]', u'', excerpt)
            excerpt = re.sub(r'\{:.+?:\}', u'[表情]', excerpt)
            excerpt = re.sub(r' +', u' ', excerpt)
            excerpt = excerpt.strip()
            if len(excerpt) > 60:
                excerpt = excerpt[:60] + u'……'

            msg = template.format(
                user=p.author,
                forum=forums[t.fid],
                subject=t.subject,
                excerpt=excerpt,
            )
            interconnect.publish('speaker', [u'文文', msg])
            pid = p.pid

        r.set('aya:forum_lastpid', pid)
示例#13
0
 def worker():
     if user.account.other['credits'] < 10:
         user.write(['system_msg', [None, u'您的节操掉了一地,文文不愿意帮你散播消息。']])
     else:
         user.account.add_credit('credits', -10)
         Interconnect.publish('speaker', [user.account.username, msg])
示例#14
0
def forum_noti():
    parser = argparse.ArgumentParser('forum_noti')
    parser.add_argument('--redis-url', default='redis://*****:*****@localhost/ultrax?charset=utf8')
    parser.add_argument('--discuz-dbpre', default='pre_')
    parser.add_argument('--forums', default='2,36,38,40,78,82')
    parser.add_argument('--forums-thread-only', default='78')
    options = parser.parse_args()

    text = lambda t: sq_text(t.replace('cdb_', options.discuz_dbpre))

    engine = create_engine(
        options.connect_str,
        encoding='utf-8',
        convert_unicode=True,
    )

    forum_ids = map(int, options.forums.split(','))
    forums = engine.execute(text('''
        SELECT fid, name FROM cdb_forum_forum
        WHERE fid IN :fids
    '''), fids=forum_ids).fetchall()
    forums = {i.fid: i.name for i in forums}

    r = redis.from_url(options.redis_url)
    interconnect = Interconnect('forum', options.redis_url)

    pid = int(r.get('aya:forum_lastpid') or 495985)

    post_template = u'|G{user}|r在|G{forum}|r发表了新主题|G{subject}|r:{excerpt}'
    reply_template = u'|G{user}|r回复了|G{forum}|r的主题|G{subject}|r:{excerpt}'

    threads_only = set(map(int, options.forums_thread_only.split(',')))

    while True:
        time.sleep(5)
        posts = engine.execute(text('''
            SELECT * FROM cdb_forum_post
            WHERE pid > :pid AND
                  fid IN :fids
            ORDER BY pid ASC
        '''), pid=pid, fids=forum_ids)

        if not posts:
            continue

        for p in posts:
            if not p.first and p.fid in threads_only:
                continue

            t = engine.execute(text('''
                SELECT * FROM cdb_forum_thread
                WHERE tid = :tid
            '''), tid=p.tid).fetchone()

            template = post_template if p.first else reply_template

            excerpt = p.message.replace(u'\n', '')
            excerpt = HTMLParser.HTMLParser().unescape(excerpt)
            excerpt = re.sub(r'\[quote\].*?\[/quote\]', u'', excerpt)
            excerpt = re.sub(r'\[img\].*?\[/img\]', u'[图片]', excerpt)
            excerpt = re.sub(r'\[.+?\]', u'', excerpt)
            excerpt = re.sub(r'\{:.+?:\}', u'[表情]', excerpt)
            excerpt = re.sub(r' +', u' ', excerpt)
            excerpt = excerpt.strip()
            if len(excerpt) > 60:
                excerpt = excerpt[:60] + u'……'

            msg = template.format(
                user=p.author,
                forum=forums[t.fid],
                subject=t.subject,
                excerpt=excerpt,
            )
            interconnect.publish('speaker', [u'文文', msg])
            pid = p.pid

        r.set('aya:forum_lastpid', pid)