|  |  |  | 
|---|
|  |  |  | # @change: "2015-01-14 00:30" hxp 增加服务器平台区服ID获取 | 
|---|
|  |  |  | # @change: "2015-01-14 20:30" hxp 增加CanHappen函数 | 
|---|
|  |  |  | # @change: "2015-06-08 20:30" hxp 增加获取channelCode | 
|---|
|  |  |  | # @change: "2015-09-24 16:00" hxp 增加IsMergeOpen | 
|---|
|  |  |  | # @change: "2015-10-22 23:00" hxp 增加获取子服serverID | 
|---|
|  |  |  | # @change: "2016-03-28 17:00" hxp 增加创角改名GetPlayerFullName | 
|---|
|  |  |  | # @change: "2016-07-18 19:00" hxp 增加获取平台账号 | 
|---|
|  |  |  | 
|---|
|  |  |  | import IpyGameDataPY | 
|---|
|  |  |  | import PyGameData | 
|---|
|  |  |  | import ReadChConfig | 
|---|
|  |  |  | import PlayerDBGSEvent | 
|---|
|  |  |  | import ConfigParser | 
|---|
|  |  |  | import GameConfig | 
|---|
|  |  |  | import ShareDefine | 
|---|
|  |  |  | 
|---|
|  |  |  | import time | 
|---|
|  |  |  | import random | 
|---|
|  |  |  | import copy | 
|---|
|  |  |  | import urllib | 
|---|
|  |  |  | #import psyco | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | GameWorldData = IPY_GameServer.IPY_GameWorld() | 
|---|
|  |  |  | 
|---|
|  |  |  | global GameWorldData | 
|---|
|  |  |  | return GameWorldData.GetBourseManager() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 竞技场管理器 | 
|---|
|  |  |  | #  @param | 
|---|
|  |  |  | #  @return HightLadderMgr | 
|---|
|  |  |  | #  @remarks 函数详细说明. | 
|---|
|  |  |  | def GetHightLadderMgr(): | 
|---|
|  |  |  | global GameWorldData | 
|---|
|  |  |  | return GameWorldData.GetHighLadderManager() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## GM工具补偿管理器 | 
|---|
|  |  |  | #  @param | 
|---|
|  |  |  | #  @return HightLadderMgr | 
|---|
|  |  |  | 
|---|
|  |  |  | return GetGameWorld().GetServerVersion() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetServerGroupID(): | 
|---|
|  |  |  | # 服务器组ID: 代表一台服务器中包含的合服、混服的各平台区服组成的一个独立游戏区服服务器环境, 用某个ID来代表此服务器 | 
|---|
|  |  |  | #            在跨服环境中,此ID就是代表来自同一台服务器子服的玩家 | 
|---|
|  |  |  | # 服务器组ID生成规则: DB平台标识对应编号 * 1000000 + DB配置的ServerID | 
|---|
|  |  |  | # ServerID支持范围: 1~999999 | 
|---|
|  |  |  | # 平台编号支持范围:1~2000 | 
|---|
|  |  |  | platform = GetPlatform() | 
|---|
|  |  |  | serverNum = GetPlatformServerNum(platform) | 
|---|
|  |  |  | if not serverNum: | 
|---|
|  |  |  | return 0 | 
|---|
|  |  |  | serverNum = max(1, min(2000, serverNum)) | 
|---|
|  |  |  | serverID = max(1, min(999999, GetServerID())) | 
|---|
|  |  |  | return serverNum * 1000000 + serverID | 
|---|
|  |  |  | ## 服务器组ID,必须唯一,代表这台物理服务器 | 
|---|
|  |  |  | return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "GroupID"), 0) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetPlatformServerNum(platform): | 
|---|
|  |  |  | # 获取服务器的平台编号 | 
|---|
|  |  |  | 
|---|
|  |  |  | def GetPlatform(): | 
|---|
|  |  |  | return ReadChConfig.GetPyMongoConfig("platform", "PlatformName") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##获得当前服务器ID | 
|---|
|  |  |  | # @param 无 | 
|---|
|  |  |  | # @return | 
|---|
|  |  |  | def GetServerID(): | 
|---|
|  |  |  | return ToIntDef(GetServerSID()[1:], 0) | 
|---|
|  |  |  | #=============================================================================== | 
|---|
|  |  |  | # ##获得当前服务器ID | 
|---|
|  |  |  | # # @param 无 | 
|---|
|  |  |  | # # @return | 
|---|
|  |  |  | # def GetServerID(): | 
|---|
|  |  |  | #    return ToIntDef(GetServerSID()[1:], 0) | 
|---|
|  |  |  | #=============================================================================== | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetServerSID(): | 
|---|
|  |  |  | ##获得当前服务器ID, 带s的 | 
|---|
|  |  |  | return ReadChConfig.GetPyMongoConfig("platform", "ServerID") | 
|---|
|  |  |  | #=============================================================================== | 
|---|
|  |  |  | # def GetServerSID(): | 
|---|
|  |  |  | #    ##获得当前服务器ID, 带s的 | 
|---|
|  |  |  | #    return ReadChConfig.GetPyMongoConfig("platform", "ServerID") | 
|---|
|  |  |  | #=============================================================================== | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Def_AccID_Split_Sign = "@" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | mainServerID = ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "%sMainServerID" % accIDPlatform), None) | 
|---|
|  |  |  | if mainServerID != None: | 
|---|
|  |  |  | return mainServerID | 
|---|
|  |  |  | return GetServerID() | 
|---|
|  |  |  | return 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #=============================================================================== | 
|---|
|  |  |  | # ƽ̨ID = appid | 
|---|
|  |  |  | # 运营ID = spid | 
|---|
|  |  |  | # 服务器账号更改 | 
|---|
|  |  |  | # 原先账号组合为 | 
|---|
|  |  |  | # 运营提供的玩家账号ID + 平台ID + 区服组成 | 
|---|
|  |  |  | # | 
|---|
|  |  |  | # 因为IOS和安卓在支持混服的情况下,还要能支持同一个角色号,故引入一个新的运营ID(客户端打包配置),以保证玩家账号为同一个 | 
|---|
|  |  |  | # 账号组合变更 | 
|---|
|  |  |  | # 运营提供的玩家账号ID + 运营ID + 区服组成 | 
|---|
|  |  |  | # | 
|---|
|  |  |  | # 原游戏中获取平台ID接口变更 | 
|---|
|  |  |  | # 1. db 从数据库中的账号表获取AppID | 
|---|
|  |  |  | # 2. GameServer和MapServer 接口改为GetOperator 参考 GetPlayerPlatform | 
|---|
|  |  |  | #=============================================================================== | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##获取玩家所属平台 | 
|---|
|  |  |  | def GetPlayerPlatform(gameAccID): | 
|---|
|  |  |  | infoList = gameAccID.split(Def_AccID_Split_Sign) | 
|---|
|  |  |  | return "" if len(infoList) < 3 else infoList[-2] | 
|---|
|  |  |  | def GetPlayerPlatform(curPlayer): | 
|---|
|  |  |  | return curPlayer.GetAccountInfo().GetOperator() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##获取平台账号 | 
|---|
|  |  |  | def GetPlatformAccID(gameAccID): | 
|---|
|  |  |  | 
|---|
|  |  |  | return tagPlayer.GetRealMapID() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetOperationActionDateStr(dateInfo, openServerDay): | 
|---|
|  |  |  | '''获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期 | 
|---|
|  |  |  | @param dateInfo: 运营活动表配置的日期信息, 如果是纯数字代表开服天 | 
|---|
|  |  |  | @param openServerDay: 当前开服天 | 
|---|
|  |  |  | ''' | 
|---|
|  |  |  | if dateInfo.startswith("Mix"): | 
|---|
|  |  |  | diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 | 
|---|
|  |  |  | actionServerDay = int(dateInfo[3:]) | 
|---|
|  |  |  | elif not dateInfo.isdigit(): | 
|---|
|  |  |  | return dateInfo | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | diffDay = openServerDay | 
|---|
|  |  |  | actionServerDay = int(dateInfo) | 
|---|
|  |  |  | curDateTime = datetime.datetime.today() | 
|---|
|  |  |  | actionDateTime = curDateTime + datetime.timedelta(days=(actionServerDay-diffDay)) | 
|---|
|  |  |  | return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##获得系统时间 | 
|---|
|  |  |  | # @param 无意义 | 
|---|
|  |  |  | # @return 系统时间 | 
|---|
|  |  |  | 
|---|
|  |  |  | def GetDatetimeBySubDays(diffDays): | 
|---|
|  |  |  | return datetime.datetime.today() - datetime.timedelta(days = diffDays) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def IsCrossServer(): | 
|---|
|  |  |  | ## 是否跨服服务器 | 
|---|
|  |  |  | return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 是否跨服服务器 | 
|---|
|  |  |  | #  @param None None | 
|---|
|  |  |  | #  @return | 
|---|
|  |  |  | def IsMergeServer(): | 
|---|
|  |  |  | config = GameConfig.GetConfig() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return config.get('IsMergeWarServe', 0) | 
|---|
|  |  |  | def IsCrossRealmOpen(): | 
|---|
|  |  |  | ## 是否开启跨服活动 | 
|---|
|  |  |  | return ReadChConfig.GetPyMongoConfig("Merge", "MergeServerIP") or IsCrossServer() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 是否开启跨服活动 | 
|---|
|  |  |  | #  @param None None | 
|---|
|  |  |  | #  @return | 
|---|
|  |  |  | def IsMergeOpen(): | 
|---|
|  |  |  | config = GameConfig.GetConfig() | 
|---|
|  |  |  | # 如果跨服服务器IP有配置, 或本身就是跨服服务器, 则代表开启 | 
|---|
|  |  |  | return True if (config.get('MergeServerIP') or config.get('IsMergeWarServe')) else False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetCrossZoneName(): | 
|---|
|  |  |  | ## 跨服服务器分区名,标记一起跨服分区的名字,配置在跨服服务器,子服不用配置,由跨服服务器同步 | 
|---|
|  |  |  | if IsCrossServer(): | 
|---|
|  |  |  | return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName") | 
|---|
|  |  |  | return PyGameData.g_crossZoneName | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 获取玩家的区服名,仅在跨服有效 | 
|---|
|  |  |  | #  @param curPlayer 玩家实例 | 
|---|
|  |  |  | 
|---|
|  |  |  | except: | 
|---|
|  |  |  | return inputText | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return inputText | 
|---|
|  |  |  | return inputText | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 向运维发送邮件,用于需要紧急处理的信息 | 
|---|
|  |  |  | # 此处不包含服务器报错的汇报 | 
|---|
|  |  |  | def SendGameStateMail(msgInfo): | 
|---|
|  |  |  | # 使用方式 向OpenStateUrl 发送Type为GameWarning,那么就会收到一封游戏内容警告邮件,信息为MsgInfo | 
|---|
|  |  |  | getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") | 
|---|
|  |  |  | groupID = ReadChConfig.GetPyMongoConfig("platform", "GroupID") | 
|---|
|  |  |  | userDBName = ReadChConfig.GetPyMongoConfig("connect", "USER_DB_NAME") | 
|---|
|  |  |  | getUrl = getUrl + "?Type=GameWarning&groupID=%s&userDBName=%s&MsgInfo=%s"%(groupID, userDBName, urllib.quote_plus(msgInfo)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl) | 
|---|
|  |  |  |  | 
|---|