| | |
| | | killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 1, {})
|
| | | canRebornBossIDList = []
|
| | | for bidlist, bkey in killBossCntLimitDict.items():
|
| | | if bkey not in [0, 1]:
|
| | | if bkey not in [ShareDefine.Def_Boss_Func_World, ShareDefine.Def_Boss_Func_Home]:
|
| | | continue
|
| | | canRebornBossIDList += list(bidlist)
|
| | |
|
| | |
| | | #GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay)
|
| | | #清理过期补偿
|
| | | PlayerCompensation.ClearUpTimeOutCompensation()
|
| | | PlayerGeTui.ClearFMTGeTuiLimit()
|
| | | import PlayerBourse
|
| | | PlayerBourse.OverTimeItemsDeal()
|
| | | return
|
| | |
| | | import PlayerControl
|
| | | import PyDataManager
|
| | | import time
|
| | |
|
| | | import json
|
| | | # VIP权限
|
| | | Def_Onoff_VIPCount = 5
|
| | | (
|
| | |
| | |
|
| | | # 新玩家还没有脱机时间 有利于挽回流失玩家
|
| | | g_NewGuyNoTJGTime = {} # {playerID:[playername,getuiid, tick]}
|
| | |
|
| | | g_FMTGeTuiLimit = {} # 封魔坛推送限制 过于频繁控制下短时间通知
|
| | |
|
| | | def ClearFMTGeTuiLimit():
|
| | | global g_FMTGeTuiLimit
|
| | | g_FMTGeTuiLimit = {}
|
| | |
|
| | |
|
| | |
|
| | | def GetTimeLimit(timeStr):
|
| | | # 检查格式后转数字
|
| | |
| | | # 服务端群推暂不由游戏服务器推送,可从第三方个推网站推送
|
| | | # 游戏服务器只推送具有变化性的内容
|
| | | # 支持单推和多人推送
|
| | | # getuiIDList 玩家个推ID
|
| | | # playerNameList 如果存在则必须与getuiIDList一一对应,若不存在则是多推,若存在则会一一单推
|
| | | # appIDDict 混服使用对应不同key {平台ID:[[玩家个推ID, 玩家名],[玩家个推ID2, 玩家名2]。。。]}
|
| | | # 如果玩家名存在则必须与个推ID一一对应,若不存在则是多推,若存在则会一一单推
|
| | | # 带名字会被组合成 格式如【玩家名】您关注的BOSSxx已复活
|
| | | # EventReport_EventReport 向游戏服务器的个推小程序发送 webbottle
|
| | | def GeTuiNotify(getuiIDList, playerNameList, notifyMsg):
|
| | | if type(getuiIDList) != list:
|
| | | def GeTuiNotify(appIDDict, notifyMsg):
|
| | | if not appIDDict:
|
| | | return
|
| | | osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName")
|
| | | #osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName") 混服无法配置系统
|
| | | geTuiUrl = ReadChConfig.GetPyMongoConfig("GeTui", "GeTuiUrl")
|
| | |
|
| | | playerNames = "|".join(playerNameList) #组合成字符串发送
|
| | | getuiIDs = "|".join(getuiIDList)
|
| | | |
| | | playerInfo = json.dumps(appIDDict, ensure_ascii=False)
|
| | | #含中文部分要urlencode
|
| | | postInfo = urllib.urlencode({"PlayerName": playerNames, "NotifyMsg":notifyMsg, |
| | | "RegID":getuiIDs, "OSName":osName})
|
| | | postInfo = urllib.urlencode({"PlayerInfo": playerInfo, "NotifyMsg":notifyMsg})
|
| | |
|
| | | GameWorld.GetGameWorld().EventReport_EventReport(postInfo, "", "", "", 1, geTuiUrl)
|
| | | return
|
| | |
| | | return
|
| | |
|
| | |
|
| | |
|
| | |
|
| | | # 判断BOSS剩余次数, 避免通知频繁
|
| | | # 注意玩家次数用完第二天未上线则不会同步BOSS次数,则不推送
|
| | | def CheckBossGeTuiCnt(playerID, bossID, geTuiType, cacheDict):
|
| | | global g_FMTGeTuiLimit
|
| | | |
| | | if geTuiType == Def_GeTui_FMT:
|
| | | if not cacheDict.get("CntMark_%s"%ChConfig.Def_FBMapID_SealDemon, 0):
|
| | | return False
|
| | | |
| | | # 封魔坛比较频繁默认1小时通知一次
|
| | | if playerID not in g_FMTGeTuiLimit:
|
| | | g_FMTGeTuiLimit[playerID] = {}
|
| | | |
| | | lastTime = g_FMTGeTuiLimit[playerID].get(bossID, 0)
|
| | | if lastTime != 0 and time.time() - lastTime < 3600:
|
| | | # 离上次通知还没超过1小时
|
| | | return False
|
| | | |
| | | g_FMTGeTuiLimit[playerID][bossID] = int(time.time())
|
| | | |
| | | |
| | | elif geTuiType == Def_Onoff_Boss:
|
| | | #重生boss
|
| | | killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 1, {})
|
| | | for bidlist, bkey in killBossCntLimitDict.items():
|
| | | if bossID not in bidlist:
|
| | | continue
|
| | | if not cacheDict.get("CntMark_%s"%bkey, 0):
|
| | | return False
|
| | | else:
|
| | | return True
|
| | | return True
|
| | | |
| | | def BossAttentionGeTui(bossData, bossID):
|
| | | if bossData.GetMapID() == ChConfig.Def_FBMapID_SealDemon:
|
| | | # 非VIP玩家 封魔坛个推
|
| | |
| | | #找到关注这只BOSS的玩家
|
| | | pdict = PyDataManager.GetBossAttentionManager().GetBossAttentionDict()
|
| | |
|
| | | geTuiIDList = []
|
| | | playerNameList = []
|
| | | |
| | | appIDDict = {} # 混服需要推到不同的个推应用
|
| | | for playerID, bossAttentionData in pdict.items():
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
| | | if curPlayer and not PlayerControl.GetIsTJG(curPlayer):
|
| | |
| | |
|
| | | recordDict = eval(bossAttentionData.RecordData)
|
| | | if recordDict.get(bossID, 0) in [0, 9]:
|
| | | #0-默认未关注, 1-主动关注, 2-自动关注, 9-主动取消关注
|
| | | continue
|
| | | curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
|
| | | if not curCache:
|
| | |
| | | # 过滤个推
|
| | | continue
|
| | |
|
| | | geTuiIDList.append(cacheDict.get("GeTuiClientID", ""))
|
| | | playerNameList.append(cacheDict.get("Name", ""))
|
| | | |
| | | if not CheckBossGeTuiCnt(playerID, bossID, geTuiType, cacheDict):
|
| | | # 判断BOSS剩余次数, 避免通知频繁
|
| | | continue
|
| | | |
| | | appID = GameWorld.GetPlayerPlatform(cacheDict.get("AccID", ""))
|
| | | if appID not in appIDDict:
|
| | | appIDDict[appID] = []
|
| | | |
| | | appIDDict[appID].append([cacheDict.get("GeTuiClientID", ""), cacheDict.get("Name", "")])
|
| | | |
| | |
|
| | | if not geTuiIDList:
|
| | | if not appIDDict:
|
| | | return
|
| | |
|
| | | npcName = GameWorld.GetNPCData(bossID).GetNPCName()
|
| | |
| | | elif geTuiType == Def_Onoff_Boss:
|
| | | showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 2)%(bossData.GetSourceName(), npcName, npcLV)) # 文字信息
|
| | |
|
| | | GeTuiNotify(geTuiIDList, playerNameList, showStr)
|
| | | GeTuiNotify(appIDDict, showStr)
|
| | |
|
| | |
|
| | | # 私聊
|
| | |
| | | return
|
| | |
|
| | | showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 3))%(tagPlayerName) # 文字信息
|
| | | GeTuiNotify([cacheDict.get("GeTuiClientID", "")], [playerName], showStr)
|
| | | GeTuiNotify({GameWorld.GetPlayerPlatform(cacheDict.get("AccID", "")):[[cacheDict.get("GeTuiClientID", ""), playerName]]}, showStr)
|
| | | return
|
| | |
|
| | | # 下线时,低级玩家没有离线时间的玩家提示, 上线清空
|
| | |
| | | if curPlayer.GetLV() > 100:
|
| | | return
|
| | | playerID = curPlayer.GetID()
|
| | | g_NewGuyNoTJGTime[playerID] = [curPlayer.GetName(), curPlayer.GetGeTuiClientID(), tick] # curPlayer.GetGeTuiClientID()
|
| | | g_NewGuyNoTJGTime[playerID] = [curPlayer.GetName(), curPlayer.GetGeTuiClientID(), tick, |
| | | GameWorld.GetPlayerPlatform(curPlayer.GetAccID())] # curPlayer.GetGeTuiClientID()
|
| | | return
|
| | |
|
| | | # 上线清除
|
| | |
| | | global g_NewGuyNoTJGTime
|
| | |
|
| | | playerIDList = []
|
| | | geTuiIDs = []
|
| | | playerNames = []
|
| | | appIDDict = {}
|
| | | |
| | | for playerID, getuiInfo in g_NewGuyNoTJGTime.items():
|
| | | if tick - getuiInfo[2] < 300000:
|
| | | continue
|
| | | playerIDList.append(playerID)
|
| | |
|
| | | geTuiIDs.append(getuiInfo[1])
|
| | | playerNames.append(getuiInfo[0])
|
| | | appID = getuiInfo[3]
|
| | | if appID not in appIDDict:
|
| | | appIDDict[appID] = []
|
| | | |
| | | appIDDict[appID].append([getuiInfo[1],getuiInfo[0]])
|
| | |
|
| | | if not geTuiIDs:
|
| | | |
| | | if not appIDDict:
|
| | | return
|
| | | showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 4)) # 文字信息
|
| | | GeTuiNotify(geTuiIDs, playerNames, showStr)
|
| | | GeTuiNotify(appIDDict, showStr)
|
| | |
|
| | | for playerID in playerIDList:
|
| | | CleanNewGuyCallBackGeTui(playerID)
|
| | |
| | | FamilyActive_War, #仙盟联赛
|
| | | FamilyActive_HelpDujie, #同盟护法
|
| | | FamilyActive_SWRH, #守卫人皇
|
| | | ) = range(1,6+1) |
| | | ) = range(1,6+1)
|
| | |
|
| | |
|
| | | # BOSS 功能标识区分 对应KillBossCntLimit,主要根据击杀类型不同区分
|
| | | (
|
| | | Def_Boss_Func_World, # 世界BOSS
|
| | | Def_Boss_Func_Home, # BOSS之家
|
| | | Def_Boss_Func_Dogz, # 神兽功能BOSS
|
| | | ) = range(3)
|
| | |
|
| | |
| | | import ItemControler
|
| | | import ChConfig
|
| | | import FBLogic
|
| | | import PlayerVip
|
| | |
|
| | | import operator
|
| | | import json
|
| | |
| | | NetPackCommon.SendFakePack(curPlayer, packdata)
|
| | | return
|
| | |
|
| | |
|
| | | # BOSS剩余可击杀次数
|
| | | def GetCanKillBossCnt(curPlayer, bossFuncIndex):
|
| | | hasKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%bossFuncIndex, 0)
|
| | | itemAddKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%bossFuncIndex, 0)
|
| | | killLimitPrivilege = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 4, {}).get(bossFuncIndex, 0)
|
| | | if killLimitPrivilege:
|
| | | limitCnt = PlayerVip.GetPrivilegeValue(curPlayer, killLimitPrivilege)
|
| | | else:
|
| | | limitCnt = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {}).get(bossFuncIndex, 0)
|
| | | |
| | | |
| | | return max(limitCnt + itemAddKillCnt - hasKillCnt, 0)
|
| | |
|
| | |
|
| | |
| | | import PlayerViewCacheTube
|
| | | import urllib
|
| | | import PlayerVip
|
| | | import json
|
| | | #===============================================================================
|
| | | # //B2 05 推送提醒设置 tagCMPushNotificationsSetting
|
| | | #
|
| | |
| | | # 服务端群推暂不由游戏服务器推送,可从第三方个推网站推送
|
| | | # 游戏服务器只推送具有变化性的内容
|
| | | # 支持单推和多人推送
|
| | | # getuiIDList 玩家个推ID
|
| | | # playerNameList 如果存在则必须与getuiIDList一一对应,若不存在则是多推,若存在则会一一单推
|
| | | # appIDDict 混服使用对应不同key {平台ID:[[玩家个推ID, 玩家名],[玩家个推ID2, 玩家名2]。。。]}
|
| | | # 如果玩家名存在则必须与个推ID一一对应,若不存在则是多推,若存在则会一一单推
|
| | | # 带名字会被组合成 格式如【玩家名】您关注的BOSSxx已复活
|
| | | # EventReport_EventReport 向游戏服务器的个推小程序发送 webbottle
|
| | | def GeTuiNotify(getuiIDList, playerNameList, notifyMsg):
|
| | | if type(getuiIDList) != list:
|
| | | def GeTuiNotify(appIDDict, notifyMsg):
|
| | | if not appIDDict:
|
| | | return
|
| | |
|
| | | osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName")
|
| | | #osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName") 混服无法配置系统
|
| | | geTuiUrl = ReadChConfig.GetPyMongoConfig("GeTui", "GeTuiUrl")
|
| | |
|
| | | playerNames = "|".join(playerNameList) #组合成字符串发送
|
| | | getuiIDs = "|".join(getuiIDList)
|
| | | |
| | | playerInfo = json.dumps(appIDDict, ensure_ascii=False)
|
| | | #含中文部分要urlencode
|
| | | postInfo = urllib.urlencode({"PlayerName": playerNames, "NotifyMsg":notifyMsg, |
| | | "RegID":getuiIDs, "OSName":osName})
|
| | | postInfo = urllib.urlencode({"PlayerInfo": playerInfo, "NotifyMsg":notifyMsg})
|
| | |
|
| | |
|
| | | GameWorld.GetGameWorld().EventReport_EventReport(postInfo, "", "", "", 1, geTuiUrl)
|
| | | return
|
| | |
|
| | |
|
| | | # 时间不足
|
| | | def TJGTimeLess(curPlayer):
|
| | |
| | | return
|
| | |
|
| | | showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 4)) # 文字信息
|
| | | |
| | | GeTuiNotify([GetGeTuiClientID(curPlayer)], [curPlayer.GetName()], showStr)
|
| | | GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer.GetAccID()) :[[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, showStr)
|
| | | return
|
| | |
|
| | |
|
| | |
| | |
|
| | | tjgTime = PlayerTJG.GetTJGTime(curPlayer)
|
| | |
|
| | | GeTuiNotify([GetGeTuiClientID(curPlayer)], [curPlayer.GetName()], |
| | | GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer.GetAccID()) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, |
| | | GameWorld.GbkToCode(showStr%(expStr, tjgTime/60/60, tjgTime/60%60)))
|
| | | return
|
| | |
|
| | |
| | | showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 2)) # 文字信息
|
| | | tjgTime = PlayerTJG.GetTJGTime(curPlayer)
|
| | |
|
| | | GeTuiNotify([GetGeTuiClientID(curPlayer)], [curPlayer.GetName()], |
| | | GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer.GetAccID()) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, |
| | | showStr%(tagName, tjgTime/60/60, tjgTime/60%60))
|
| | | return
|
| | |
|
| | |
| | | return
|
| | |
|
| | | showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 3)) # 文字信息
|
| | | GeTuiNotify([GetGeTuiClientID(curPlayer)], [curPlayer.GetName()], showStr)
|
| | | GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer.GetAccID()) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, showStr)
|
| | |
|
| | |
|
| | |
|
| | |
| | | return
|
| | |
|
| | |
|
| | | def TJGGM(curPlayer, times):
|
| | | # 真实上线
|
| | | npcID = FindTJGNPC(curPlayer)
|
| | | if not npcID:
|
| | | return
|
| | | |
| | | # 此时由服务端重新找一次挂机NPC
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_TJGNPC, npcID)
|
| | |
|
| | | GameWorld.DebugAnswer(curPlayer, "GM模拟脱机产出,npcid:%s, 时间秒:%s, 经验倍率:%s"%(
|
| | | curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_TJGNPC), times,
|
| | | curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TotalExpRate)))
|
| | | |
| | | |
| | | # 设置脱机登录时的等级, 上线通知清空, 没清空说明多次脱机挂登录 使用旧等级
|
| | | notifyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_LV, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | if not notifyLV:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDictType_TJGNotify_LV, curPlayer.GetLV(), ChConfig.Def_PDictType_TJGNotify)
|
| | | |
| | | |
| | | # 记录秒单位
|
| | | NoteTJGTime(curPlayer, times)
|
| | | OnTJGKillNPCByTimes(curPlayer, times)
|
| | |
|
| | | sendPack = ChPyNetSendPack.tagMCTJGInfo()
|
| | | sendPack.Clear()
|
| | | sendPack.Exp1 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_Exp1, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.Exp2 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_Exp2, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.Times = times
|
| | | sendPack.PurpleEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_Purple, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.OrangeEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_Orange, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.EatPurpleEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_EatPurple, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.GiveCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_GiveCnt, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.BeforeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_LV, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | sendPack.Items = []
|
| | | itemIDList = IpyGameDataPY.GetFuncEvalCfg('OfflinePostItem', 1)
|
| | | for itemID in itemIDList:
|
| | | count = curPlayer.NomalDictGetProperty(ChConfig.Def_PDictType_TJGNotify_ItemID%itemID, 0, ChConfig.Def_PDictType_TJGNotify)
|
| | | if count == 0:
|
| | | continue
|
| | | itemInfo = ChPyNetSendPack.tagMCTJGItems()
|
| | | itemInfo.ItemID = itemID
|
| | | itemInfo.Count = count
|
| | | sendPack.Items.append(itemInfo)
|
| | | sendPack.Cnt = len(sendPack.Items)
|
| | | |
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | |
| | | curPlayer.ClearNomalDict(ChConfig.Def_PDictType_TJGNotify)
|
| | |
|
| | |
|
| | |
|
| | | # 上线检查脱机时间是否正常运行, 弥补对应缺失时间,如维护2小时缺失的脱机挂收益
|
| | | # 1. 非脱机死亡,2.存在脱机时间,3.离线时间超过5分钟;则一次补齐 离线时间-5分钟的收益并减少脱机时间
|
| | | # 按当前经验倍率计算,且不会减buff时间
|
| | |
| | | import ItemControler
|
| | | import IpyGameDataPY
|
| | | import ChEquip
|
| | | import FBCommon
|
| | | import BossHurtMng
|
| | |
|
| | | import time
|
| | | import json
|
| | |
|
| | |
| | | #-----------
|
| | | #玩家属性缓存
|
| | | curPlayerPropDict = {}
|
| | | curPlayerPropDict["AccID"] = curPlayer.GetAccID()
|
| | | curPlayerPropDict["LV"] = curPlayer.GetLV()
|
| | | curPlayerPropDict["RealmLV"] = curPlayer.GetOfficialRank()
|
| | | curPlayerPropDict["Job"] = curPlayer.GetJob()
|
| | |
| | | curPlayerPropDict['GeTuiClientID'] = curPlayer.GetAccountData().GetGeTuiClientID()
|
| | | curPlayerPropDict['Time'] = int(time.time()) # 最后一次发送即当做离线时间
|
| | |
|
| | | # 各类功能 BOSS次数, BOSS相关对应B.Boss信息.xlsx的CntMark
|
| | | # 封魔坛剩余次数
|
| | | enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_SealDemon)
|
| | | maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_SealDemon)
|
| | | curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_SealDemon] = max(maxCnt - enterCnt, 0)
|
| | | # 世界BOSS剩余次数
|
| | | curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_World] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_World)
|
| | | # BOSS之家剩余次数
|
| | | curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_Home] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_Home)
|
| | | # 神兽BOSS剩余次数
|
| | | curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_Dogz] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_Dogz)
|
| | |
|
| | | #-----------
|
| | | #装备数据打包缓存
|
| | | curEquipItemList = __GetPackEquipCacheList(curPlayer, IPY_GameWorld.rptEquip)
|
| | |
| | | FamilyActive_War, #仙盟联赛
|
| | | FamilyActive_HelpDujie, #同盟护法
|
| | | FamilyActive_SWRH, #守卫人皇
|
| | | ) = range(1,6+1) |
| | | ) = range(1,6+1)
|
| | |
|
| | |
|
| | | # BOSS 功能标识区分 对应KillBossCntLimit,主要根据击杀类型不同区分
|
| | | (
|
| | | Def_Boss_Func_World, # 世界BOSS
|
| | | Def_Boss_Func_Home, # BOSS之家
|
| | | Def_Boss_Func_Dogz, # 神兽功能BOSS
|
| | | ) = range(3)
|
| | |
|
New file |
| | |
| | | [GeTuiConfig]
|
| | | # 一个自由APPID对应一对app_key和master_secret为极光推送应用生成
|
| | | app_key_822055139 = 1c060648058afe0b5faf72ca
|
| | | master_secret_822055139 = 568ae9f1a2a7650220af3921
|
| | |
|
| | | app_key_828115704 = 1c060648058afe0b5faf72ca
|
| | | master_secret_828115704 = 568ae9f1a2a7650220af3921
|
| | |
|
| | |
|
| | |
|
| | | # 通知格式 【玩家名】信息
|
| | | NotifyFormat = 【%s】%s
|
| | |
|
| | | # Def_NoName为名字缺失时默认的显示
|
| | | Def_NoName = 亲 |
| | |
| | | import logging
|
| | |
|
| | | class AppConfig():
|
| | | def __init__(self, filePath):
|
| | | def __init__(self, filePath, sectionName):
|
| | | self.config = ConfigParser.ConfigParser()
|
| | | self.config.read(filePath)
|
| | | self.sectionName = sectionName
|
| | |
|
| | | def SetSection(self, sectionName ):
|
| | | def SetSection(self, sectionName):
|
| | | self.sectionName = sectionName
|
| | |
|
| | | def GetValue(self, key):
|
| | | return self.config.get(self.sectionName,key) |
| | | return self.config.get(self.sectionName, key) |
| | |
|
| | | def GetIntValue(self, key):
|
| | | return self.config.getint(self.sectionName,key) |
| | | return self.config.getint(self.sectionName, key) |
| | |
|
| | | class GameConfig():
|
| | | def __init__(self, filePath):
|
| | | config = AppConfig( filePath )
|
| | | logging.debug( "Config file:%s", filePath )
|
| | | config.SetSection( "ServerConfig" )
|
| | | self.ip = config.GetValue( "IP" )
|
| | | self.port = config.GetIntValue( "Port" )
|
| | | |
| | | config.SetSection( "VersionConfig" )
|
| | | self.ClientVersion = config.GetValue( "ClientVersion" )
|
| | | self.VersionNO = config.GetIntValue( "VERSION_NO" )
|
| | | self.StartCnt = config.GetIntValue( "PACK_START_COUNT" )
|
| | | self.KeyName = config.GetValue( "Key" )
|
| | | keylen = len(self.KeyName)-1
|
| | | self.KeyName = self.KeyName[1:keylen]
|
| | | self.SendKeyDictPath = config.GetValue( "SendKeyDictFile" )
|
| | | |
| | | config.SetSection( "MapDataConfig" )
|
| | | self.MapFilePath = config.GetValue( "MapFilePath" )
|
| | | self.MapPostFix = config.GetValue( "MapPostFix" )
|
| | | |
| | | |
| | | config.SetSection( "ThreadNumberControl" )
|
| | | self.IOThreadNum = config.GetIntValue( "IOWorkerThreadNum" )
|
| | | self.AIThreadNum = config.GetIntValue( "AIWorkerThreadNum" )
|
| | | |
| | | config.SetSection( "RunningParams" )
|
| | | self.UsePsyco = config.GetIntValue( "UsePsyco" )
|
| | | self.AISleepPeriod = config.GetIntValue( "AISleepPeriod" )
|
| | | self.PlayerOffTime = config.GetIntValue( "PlayerOffTime")
|
| | | self.ProcessFindTJGTime = config.GetIntValue( "ProcessFindTJGTime")
|
| | | self.ServerDBConfigPath = config.GetValue( "ServerDBConfigPath")
|
| | | self.StartRunTime = config.GetIntValue( "StartRunTime")
|
| | | |
| | | def GetIOThreadNum(self):
|
| | | return self.IOThreadNum
|
| | | |
| | | def GetAIThreadNum(self):
|
| | | return self.AIThreadNum
|
| | | |
| | | def GetServerIP(self):
|
| | | return self.ip
|
| | | |
| | | def GetServerPort(self):
|
| | | return self.port
|
| | | |
| | | def GetClientVersion(self):
|
| | | return self.ClientVersion
|
| | | |
| | | def GetVersionNo(self):
|
| | | return self.VersionNO
|
| | | |
| | | def GetPackStartCount(self):
|
| | | return self.StartCnt
|
| | | |
| | | def GetKeyString(self):
|
| | | return self.KeyName
|
| | | |
| | | def GetSendKeyDictFilePath(self):
|
| | | return self.SendKeyDictPath
|
| | | |
| | | def GetMapFilePath(self):
|
| | | return self.MapFilePath
|
| | | |
| | | def GetMapFilePostFix(self):
|
| | | return self.MapPostFix
|
| | | |
| | | def GetUsePsyco(self):
|
| | | return self.UsePsyco
|
| | | |
| | | def GetAISleepPeriod(self):
|
| | | return self.AISleepPeriod
|
| | | |
| | | # 玩家下线时长
|
| | | def GetPlayerOffTime(self):
|
| | | return self.PlayerOffTime
|
| | | |
| | | # 从数据库查询脱机挂玩家的间隔
|
| | | def GetProcessFindTJGTime(self):
|
| | | return self.ProcessFindTJGTime
|
| | |
|
| | | def GetServerDBConfigPath(self):
|
| | | return self.ServerDBConfigPath
|
| | |
|
| | | def GetStartRunTime(self):
|
| | | return self.StartRunTime
|
| | | |
| | | def __str__(self):
|
| | | return "ClientVersion:[%s]\n" \
|
| | | "KeyString:[%s]\n" \
|
| | | "MapFilePath:[%s]\n" \
|
| | | "MapFilePostFix:[%s]\n" \
|
| | | "PackStartCount:[%u]\n" \
|
| | | "SendKeyDictFile:[%s]\n" \
|
| | | "ServerIP:[%s]\n" \
|
| | | "ServerPort:[%u]\n" \
|
| | | "VersionNO:[%u]\n" \
|
| | | "IOThreadNum:[%u]\n" \
|
| | | "AIThreadNum:[%u]\n" \
|
| | | "UsePsyco:[%u]\n" \
|
| | | "AISleepPeriod:[%u]\n" \
|
| | | % \
|
| | | ( \
|
| | | self.GetClientVersion(),\
|
| | | self.GetKeyString(), \
|
| | | self.GetMapFilePath(), \
|
| | | self.GetMapFilePostFix(), \
|
| | | self.GetPackStartCount(), \
|
| | | self.GetSendKeyDictFilePath(), \
|
| | | self.GetServerIP(), \
|
| | | self.GetServerPort(), \
|
| | | self.GetVersionNo(), \
|
| | | self.GetIOThreadNum(), \
|
| | | self.GetAIThreadNum(), \
|
| | | self.GetUsePsyco(), \
|
| | | self.GetAISleepPeriod(), \
|
| | | )
|
| | | |
| | | __gGameConfig = None
|
| | |
|
| | | def ReadConfig( filename ):
|
| | | global __gGameConfig
|
| | | if not __gGameConfig:
|
| | | __gGameConfig = GameConfig( filename )
|
| | | |
| | |
|
| | |
|
| | | def GetConfig():
|
| | | global __gGameConfig
|
| | | if not __gGameConfig:
|
| | | FilePath = ".\Config.ini"
|
| | | SectionName = "GeTuiConfig"
|
| | | __gGameConfig = AppConfig (FilePath, SectionName)
|
| | | return __gGameConfig
|
| | |
|
| | | if __name__ == '__main__':
|
| | | FilePath = "..\Configuration\Config.ini" |
| | | SectionName = "GameConfig"
|
| | |
|
| | | ReadConfig( FilePath )
|
| | | config = GetConfig()
|
| | | print config
|
| | |
| | | import jpush
|
| | | import requests
|
| | | import urllib
|
| | | from lib import ConfigIniReader
|
| | | import json
|
| | |
|
| | | app_key = u'22186239fee975f883198cf4'
|
| | | master_secret = u'cb2b72ba143a3f3fb13a6f45'
|
| | | #app_key = u'22186239fee975f883198cf4'
|
| | | #master_secret = u'cb2b72ba143a3f3fb13a6f45'
|
| | |
|
| | | _jpush = jpush.JPush(app_key, master_secret)
|
| | | #_jpush = jpush.JPush(app_key, master_secret)
|
| | | #_jpush.set_logging("DEBUG")
|
| | |
|
| | | requests.packages.urllib3.disable_warnings()
|
| | |
| | | myapp = Bottle()
|
| | |
|
| | | Def_Split_Mark = "|"
|
| | | Def_NoName = "亲"
|
| | | NotifyFormat = "【%s】%s" # 通知格式 【玩家名】信息
|
| | |
|
| | | # 文本格式GBK取出出来转unicode,服务器发过来也是unicode 推送统一unicode
|
| | | Def_NoName = ConfigIniReader.GetConfig().GetValue('Def_NoName').decode("gbk")
|
| | | NotifyFormat = ConfigIniReader.GetConfig().GetValue('NotifyFormat').decode("gbk")
|
| | |
|
| | |
|
| | | # 推送消息
|
| | | # ?RegID=111141|1414|2141&PlayerName=熟练度空间|圣诞快乐|sjlkd&OSName=ios&NotifyMsg=BOSS复活
|
| | |
|
| | | # 混服使用对应不同key {平台ID:[[玩家个推ID, 玩家名],[玩家个推ID2, 玩家名2]。。。]}
|
| | | # {u'822055139': [[u'160a3797c8504368d60', u'\u76f8\u601d\u59ff\u6653']]}-1234567
|
| | |
|
| | | @myapp.route('/getui/index.php', method='POST')
|
| | | def JGGeTui():
|
| | | getDict = request.POST
|
| | | notifyMsg = urllib.unquote(getDict.get("NotifyMsg",""))
|
| | | logging.info("%s-%s-%s"%(getDict.get("RegID",""), getDict.get("PlayerName",""), notifyMsg))
|
| | | if not getDict.get("RegID",""):
|
| | | notifyMsg = urllib.unquote(getDict.get("NotifyMsg","")).decode("utf8")
|
| | | playerDict = json.loads(urllib.unquote_plus(getDict.get("PlayerInfo", "")))
|
| | | |
| | | logging.info("%s-%s"%(playerDict, notifyMsg))
|
| | | if not playerDict:
|
| | | # 只能单\多推,不能全部推
|
| | | return
|
| | |
|
| | | regIDs = getDict.get("RegID","").split(Def_Split_Mark)
|
| | | playrNames = getDict.get("PlayerName","")
|
| | | osName = getDict.get("OSName","")
|
| | | if not osName or osName == jpush.all_:
|
| | | osName = jpush.all_
|
| | | else:
|
| | | osName = getDict.get("OSName","").split(Def_Split_Mark)
|
| | | osName = jpush.all_
|
| | |
|
| | | |
| | | #logging.info("%s-%s-%s"%(getDict.get("RegID",""), playrNames, notifyMsg))
|
| | | #return "账号:" + getDict.get("AccountID",""), "充值", getDict.get("money","")
|
| | |
|
| | | if not playrNames:
|
| | | PushOne(regIDs, notifyMsg, osName)
|
| | | else:
|
| | | # 不支持notifymsg内容不一样的多推,只能一一对应推送
|
| | | playrNames = playrNames.split(Def_Split_Mark)
|
| | | index = 0
|
| | | for regID in regIDs:
|
| | | playerName = playrNames[index] if index < len(playrNames) else Def_NoName
|
| | | playerName = urllib.unquote(playerName)
|
| | | geTuiMsg = NotifyFormat%(playerName, notifyMsg)
|
| | | #logging.info("PushOne%s-%s-%s"%([regID], geTuiMsg, osName))
|
| | | PushOne([regID], geTuiMsg, osName)
|
| | | index += 1
|
| | | # 约定 {appID:[推送ID1, 推送ID2...]} 为群推
|
| | | # 约定 {appID:[[推送ID1, 玩家名称1], [推送ID2, 玩家名称2]...]} 为一一个推
|
| | | for appID in playerDict:
|
| | | # 找到对应KEY
|
| | | try:
|
| | | app_key = ConfigIniReader.GetConfig().GetValue('app_key_%s'%appID)
|
| | | master_secret = ConfigIniReader.GetConfig().GetValue('master_secret_%s'%appID)
|
| | | except:
|
| | | logging.warn("no key = %s"%appID)
|
| | | continue
|
| | | jpushObj = jpush.JPush(app_key, master_secret)
|
| | |
|
| | | def PushOne(regIDList, notifyMsg, osName=jpush.all_):
|
| | | if type(playerDict[appID][0]) != list: # 列表中的元素不是列表说明是群推
|
| | | PushOne(jpushObj, playerDict[appID], notifyMsg, osName)
|
| | | else:
|
| | | # 不支持notifymsg内容不一样的多推,只能一一对应推送
|
| | | for regID, playerName in playerDict[appID]:
|
| | | playerName = playerName if playerName else Def_NoName
|
| | | #playerName = urllib.unquote(playerName)
|
| | | #playerName = playerName.encode('utf-8')
|
| | | geTuiMsg = NotifyFormat%(playerName, notifyMsg)
|
| | | #logging.info("PushOne%s-%s-%s"%([regID], geTuiMsg, osName))
|
| | | PushOne(jpushObj, [regID], geTuiMsg, osName)
|
| | |
|
| | | |
| | | def PushOne(jpushObj, regIDList, notifyMsg, osName=jpush.all_):
|
| | | # 1.推送对象 单推(多推); 群推只能提交中心推
|
| | | # 2.平台 ios 安卓 默认全平台
|
| | | # 3.通知消息
|
| | |
|
| | | push = _jpush.create_push()
|
| | | push = jpushObj.create_push()
|
| | | push.audience = {"registration_id" : regIDList}
|
| | | push.notification = jpush.notification(alert=notifyMsg)
|
| | | push.platform = osName
|