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'
def publish(self, topic, data): lock = self.lock if not lock: lock = RLock() self.lock = lock with lock: return InterconnectBase.publish(self, topic, data)
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)
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)
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()
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()
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])
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)