def RecvAll(sock, length): """ 接收数据 :param sock: 文件标识符 :param length: 数据长度 :return: """ # Log.Write("recvall fileno: %d datalen: %d" % (sock.fileno(), length)) data = "" tmpData = "" if length == 0: return data tmpLength = length while True: try: gevent.socket.wait_read(sock.fileno) # gevent tmpData = sock.recv(tmpLength) except l_socket.error, le: Log.Write("recv all exception:", le) if le.errno == 11 or le.errno == 110 or le.errno == 4: continue else: return None if len(tmpData) == 0: Log.Write("fileno: %d recv nothing" % sock.fileno()) return None data += tmpData tmpLength -= len(tmpData) if tmpLength == 0: return data
def ExactTimerProcess(param): Log.Write("ExactTimerProcess", param) exacttimerevent = gevent.event.Event() hour = param[0] # 小时 minute = param[1] # 分钟 second = param[2] # 秒数 while True: nowtime3 = datetime.now() # 当前时间 # nowtime4 = datetime.now() nowtime4 = nowtime3.replace(nowtime3.year, nowtime3.month, nowtime3.day, hour, minute, second) timedelta1 = nowtime4 - nowtime3 if timedelta1.days < 0: nowtime4 += timedelta(days=1) timedelta1 = nowtime4 - nowtime3 waitSecond = timedelta1.days * 24 * 60 * 60 + timedelta1.seconds Log.Write(nowtime4, timedelta1, waitSecond) exacttimerevent.wait(waitSecond) for i in range(3, len(param)): func = param[i] try: func() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc()) exacttimerevent.wait(1)
def SendToUser(rid, data, forcesend=False): ''' 给玩家发送数据 :param rid: :param data: :param forcesend: :return: ''' # Log.Write("SendToUser", rid) Lock2(UserSocketManager._lock) if not UserSocketManager._id.has_key(rid): Log.Write("[Error]no user %d" % rid) return False sockfileno = UserSocketManager._id[rid] # todo fix chungeng cut off net resend data if not forcesend: sockfileno2 = None sock2 = data.Socket() if sock2: sockfileno2 = sock2.fileno() # Log.Write("SendToUser", sockfileno2, sockfileno) if sockfileno2 and sockfileno != sockfileno2: return False if not UserSocketManager._dict.has_key(sockfileno): Log.Write("[Error]no user %d sock" % rid) return False # UserSocketManager._seq[sockfileno] += 1 # data.setSeq(UserSocketManager._seq[sockfileno]) data.setMagicCode(UserSocketManager._magicCode) UserSocketManager._dict[sockfileno]["send"].put(data) # "send": Queue() return True
def LoadUserData2(userid): # 引入合服机制,通过判断userid的组成,判断什么模式 # 正常模式 userid 为整数 # 合服模式 userid 为userid_server result = None if isinstance(userid, int): with session_scope() as session: result = session.query(t_role).filter(t_role.uid == userid).first() else: Log.Write("LoadUserData2 merge tip") userid_a = userid.split("_") if len(userid_a) < 2: raise TypeError("Merge Mode t_role error") userid_fix = int(userid_a[0]) server_fix = int(userid_a[1]) Log.Write(userid_fix, server_fix) with session_scope() as session: result = session.query(t_role).filter( and_( t_role.uid == userid_fix, and_(t_role.id > (1000000 * server_fix), (t_role.id < (1000000 * (server_fix + 1))) ) ) ).first() if result: Log.Write("LoadUserData", userid, result.id) result.createtime_utc = ConvertToUTCSeconds(result.createtime) return result
def DayHalfHourTick(): ''' 半点定时器 :return: ''' Log.Write("DayHalfHourTick") dayhalfhourevent = gevent.event.Event() nowtime = datetime.now() if nowtime.minute < 30: secs_halfhour = (30 - nowtime.minute) * 60 - nowtime.second else: secs_halfhour = (90 - nowtime.minute) * 60 - nowtime.second Log.Write("secs_halfhour", secs_halfhour) dayhalfhourevent.wait(secs_halfhour) def DayHalfHourTickProcess(): ''' 检测执行函数 半点 :return: ''' Log.Write("DayHalfHourTickProcess") nowtime1 = datetime.now() for k, v in PerDayHalfHourConfig.items(): nowhour = nowtime1.hour % 24 k = k % 24 if k == nowhour: # print("[DayHour] Hour: %d" % (k)) for func in v: try: func() # 整点加30分钟 00:30 01:30 02:30 except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def LoadRoleData(roleid): ''' 根据rid获取玩家本身的数据 :param roleid: :return: ''' with session_scope() as session: result = session.query(t_role).filter(t_role.id == roleid).first() if result: rid = result.id server_fix = None if rid > 1000000: server_fix = rid // 1000000 # server_id [1,2,3,...1000] Log.Write("[TIP]server_fix", server_fix) m = re.match(r"^S(\d+)-", result.name) server_test = None try: xxxtuple = m.groups() server_test = int(xxxtuple[0]) Log.Write("[TIP]server_test", server_test) except: pass if server_test != server_fix: result.name = u"S%d-" % server_fix + result.name Log.Write("[TIP]name", result.name) DBEngine.Update(result) result.createtime_utc = ConvertToUTCSeconds(result.createtime) return result
def LoadFirst(self, userid=None, roleid=None): ''' 加载数据 :param userid: :param roleid: :return: ''' # Log.Write("UserDataObj.LoadFirst", userid, roleid) role = None if userid: role = t_role.LoadUserData(userid) Log.Write("from uid userid:", userid, "roleid:", role.id, role) if roleid: role = t_role.LoadRoleData(roleid) if role: Log.Write("from rid userid:", role.uid, "roleid:", roleid, "power:", role.power) if not role: return False self["role"] = role # if role.profile <= 10100 or role.profile > 10115: # 头像 # role.profile = 10101 # self.NewUserActivity() if role.power == -1: role.power = 0 self.LoadSecond() for i in range(1, 8): general = self.slot.slot[i] if general: role.power += general.power return True
def Update(section, ctype): session = DBEngine.NewSession() try: config_file = session.query(t_section_config, t_section_config_files).\ filter(and_(t_section_config.section == section, t_section_config.ctype == ctype)).\ filter(t_section_config.excute == t_section_config_files.id).first() if config_file is None: Log.Write("[Error]GameConfig Error:No GameConfig Data") return None config_file_info = { "section": config_file[0].section, "ctype": config_file[0].ctype, "version": config_file[0].version, "excute": config_file[0].excute, "url": config_file[1].url, "filepath": config_file[1].filepath, "url2": config_file[1].url2, "url3": config_file[1].url3 } if not GameConfigManager._config_dict.has_key( config_file_info["section"]): GameConfigManager._config_dict[ config_file_info["section"]] = {} GameConfigManager._config_dict[config_file_info["section"]][ config_file[0].ctype] = config_file_info return config_file_info except NoResultFound, nf: Log.Write("[Error]Database Error: %s" % str(nf)) return None
def HttpDownloadFile(configurl, writetopath): ''' 通过http获取配置 :param configurl: 配置url :param writetopath: 写入本地的路径 :return: ''' Log.Write(configurl, writetopath) maxlen = len(configurl) for i in xrange(0, 10): fixurl = configurl[i % maxlen] Log.Write("oldurl", fixurl) fixurl = fixurl.replace("https", "http") Log.Write("fixurl", fixurl) url = URL(fixurl) try: http = HTTPClient.from_url(url) response = http.get(url.request_uri) CHUNK_SIZE = 1024 * 16 # 16KB data = response.read(CHUNK_SIZE) sumdata = data while data: data = response.read(CHUNK_SIZE) sumdata += data json.loads(sumdata) with open(writetopath, 'w') as f: f.write(sumdata) Log.Write("success") except Exception, e: Log.Write("fail", i, e) gevent.sleep(1) continue return True
def session_scope(): """Provide a transactional scope around a series of operations.""" session = DBEngine.NewSession() try: yield session except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def DelGreenletSession(glet): session = DBEngine._commonsession try: session.commit() session.expunge_all() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def LoadUserData(userid): # 引入合服机制, 通过判断userid的组成, 判断什么模式 # 正常模式 userid 为整数 # 合服模式 userid 为userid_server result = None if isinstance(userid, int) or isinstance(userid, long): # 正常模式 with session_scope() as session: result = session.query(t_role).filter(t_role.uid == userid).first() if result is None: result = t_role() result.uid = userid result.createtime = GameData.sysTickTime CreateRole(result) DBEngine.Add(result) DBEngine.Update(result) result.__server_fix = None else: # 合服模式 Log.Write("LoadUserData merge tip") userid_a = userid.split("_") if len(userid_a) < 2: raise TypeError("Merge Mode t_role error") userid_fix = int(userid_a[0]) server_fix = int(userid_a[1]) Log.Write(userid_fix, server_fix) with session_scope() as session: result = session.query(t_role).filter( and_( t_role.uid == userid_fix, and_(t_role.id > (1000000 * server_fix), (t_role.id < (1000000 * (server_fix + 1))) ) ) ).first() if result is None: result = t_role() result.uid = userid_fix result.createtime = GameData.sysTickTime CreateRole(result, server_fix) DBEngine.Add(result) DBEngine.Update(result) else: m = re.match(r"^S(\d+)-", result.name) # S999999-xxxx server_test = None try: xxxtuple = m.groups() server_test = int(xxxtuple[0]) # 服务器编号999999 Log.Write("[TIP]server_test", server_test) except: pass if server_test != server_fix: result.name = u"S%d-" % server_fix + result.name Log.Write("[TIP]name", result.name) DBEngine.Update(result) result.__server_fix = server_fix Log.Write("LoadUserData", userid, result.id, result.__server_fix) result.createtime_utc = ConvertToUTCSeconds(result.createtime) return result
def session_New(): """Provide a transactional scope around a series of operations.""" session = DBEngine._sessionmaker() try: yield session session.commit() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def _excute(): appConfig = ConfigManager.Singleton() serverInfo = appConfig["Server"]["Info"] accServerConfig = appConfig["Server"]["Interface"]["AccServer2"] address = (accServerConfig["Address"]["ip"], int(accServerConfig["Address"]["port"])) magiccode = int(accServerConfig["MagicCode"], 16) seqCount = 0 while True: sock = None while True: AccServerConnection2._status = False try: Log.Write("try Acc Server 2 connection to %s:%s"%address) sock = gevent.socket.create_connection(address) except l_socket.error, e: Log.Write("%s" % str(e)) gevent.sleep(2) continue AccServerConnection2._sock = sock AccServerConnection2._reconnectEvent.clear() Log.Write("Acc Server 2 connection to %s:%s" % address) ServerSocketManager.NewConnection(sock.fileno()) taskData = TaskData(sock) taskData.setType(0) shake_acc = shaketoacc_pb2.ShakeToAcc() shake_acc.id = int(serverInfo["ID"]) shake_acc.code = int(serverInfo["Code"], 16) shake_acc.port = 0 taskData.setData(shake_acc.SerializePartialToString()) shake_acc.Clear() ServerSocketManager.SendToConnection(sock.fileno(), taskData) try: sockread = gevent.spawn(ServerSocketRead, sock, AccServerConnection2._reconnectEvent) sockwrite = gevent.spawn(ServerSocketWrite, sock, AccServerConnection2._reconnectEvent) # AccServerConnection2._reconnectEvent.wait(300) AccServerConnection2._reconnectEvent.wait() if not sockread.ready() or not sockread.successful(): sockread.kill() if not sockwrite.ready() or not sockwrite.successful(): sockwrite.kill() finally: AccServerConnection2._sock = None ServerSocketManager.DelConnection(sock.fileno()) sock.close() Log.Write("del Server connection to %s:%s" % address)
def UpdateCurrentSession(): session = DBEngine._commonsession # Log.Write("UpdateCurrentSession", session) try: # session.flush() session.commit() session.expunge_all() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc()) session.close()
def SyncResource2Refresh(): ''' 同步前端资源版本号和非法的版本号 :return: ''' GameData.gWhiteTestResourceVersion = t_system_params.LoadParamBykey("WhiteTestResourceVersion") # 前端资源热更白名单测试功能 if GameData.gWhiteTestResourceVersion: GameData.gWhiteTestResourceVersion = int(GameData.gWhiteTestResourceVersion) Log.Write("GameData.gWhiteTestResourceVersion", GameData.gWhiteTestResourceVersion) GameData.gInvalidClientVersion = t_system_params.LoadParamBykey("InvalidClientVersion") if GameData.gInvalidClientVersion: GameData.gInvalidClientVersion = int(GameData.gInvalidClientVersion) Log.Write("GameData.gInvalidClientVersion", GameData.gInvalidClientVersion)
def MakeNewSQL(t1, t2): ''' 删除上一次的记录表 备份数据表 :param t1: :param t2: :return: ''' try: b7day_name = t2 + RepoetTimeAnalysis.Refresh7d() ExcuteSQL("drop table if exists %s;" % b7day_name) except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def RandomRoleIdFromTo(fromlv, tolv, exceptId=0): ''' 从某等级到某等级随机一个t_role.id :param fromlv: 从xxx等级 :param tolv: 到xxx等级 :param exceptId: 除去id :return: ''' Log.Write("RandomRoleIdFromTo", fromlv, tolv) with session_scope() as session: result = session.query(t_role.id).filter(and_(t_role.level >= fromlv, t_role.level <= tolv)).filter( t_role.id != exceptId).order_by(func.random()).first() if result: Log.Write(result.id) return result.id return None
def SpawTickTimer(tick, func): ''' 创建一个循环时间的定时器 :param tick: 秒数 :param func: 函数 :return: ''' timerevent = gevent.event.Event() while True: timerevent.wait(tick) try: func() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc()) DBEngine.UpdateCurrentSession() Lock1.ClearCurrent()
def LoadCriticalFromDB(self): ''' 加载重要的数据从数据库中 :return: ''' Log.Write("[NewCacheM]LoadKeyFromDB", self["__tag_online"]) if self["__tag_online"]: for key, table in UserDataPrepareMap.iteritems(): self[key] = table.LoadRoleData(self.rid) else: for (key, table) in UserDataPrepareMap.iteritems(): if key not in {"general", "equip", "soul"}: self[key] = table.LoadRoleData(self.rid) self["general"] = {} self["equip"] = {} self["soul"] = {} general_ids = [] equip_ids = [] soul_ids = [] slot = self["slot"] for i in xrange(1, 8): # 主战 gid = slot["s" + str(i)] if gid: general_ids.append(gid) for i in xrange(1, 9): # 助威 gid = slot["c" + str(i)] if gid: general_ids.append(gid) self["general"] = UserDataPrepareMap["general"].LoadInIds( general_ids) for general in self['general'].values(): if general: if general.rid == self.rid: if general.weapon: equip_ids.append(general.weapon) if general.armor: equip_ids.append(general.armor) if general.accessory: equip_ids.append(general.accessory) if general.head: equip_ids.append(general.head) if general.treasure: equip_ids.append(general.treasure) if general.horse: equip_ids.append(general.horse) for i in xrange(1, 9): # 武魂 sid = general["s" + str(i)] if sid: soul_ids.append(sid) self["equip"] = UserDataPrepareMap["equip"].LoadInIds(equip_ids) self["soul"] = UserDataPrepareMap["soul"].LoadInIds(soul_ids)
def Init(): session = DBEngine.NewSession() try: resourceVersions = session.query(t_section_resource).\ filter(t_section_resource.status == "excute").\ order_by(t_section_resource.id.desc()).all() if resourceVersions is None: Log.Write("[Error]GameResource Error: No GameResource Excute") return False appConfig = ConfigManager.Singleton() GameResourceManager._resource_dict = {} for resourceVersion in resourceVersions: version = resourceVersion.id needrestart = resourceVersion.needrestart versionFiles = session.query(t_section_resource_files).filter(t_section_resource_files.r_id == version).all() if versionFiles is None: continue versionFilesData = [] for versionFile in versionFiles: versionFileData = { "version": version, "id": versionFile.id, "url": versionFile.url, "filepath": versionFile.filepath, "platform": versionFile.platform, "length": versionFile.length, "needrestart": needrestart, "url2": versionFile.url2, "url3": versionFile.url3, } versionFilesData.append(versionFileData) GameResourceManager._resource_dict[version] = versionFilesData # Log.Write("GameResourceManager", GameResourceManager._resource_dict) return True except NoResultFound, nf: Log.Write("[Error]Database Error: %s" % str(nf)) return False
def CreateGeneral(roleid, generalcid, general, roledata): ''' 武将的出生 :param roleid: :param generalcid: :param general: :param roledata: :return: ''' general.cid = generalcid general.rid = roleid general.level1 = 1 general.level2 = 0 general.level3 = 0 general.level4 = 0 general.exp = 0 general.hp_foster = 0 general.atk_foster = 0 general.def_foster = 0 general.Init() generalConfig = general.config general.bhp = generalConfig["hp"] general.batk = generalConfig["atk"] general.bdef = generalConfig["def"] general.bspeed = generalConfig["speed"] general.bcritical = generalConfig["critical"] general.bdodge = generalConfig["dodge"] general.bparry = generalConfig["parry"] general_train = GameConfigManager.Data()["general_train"] tag = "train" + str(generalConfig["basic"]) if tag in general_train["1"]: general.potential = general_train["1"][tag] else: general.potential = 0 general.skillexp = 0 general.skilllevel = 0 # general.Init() try: general.role_obj = roledata["role"] except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def Refresh(): ''' 拼接当前的年月日时间 :return: ''' time_str_list = str(datetime.now().date()).split("-") time_str = time_str_list[0] + "_" + time_str_list[1] + "_" + time_str_list[2] Log.Write("[Report_time_str]", time_str) return time_str
def _work(): while True: try: taskData = TaskResponseQueueManager.Pop() # Log.Write("TaskResponseQueueDispath", taskData) if taskData.From() == "user": pass except Exception, e: Log.Write()
def SpawOneTimer(time, func, param): ''' 创建一个带参数的定时器 :param time: :param func: :param param: :return: ''' timerevent = gevent.event.Event() timerevent.wait(time) try: if param: func(param) else: func() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def DayHourTickProcess(): ''' 检测执行函数 整点 :return: ''' Log.Write("DayHourTickProcess") nowtime1 = datetime.now() for k, v in PerDayHourConfig.items(): # 每小时运行一次 nowhour = nowtime1.hour % 24 k = k % 24 if k == nowhour: # print("[DayHour] Hour: %d" % (k)) for func in v: try: func() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def DelGreenletSession(glet): ''' 删除携程的session :param glet: :return: ''' session = DBEngine._commonsession try: session.commit() session.expunge_all() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc()) try: session.expunge_all() except Exception, e: Log.Write(e) Log.Write(traceback.format_exc())
def CloseConnection(sockfileno): ''' 关闭用户的连接 :param sockfileno: :return: ''' Log.Write("CloseConnection", sockfileno) Lock2(UserSocketManager._lock) if UserSocketManager._dict.has_key(sockfileno): UserSocketManager._dict[sockfileno]["close"].set()
def Status(): ''' 统计在线的sock和玩家 :return: ''' Lock2(UserSocketManager._lock) c = len(UserSocketManager._dict) u = len(UserSocketManager._id) Log.Write("-status-usockcount-", c, u) t_log_connections.Now(c, u)
def _init(): configmanager = ConfigManager.Singleton() dbconfig = configmanager["Server"]["DataBase"]["DB1"] Log.Write(dbconfig) unix_socket = None if dbconfig["echo"] == "true": bEngineEcho = True else: bEngineEcho = False if "unix_socket" in dbconfig and dbconfig["unix_socket"]: unix_socket = dbconfig["unix_socket"] if unix_socket: conn_str = "mysql://%s:%s@/%s?%s" % ( dbconfig["user"], dbconfig["password"], dbconfig["db"], dbconfig["param"]) DBEngine._engine = create_engine( conn_str, echo=bEngineEcho, pool_size=100, max_overflow=100, pool_recycle=10 * 60, connect_args={'unix_socket': '%s' % (unix_socket, )}) else: conn_str = "mysql://%s:%s@%s:%s/%s?%s" % ( dbconfig["user"], dbconfig["password"], dbconfig["host"], dbconfig["port"], dbconfig["db"], dbconfig["param"]) DBEngine._engine = create_engine(conn_str, echo=bEngineEcho, pool_size=100, max_overflow=100, pool_recycle=10 * 60) Log.Write("conn_str", conn_str) # DBEngine._engine = create_engine(conn_str, echo=bEngineEcho, # pool_size=100, max_overflow=100, pool_recycle=10 * 60, connect_args={'unix_socket': '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock'}) try: DBEngine._engine.connect() except OperationalError, e: Log.Write(e) return False