def log(self, uid, name, msg_type, msg, *args): """ 记录 """ msg = RoleLog(msg_type=msg_type, msg=msg % args) msg.role_name = uid msg.name = name log.warn(msg.message) self._game.store.save(msg)
def start(self): self.stoped = False self.svr = grpc.RpcServer() self.svr.bind(self.addr) self.svr.register(self) self.svr.start() # 用来阻塞住主协程 self._waiter = gevent.event.Event() self._waiter_stoped = gevent.event.Event() try: while 1: #检查父进程是否已经关闭 if not self._exist_pid(): self._wait_game_stop() log.warn(u'主进程(%s)已经退出,子进程(%s)将自动关闭', self.pid, os.getpid()) os.environ['PARENT_STOPED'] = '1' break try: if self._waiter.wait(2): break except KeyboardInterrupt: pass except Exception as e: log.info('subgame app error:%s', e) try: self._stop() finally: self._waiter_stoped.set() sleep(2) self._svr_stop() sleep(0.5)
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 # log.info('[pp]PayCallBack:%s', data) for fn in cls.FIELDS: if fn not in data: log.warn('[pp]Param not found:%s', fn) return CODE_PARAM, '' #rsa验证 sign = data['sign'] sdata = sdk.decode_sign(sign) for k,v in sdata.iteritems(): if k == cls.F_STATUS: if int(data[k]) != int(v): return CODE_SIGN, 'sign data error' elif data[k] != v: return CODE_SIGN, 'sign data error' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, '' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 rs = cls.check_attr(cls.FIELDS, data) if not rs: return CODE_PARAM, '' #rsa验证 sign = data['sign'] data = data['data'] sdata = sdk.get_sign(data) if sdata != sign: log.warn('[uc]sign data error, sign(%s) sdata(%s)', sign, sdata) return CODE_SIGN, 'sign data error' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, 'payExistError' #保存 try: if cls.save_data( data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 # log.info('[pp]PayCallBack:%s', data) for fn in cls.FIELDS: if fn not in data: log.warn('[pp]Param not found:%s', fn) return CODE_PARAM, '' #rsa验证 sign = data['sign'] sdata = sdk.decode_sign(sign) for k, v in sdata.iteritems(): if k == cls.F_STATUS: if int(data[k]) != int(v): return CODE_SIGN, 'sign data error' elif data[k] != v: return CODE_SIGN, 'sign data error' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, '' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 # log.info('[sdk91Pay]PayCallBack:%s', data) for fn in cls.FIELDS: if fn not in data: log.warn('[sdk91Pay]Param not found:%s', fn) return CODE_PARAM, '' #算md5需要用utf8编码 data_utf8 = dict([(k, v.encode('utf8')) for k, v in data.iteritems()]) sign = data['Sign'] sign_t = ''.join(['%%(%s)s' % fn for fn in cls.FIELDS[:-1]]) sign_str = '%s%s' % (sign_t % data_utf8, sdk.app_key) md5_str = md5(sign_str).hexdigest() if sign != md5_str: log.warn('[sdk91Pay]sign error:%s != %s (%s)', sign, md5_str, sign_str) return CODE_SIGN, '' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, '' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 # log.info('[dpay]PayCallBack:%s', data) for fn in cls.FIELDS: if fn not in data: log.warn('[dpay]Param not found:%s', fn) return CODE_PARAM, '' #算md5需要用utf8编码 data_utf8 = dict([(k,v.encode('utf8')) for k,v in data.iteritems()]) sign = data['Sign'] sign_t = '&'.join(['%s=%%(%s)s' % (fn, fn) for fn in cls.FIELDS[:-1]]) sign_str = '%s%s' % (sign_t % data_utf8, sdk.app_key) if isinstance(sign_str, unicode): sign_str = sign_str.encode('ascii') md5_str = md5(sign_str).hexdigest() if sign != md5_str: log.warn('[dpay]sign error:%s != %s (%s)', sign, md5_str, sign_str) return CODE_SIGN, '' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, '' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 for fn in cls.FIELDS: if fn not in data: log.warn('[idsc]callback Param not found:%s', fn) return CODE_PARAM, '' #rsa验证 sign = data['sign'] sdata = sdk.get_pay_sign(data) if sdata != sign: log.warn('[idsc]callback sign data error, sign(%s) sdata(%s)', sign, sdata) return CODE_SIGN, 'sign data error' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 for attr in cls.FIELDS: if attr not in data: log.warn('[TongBu]Param not found:%s, data:%s', attr, data) return CODE_PARAM, '' #rsa验证 sign = data['sign'] sdata = sdk.get_sign(data) if sdata != sign: log.warn('[TongBu]sign data error, sign(%s) sdata(%s)', sign, sdata) return CODE_SIGN, 'sign data error' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, 'payExistError' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), int(data[cls.F_PRICE]) / 100, data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 for attr in cls.FIELDS: if attr not in data: log.warn('[TongBu]Param not found:%s, data:%s', attr, data) return CODE_PARAM, '' #rsa验证 sign = data['sign'] sdata = sdk.get_sign(data) if sdata != sign: log.warn('[TongBu]sign data error, sign(%s) sdata(%s)', sign, sdata) return CODE_SIGN, 'sign data error' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, 'payExistError' #保存 try: if cls.save_data( data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), int(data[cls.F_PRICE])/100, data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def _inc_pool(self, pool, num): """ inc pool size """ if pool.size >= self.MAX_SIZE: return log.warn('[StorePool]pool inc:+%d / %d', num, pool.size) pool.size += num for i in xrange(num): pool._semaphore.release()
def _loop(self): while 1: sleep(config.report_times) try: self.update_report() except socket.error as err: log.warn('socket error:%s', err) except: log.log_except()
def _on_close(self, app): if app not in self.apps: return pid, key, addr, names = self.apps.pop(app) log.warn('close app:pid=%s, key=%s, addr=%s', pid, key, addr) self.names.pop(key, None) if self.free_addrs is not None and key not in self.key_addrs: self.free_addrs.append(addr) spawn_later(5, self.proc_mgr.kill_process, pid)
def check_attr(cls, adict, data): for k, v in adict.iteritems(): if k not in data: log.warn('[uc]Param not found:%s, data:%s', k, data) return False if isinstance(v, dict): rs = cls.check_attr(v, data[k]) if not rs: return False return True
def stop(self): if self.stoped: return self.stoped = True log.warn(u'管理进程开始退出') try: self.sub_mgr.stop() self.rpc_svr.stop() self.web_svr.stop() except: log.log_except() finally: self._waiter.set()
def set(self, key, value, timeout=None): """ timeout:过期时间(单位秒),如果为0,不过期 """ if timeout is None or timeout < 0: timeout = self.default_timeout if timeout > 0: timeout = time.time() + abs(timeout) self._times[key] = timeout self._caches[key] = (value, timeout) if len(self._caches) > self.size and \ self._gc_time + self.gc_time < time.time(): log.warn(u'TimeMemCache缓存(%s-%s)不足,开始清理缓存', self.name, len(self._caches)) spawn(self.gc) #sleep(0.01) return value
def area_legal(self): """登陆时区域是不是合法""" if not self._area_url or not self._area_legal: #未配置则所有人合法登陆 return True rpc = client_rpc.get_cur_rpc() data = urllib.urlencode({'ip':rpc.addr[0], 'check':str(0)}) host, port, url = self._area_url try: area = tools.http_post_ex(host, port, url, params=data, timeout=GPlayerMgr.TIME_OUT) area = json.loads(area) country = area['country'] log.debug('area_legal:%s in %s', rpc.addr[0], country) return not country or country in self._area_legal except BaseException as e: log.warn("area_legal error:%s", e) return True
def load(self): """ 加载数据(执行中的任务) """ store = self.player._game.rpc_store end_tasks = self.player.play_attr.setdefault(PLAYER_ATTR_TASKS, '') self.tid_bm.from_base64(end_tasks) querys = dict(pid=self.player.data.id, status=1) tasks = store.query_loads(TN_P_TASK, querys) for data in tasks: tid = data['tid'] if tid in self.tids: #重复记录... log.warn('[task]player(%s) task(%s) repeat', self.player.data.id, tid) spawn(store.delete, TN_P_TASK, data['id']) continue task = Task.new_by_dict(data) if not task: log.warn('[task]res_task not found:%s', tid) continue if tid in self.tid_bm: #记录异常 self.player.log_task(tid, data['id'], t=PL_ERROR) self.tasks[data['id']] = task self.tids[tid] = task if task.data.isRun: self.run_task = task if not end_tasks: #新玩家 #log.debug(u'new player accept_tasks') def _fun(): if not (self.player and self.player.logined): return self.accept_tasks(TUL_LEVEL, 1) spawn_later(2, _fun) init_data = { TASK_BFTASK_FINISH: 0, TASK_ZXTASK_FINISH: 0, TASK_YCTASK_FINISH: 0 } self.p_attr_task = self.player.play_attr.setdefault( PLAYER_ATTR_TASK, init_data) if not self.p_attr_task: self.p_attr_task = init_data
def ChenckPay(cls, sdk, data): #校验 for fn in cls.CHECK_FILEDS: if fn not in data: log.warn('[idsc]ChenckPay Param not found:%s', fn) return CODE_PARAM, 'Param not found:%s' % fn #rsa验证 sign = data['sign'] sdata = sdk.get_check_pay_sign(data) if sdata != sign: log.warn('[idsc]ChenckPay sign data error, sign(%s) sdata(%s)', sign, sdata) return CODE_SIGN, 'sign data error' rs, desc = cls.check_pay(data) if rs: return CODE_SUCC, desc return CODE_FAIL, desc
def login(self, sid, session_id): """ 登陆检查 """ ltoken = len(session_id) l = LEN_UINT32 + LEN_UINT32 + ltoken d = struct.pack('<II%ds' % ltoken, l, CMD_LOGIN, session_id) data = None with self.pool as sock: sock.sendall(d) data = self.recv_pack(sock) if not data: return 0, webapi.EC_VALUE #解释返回数据 lname = len(data) - LEN_UINT32 + LEN_UINT32 + LEN_UINT64 cmd, status, name, uid = struct.unpack('<II%dsQ' % lname, data) if status != PAY_STATUS_SUCC: log.warn('[pp]login fail:%s', (cmd, status, name, uid)) return 0, webapi.EC_NET_ERR return 1, uid
def area_legal(self): """登陆时区域是不是合法""" if not self._area_url or not self._area_legal: #未配置则所有人合法登陆 return True rpc = client_rpc.get_cur_rpc() data = urllib.urlencode({'ip': rpc.addr[0], 'check': str(0)}) host, port, url = self._area_url try: area = tools.http_post_ex(host, port, url, params=data, timeout=GPlayerMgr.TIME_OUT) area = json.loads(area) country = area['country'] log.debug('area_legal:%s in %s', rpc.addr[0], country) return not country or country in self._area_legal except BaseException as e: log.warn("area_legal error:%s", e) return True
def init(self): """ 初始化竞技场数据:根据30级以上的玩家战斗力排名,得到竞技场排名 """ log.warn(u"初始化竞技场") self.clear() #删除记录 Game.rpc_store.deletes(TN_ARENA_RANKS) Game.rpc_store.deletes(TN_P_ARENA) #Game.rpc_store.insert(TN_ARENA_RANK, {FN_ID:0, FN_NEXT:END}) #根据30级以上玩家战斗力排名 CBEs = [(i[FN_P_ATTR_PID], i.get(FN_P_ATTR_CBE, index)) for index, i in enumerate(PlayerAttr.get_CBE_ranks())] levels = PlayerData.get_players_levels(None) #插入机器人 for i in xrange(self.BOT_RANK): self.update_rank(END, END - (i + 1)) #真实玩家 for pid, CBE in CBEs: if pid not in levels or levels[pid] < arena_level: continue self.update_rank(END, pid)
def load(self): """ 加载数据(执行中的任务) """ store = self.player._game.rpc_store end_tasks = self.player.play_attr.setdefault(PLAYER_ATTR_TASKS, '') self.tid_bm.from_base64(end_tasks) querys = dict(pid=self.player.data.id, status=1) tasks = store.query_loads(TN_P_TASK, querys) for data in tasks: tid = data['tid'] if tid in self.tids:#重复记录... log.warn('[task]player(%s) task(%s) repeat', self.player.data.id, tid) spawn(store.delete, TN_P_TASK, data['id']) continue task = Task.new_by_dict(data) if not task: log.warn('[task]res_task not found:%s', tid) continue if tid in self.tid_bm:#记录异常 self.player.log_task(tid, data['id'], t=PL_ERROR) self.tasks[data['id']] = task self.tids[tid] = task if task.data.isRun: self.run_task = task if not end_tasks:#新玩家 #log.debug(u'new player accept_tasks') def _fun(): if not (self.player and self.player.logined): return self.accept_tasks(TUL_LEVEL, 1) spawn_later(2, _fun) init_data = {TASK_BFTASK_FINISH:0, TASK_ZXTASK_FINISH:0, TASK_YCTASK_FINISH:0} self.p_attr_task = self.player.play_attr.setdefault(PLAYER_ATTR_TASK, init_data) if not self.p_attr_task: self.p_attr_task = init_data
def _save_servers(self, ver, params): name = 'servers' json_data = json_dumps(params, ensure_ascii=True) is_same = json_data == self.servers_json self.servers_json = json_data if not os.path.exists(config.web_config_path): log.warn(u'web_config_path(%s) not existed!', config.web_config_path) return try: if self.pre_ver != ver: #旧版本json更新client_ver数据,提示玩家更新程序 if self.pre_ver is not None: self._save_file(self.pre_ver, name, json_data, False) self._save_file(ver, name, json_data, False) self.pre_ver = ver else: self._save_file(ver, name, json_data, is_same) except: log.log_except()
def GET(cls, sdk, data): """ 收到回调,处理数据 """ #校验 rs = cls.check_attr(cls.FIELDS, data) if not rs: return CODE_PARAM, '' #rsa验证 sign = data['sign'] data = data['data'] sdata = sdk.get_sign(data) if sdata != sign: log.warn('[uc]sign data error, sign(%s) sdata(%s)', sign, sdata) return CODE_SIGN, 'sign data error' if cls.pay_exist(data[cls.F_TORDER]): return CODE_SUCC, 'payExistError' #保存 try: if cls.save_data(data[cls.F_PORDER], data[cls.F_TORDER], cls.is_ok(data), data[cls.F_PRICE], data): return CODE_SUCC, 'save' except: log.log_except() return CODE_FAIL, 'systemError'
def _loop(self): """ 定时判断资源库版本号,更新资源 """ import app while not app.stoped: sleep(30) db_ver = self._get_db_ver() if db_ver != self.db_ver: log.warn(u'更新资源库(%s)', db_ver) if self.load(app): log.warn(u'更新资源库(%s)完成', db_ver) self.pub(MSG_RES_RELOAD) else: log.warn(u'更新资源库(%s)失败', db_ver)
def run(self): log.warn('run...') import manage #manage.run(config.SERVER_HOST_PORT) manage.start(config.SERVER_HOST_PORT)
def overload(self, m): """ 启动压力测试m分钟 """ self.overload_time = time.time() + m * 60 log.warn('overload start to %s', datetime.datetime.fromtimestamp(self.overload_time))
def log_role(self, role, msg_type, msg, *args): """ 记录角色重要资源信息 """ msg = RoleLog(role, msg_type=msg_type, msg=msg % args) log.warn(msg.message) old_spawn(self._game.store.save, msg)