hch
2018-09-01 7d72b082da27e949902ef083eb4ea2da201a013f
3191 极光推送混服修改
11个文件已修改
1个文件已添加
479 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGeTui.py 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/webbottle/Config.ini 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/webbottle/lib/ConfigIniReader.py 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/webbottle/webapp.py 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -914,7 +914,7 @@
        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)
        
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -169,6 +169,7 @@
    #GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay)
    #清理过期补偿
    PlayerCompensation.ClearUpTimeOutCompensation()
    PlayerGeTui.ClearFMTGeTuiLimit()
    import PlayerBourse
    PlayerBourse.OverTimeItemsDeal()
    return
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
@@ -24,7 +24,7 @@
import PlayerControl
import PyDataManager
import time
import json
# VIP权限
Def_Onoff_VIPCount = 5
(
@@ -40,6 +40,14 @@
# 新玩家还没有脱机时间 有利于挽回流失玩家
g_NewGuyNoTJGTime = {} # {playerID:[playername,getuiid, tick]}
g_FMTGeTuiLimit = {}    # 封魔坛推送限制 过于频繁控制下短时间通知
def ClearFMTGeTuiLimit():
    global g_FMTGeTuiLimit
    g_FMTGeTuiLimit = {}
def GetTimeLimit(timeStr):
    # 检查格式后转数字
@@ -149,22 +157,19 @@
# 服务端群推暂不由游戏服务器推送,可从第三方个推网站推送
# 游戏服务器只推送具有变化性的内容
# 支持单推和多人推送
# 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
@@ -209,6 +214,41 @@
    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玩家 封魔坛个推
@@ -219,9 +259,7 @@
    #找到关注这只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):
@@ -229,6 +267,7 @@
        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:
@@ -238,11 +277,18 @@
            # 过滤个推
            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()
@@ -253,7 +299,7 @@
    elif geTuiType == Def_Onoff_Boss:
        showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 2)%(bossData.GetSourceName(), npcName, npcLV))    # 文字信息
        
    GeTuiNotify(geTuiIDList, playerNameList, showStr)
    GeTuiNotify(appIDDict, showStr)
    
# 私聊
@@ -268,7 +314,7 @@
        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
# 下线时,低级玩家没有离线时间的玩家提示, 上线清空
@@ -279,7 +325,8 @@
    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
# 上线清除
@@ -299,20 +346,24 @@
    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)
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1712,4 +1712,13 @@
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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py
@@ -47,6 +47,7 @@
import ItemControler
import ChConfig
import FBLogic
import PlayerVip
import operator
import json
@@ -548,3 +549,18 @@
    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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGeTui.py
@@ -26,6 +26,7 @@
import PlayerViewCacheTube
import urllib
import PlayerVip
import json
#===============================================================================
# //B2 05 推送提醒设置 tagCMPushNotificationsSetting
@@ -196,27 +197,23 @@
# 服务端群推暂不由游戏服务器推送,可从第三方个推网站推送
# 游戏服务器只推送具有变化性的内容
# 支持单推和多人推送
# 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):
@@ -234,8 +231,7 @@
        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
@@ -273,7 +269,7 @@
    
    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
@@ -290,7 +286,7 @@
    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
@@ -307,7 +303,7 @@
        return
    
    showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiTJG", 3))    # 文字信息
    GeTuiNotify([GetGeTuiClientID(curPlayer)], [curPlayer.GetName()], showStr)
    GeTuiNotify({GameWorld.GetPlayerPlatform(curPlayer.GetAccID()) : [[GetGeTuiClientID(curPlayer), curPlayer.GetName()]]}, showStr)
    
    
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
@@ -826,6 +826,58 @@
    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时间
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -28,6 +28,9 @@
import ItemControler
import IpyGameDataPY
import ChEquip
import FBCommon
import BossHurtMng
import time
import json
@@ -81,6 +84,7 @@
    #-----------
    #玩家属性缓存
    curPlayerPropDict = {}
    curPlayerPropDict["AccID"] = curPlayer.GetAccID()
    curPlayerPropDict["LV"] = curPlayer.GetLV()
    curPlayerPropDict["RealmLV"] = curPlayer.GetOfficialRank()
    curPlayerPropDict["Job"] = curPlayer.GetJob()
@@ -101,6 +105,18 @@
    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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1712,4 +1712,13 @@
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)
Tool/webbottle/Config.ini
New file
@@ -0,0 +1,15 @@
[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 = 亲
Tool/webbottle/lib/ConfigIniReader.py
@@ -15,153 +15,29 @@
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
Tool/webbottle/webapp.py
@@ -18,11 +18,13 @@
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()
@@ -37,55 +39,63 @@
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