Example #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'
Example #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'
Example #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)
Example #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)
Example #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)
Example #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)
Example #7
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])
Example #8
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)
Example #9
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])
Example #10
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)