135 lines
3.7 KiB
Python
135 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
#!/usr/bin/python
|
|
|
|
import pymysql
|
|
import hashlib
|
|
import json
|
|
import urllib.request
|
|
import base64
|
|
import tornado.ioloop
|
|
import tornado.web
|
|
import time
|
|
import datetime
|
|
import redis
|
|
import os
|
|
CONFIG_DIR = ''
|
|
|
|
def IsOnlineEnv():
|
|
return os.getenv("SERVER_ENV");
|
|
|
|
if (IsOnlineEnv()):
|
|
CONFIG_DIR = '/var/data/conf_test/game2002api_rankserver/config'
|
|
else:
|
|
CONFIG_DIR = '../config'
|
|
|
|
#定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示
|
|
|
|
def info(msg):
|
|
print(str(datetime.datetime.now()) + '[INFO] ' + msg)
|
|
|
|
def take_kills(elem):
|
|
return elem[3]
|
|
|
|
def take_alive_time(elem):
|
|
return elem[4]
|
|
|
|
def take_harms(elem):
|
|
return elem[5]
|
|
|
|
def take_win_times(elem):
|
|
return elem[6]
|
|
|
|
def take_game_times(elem):
|
|
return elem[7]
|
|
|
|
def safeDiv(a, b):
|
|
if b == 0:
|
|
return 0
|
|
else:
|
|
return a / b
|
|
|
|
def getRedis():
|
|
redis_conf = json.loadsmysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.redis.cluster.json', 'r').read())
|
|
for conf in redis_conf:
|
|
r = redis.Redis(host = conf['host'],
|
|
port = conf['port'],
|
|
password = conf['passwd'],
|
|
charset = 'utf8'
|
|
)
|
|
return r;
|
|
|
|
|
|
def readMysqlData(rushtime):
|
|
mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read())
|
|
array = []
|
|
for conf in mysql_conf:
|
|
conn = pymysql.connect(host = conf['host'],
|
|
port = conf['port'],
|
|
user = conf['user'],
|
|
passwd = conf['passwd'],
|
|
db = 'gamedb2002_' + str(conf['instance_id']),
|
|
charset = 'utf8'
|
|
)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT accountid, user_name, avatar_url, kills, alive_time, harm, win_times, game_times FROM user;')
|
|
for row in cursor:
|
|
kill = safeDiv(row[3], row[7])
|
|
alive_time = safeDiv(row[4], row[7])
|
|
harm = safeDiv(row[5], row[7])
|
|
win_times = safeDiv(row[6], row[7])
|
|
array.append((row[0], row[1].decode('utf-8'), row[2], kill, alive_time, harm, win_times, row[6]))
|
|
|
|
r = getRedis()
|
|
array.sort(key=take_kills, reverse=True)
|
|
kill_rank = json.dumps(array)
|
|
r.set("game2002api: kill_rank", kill_rank)
|
|
|
|
array.sort(key=take_alive_time, reverse=True)
|
|
alive_rank = json.dumps(array)
|
|
r.set("game2002api: alive_rank", alive_rank)
|
|
|
|
array.sort(key=take_harms, reverse=True)
|
|
harm_rank = json.dumps(array)
|
|
r.set("game2002api: harm_rank", harm_rank)
|
|
|
|
array.sort(key=take_win_times, reverse=True)
|
|
rate_rank = json.dumps(array)
|
|
r.set("game2002api: rate_rank", rate_rank)
|
|
|
|
array.sort(key=take_game_times, reverse=True)
|
|
|
|
win_rank = json.dumps(array)
|
|
r.set("game2002api: win_rank", win_rank)
|
|
|
|
tornado.ioloop.IOLoop.current().call_later(rushtime,
|
|
lambda : readMysqlData(rushtime)
|
|
)
|
|
|
|
|
|
class SelfCheckingHandler(tornado.web.RequestHandler):
|
|
|
|
def get(self):
|
|
self.write(json.dumps({
|
|
'errcode': 0,
|
|
'errmsg': '',
|
|
'healthy': 1,
|
|
'max_rundelay': 10
|
|
}))
|
|
|
|
def make_app():
|
|
return tornado.web.Application([
|
|
(r"/webapp/index[\.]php", SelfCheckingHandler),
|
|
])
|
|
|
|
if __name__ == "__main__":
|
|
conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read())
|
|
|
|
app = make_app()
|
|
app.listen(conf['listen_port'])
|
|
conf['rushtime'] = 300
|
|
|
|
tornado.ioloop.IOLoop.current().call_later(conf['rushtime'],
|
|
lambda : readMysqlData(conf['rushtime'])
|
|
)
|
|
tornado.ioloop.IOLoop.current().start()
|