#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package EventReport
|
#
|
# @todo:ʼþ»ã±¨
|
# @author hxp
|
# @date 2015-1-14
|
# @version 1.9
|
# @Note£º EventReport_EventReportÓ÷¨ µÚÒ»¸ö²ÎÊý´«postÄÚÈÝurlencode£¬µÚ2,3,4²»Ó㻵ÚÎå¸ö²ÎÊý0´ú±íget£¬1Ϊpost£»µÚÁù¸ö²ÎÊýΪurl
|
#
|
# @change: "2015-01-28 22:30" hxp ¹Ø±Õʼþ»ã±¨
|
# @change: "2015-02-06 20:40" Alee ʼþ»ã±¨·¢ËÍÖÁºÏ·þÖ÷·þ
|
# @change: "2015-06-08 20:30" hxp Ôö¼ÓchannelCode
|
# @change: "2015-07-13 14:00" hxp Ôö¼ÓpidÐÅÏ¢
|
# @change: "2016-07-18 19:00" hxp 9377¶À´úʼþ»ã±¨°æ
|
# @change: "2016-07-27 20:00" Alee Ð޸Ĵò¿ªÎļþ³¬Ê±¹Ø±Õ
|
# @change: "2016-08-30 23:00" hxp ×Ô¶¨ÒåÔÚÏßÈËÊý; ÁÄÌì¼à¿Ø
|
# @change: "2016-09-10 11:00" hxp ÁÄÌìÄÚÈÝÌæ»»»»ÐÐ
|
# @change: "2017-07-01 15:30" hxp ƽ̨ÐÅÏ¢¸ÄΪ´ÓÍæ¼ÒÕ˺ÅÖÐÈ¡£¬Ö§³Ö»ì·þģʽ
|
# @change: "2017-07-04 15:00" hxp Ôö¼Ó»ì·þģʽÏ¿ÉÇø·Ö¸÷ƽ̨×ÔÉíÇø·þºÏ·þºóµÄƽ̨Ö÷·þID
|
# ÏêϸÃèÊö: ʼþ»ã±¨
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2017-07-04 15:00"""
|
#---------------------------------------------------------------------
|
|
import ReadChConfig
|
import ShareDefine
|
import GameWorld
|
|
import datetime
|
import random
|
import time
|
import md5
|
import os
|
import re
|
import urllib
|
import IpyGameDataPY
|
|
|
EventFilepath = "D:\\EventServer\\PythonScribe\\EventLog\\"
|
|
g_wFileName = ""
|
g_writeHandle = None # ²»¿ÉÖ±½Óµ÷ÓÃ
|
g_whStartTime = 0 # ´´½¨Îļþʱ¼ä
|
Def_WriteTime = 2 # Îļþ³ÖÐøÐ´Èëʱ¼ä£º·ÖÖÓ
|
|
def OnTimeCloseScribeTxt():
|
global g_whStartTime
|
global g_writeHandle
|
global g_wFileName
|
try:
|
if g_whStartTime == 0:
|
return
|
|
#Îļþ´´½¨³¬¹ý
|
if time.time() - g_whStartTime < 60*(Def_WriteTime + 1):
|
return
|
|
if g_writeHandle == None:
|
return
|
g_writeHandle.close()
|
g_wFileName = ""
|
g_whStartTime = 0
|
except:
|
GameWorld.ErrLog("OnTimeCloseScribeTxt ³ö´í")
|
|
## ³õʼ»¯Ê¼þ
|
# @param None
|
# @return ÎÞ·µ»ØÖµ
|
def InitDllAppID():
|
|
appID = "mobile"
|
key = "mobile"
|
|
GameWorld.GetGameWorld().EventReport_SetEventReportParam(appID, key)
|
GameWorld.Log("³õʼ»¯Ê¼þ±¨¸æ: appID=%s,key=%s OK!" % (appID, key))
|
return
|
|
## ʼþ±¨¸æ¼Ç¼
|
# @param eventActionID ʼþid
|
# @param eventParam ʼþ²ÎÊý
|
# @param curPlayer
|
# @return None
|
def EventReport(eventActionID, eventParam, curPlayer=None, OperatorID=""):
|
# ×é³ÉÀý×Ó eventParam µÄ¸ñʽ±ØÐëÊÇ xx=yy&zz=cc
|
# "http://192.168.0.249:12000/event_receiver?EventID=3099&OperatorID=test&PlayerCount=102&Time=2018-02-08 18:30:30&ProductID=snxxz&RegionName=s1"
|
|
reportActionIDList = IpyGameDataPY.GetFuncEvalCfg("EventReport", 3)
|
if reportActionIDList and eventActionID not in reportActionIDList:
|
#GameWorld.DebugLog("·ÇÐèÒª»ã±¨µÄʼþID! %s" % eventActionID)
|
return
|
if eventActionID in IpyGameDataPY.GetFuncEvalCfg("EventReport", 1):
|
#GameWorld.DebugLog("²»ÐèÒª»ã±¨µÄʼþ! %s" % eventActionID)
|
return
|
|
if not curPlayer and not OperatorID:
|
return
|
|
ProductID = ReadChConfig.GetPyMongoConfig("EventReport", "ProductID")
|
ReportUrl = ReadChConfig.GetPyMongoConfig("EventReport", "ReportUrl")
|
|
playerInfo = ""
|
if curPlayer:
|
playerInfo = "&AccountID=%s&IP=%s&DeviceFlag=%s"%(GameWorld.GetPlatformAccID(curPlayer.GetAccID()),
|
curPlayer.GetIP(), curPlayer.GetDeviceFlag())
|
#=======================================================================
|
# #UTF8 ÐèҪת³Éurl±àÂë²Å¿ÉÓÃ
|
# playerInfo = urllib.urlencode({"RoleID": curPlayer.GetName(),
|
# "AccountID": GameWorld.GetPlatformAccID(curPlayer.GetAccID()),
|
# "IP": curPlayer.GetIP(),
|
# "Level": curPlayer.GetLV()})
|
#=======================================================================
|
OperatorID = GameWorld.GetPlayerPlatform(curPlayer)
|
RegionName = GameWorld.GetPlayerServerSID(curPlayer)
|
|
else:
|
# ºÏ·þÇé¿ö£¬Íæ¼ÒÈ¡×Ô¼º·þ·¢ËÍ£¬·ÇÍæ¼ÒÊý¾Ý°´Ö¸¶¨Æ½Ì¨ÅäÖ÷¢
|
sid = GameWorld.GetPlayerMainServerID(OperatorID)
|
if not sid:
|
GameWorld.ErrLog("GetPlayerMainServerID: %s-%s"%(OperatorID, sid))
|
return
|
RegionName = 's%s'%sid
|
|
if eventParam:
|
eventParam = "&%s"%eventParam
|
|
getUrl = "%s?ProductID=%s&OperatorID=%s&RegionName=%s&EventID=%s%s&Time=%s%s"%(\
|
ReportUrl, ProductID, OperatorID, RegionName, eventActionID, playerInfo,
|
urllib.quote(str(datetime.datetime.today()).split('.')[0]), eventParam)
|
GameWorld.DebugLog("EventReport: %s"%getUrl)
|
|
# µÚÎå¸ö²ÎÊý0´ú±íget·¢ËÍ 1´ú±ípost
|
GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl)
|
return
|
|
|
|
## дʼþ±¨¸æÎļþ
|
# @param eventClass
|
# @return None
|
def WriteEvent(eventClass):
|
if GameWorld.IsCrossServer():
|
return
|
|
if eventClass.GetScribeEventName() not in ReadChConfig.GetEvalChConfig("EventReportID"):
|
return
|
|
try:
|
if not os.path.isdir(EventFilepath):
|
os.makedirs(EventFilepath)
|
|
#³¢ÊÔдµ½Í¬Ò»¸öÎļþµ«ÊÇwindow »áÓÐbug£¬Ö»Äܸ÷×Ô³ÌÐò·Ö¿ªÐ´Èë
|
fp_w = GetWriteIO()
|
fp_w.write("%s\t%s\n"%(eventClass.GetScribeEventName(), eventClass.GetCurEventStr()))
|
fp_w.flush()
|
except:
|
GameWorld.ErrLog("scribeʼþдÈë³ö´í¡£")
|
return
|
|
# ·ÖÖÓ×¼µãУ׼
|
def FixTime():
|
curTime = datetime.datetime.today()
|
curTime = curTime + datetime.timedelta(minutes=Def_WriteTime-curTime.minute%Def_WriteTime)
|
tmp = str(curTime).split(".")[0][:-3].replace(':', '-')
|
return tmp.replace(" ", "_")
|
|
def GetLogFileName(fileStr):
|
sessionid = md5.md5(str(random.random()) + str(time.time())).hexdigest()
|
return EventFilepath + sessionid + fileStr + '.log'
|
|
def GetWriteIO():
|
global g_wFileName
|
global g_writeHandle
|
global g_whStartTime
|
|
fileTime = FixTime()
|
if g_wFileName and fileTime in g_wFileName:
|
#µ±Ç°ÎļþÖ±½Ó·µ»Ø
|
return g_writeHandle
|
curFileName = GetLogFileName(fileTime)
|
|
if g_writeHandle != None:
|
#¹Ø±Õ¾ÉÎļþ
|
g_writeHandle.close()
|
|
g_wFileName = curFileName
|
g_writeHandle = open(g_wFileName, 'a+')
|
g_whStartTime = time.time()
|
return g_writeHandle
|
|
|
|
# ÿ¸ö×ֶζ¼Ó¦¸ÃתΪ×Ö·û´®£¬²»È»join»á±¨´í
|
|
class ScribeEvent(object):
|
def __init__(self):
|
#±ØÐë×Ö¶Î
|
self.product_slug = 'yhlz' # ÓÎÏ·±êÖ¾
|
self.agent_name = ReadChConfig.GetPyMongoConfig("platform", "PlatformName") # ƽ̨±êÖ¾
|
self.gameserver_no = ReadChConfig.GetPyMongoConfig("platform", "ServerID")[1:] # Çø·þ
|
self.time = "" #GameWorld.GetCurrentDataTimeStr()
|
|
def SetEventAgentInfo(self, accIDPlatform):
|
# ÉèÖôúÀíÔËÓªÉÌÐÅÏ¢
|
# @param accIDPlatform: ÕâÀïÈ¡Õ˺ÅËùÊôƽ̨£¬Ö§³Ö»ì·þ, Èç¹ûÈ¡²»µ½£¬ÔòÓÃĬÈÏÅäÖõÄÔËÓªÉÌÐÅÏ¢
|
if not accIDPlatform:
|
return
|
self.agent_name = accIDPlatform
|
self.gameserver_no = str(GameWorld.GetPlayerMainServerID(self.agent_name))
|
return
|
|
#¼´Ê¹ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
|
#±ÜÃâÐ޸ĸñʽµÄÇé¿ö£¬ÕâÀïͳһÐ޸ļ´¿É
|
def GetEventStr(self, tmpList):
|
return '\"%s\"'%'","'.join(tmpList)
|
|
# ÔÚÏßÈËÊý
|
class concurrency(ScribeEvent):
|
def __init__(self):
|
#±ØÐë×Ö¶Î
|
super(concurrency, self).__init__()
|
self.concurrency = 0 # ÔÚÏßÈËÊý
|
#·Ç±ØÐë×Ö¶Î
|
|
#¼´Ê±ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
|
|
def GetCurEventStr(self):
|
if not self.time:
|
self.time = GameWorld.GetCurrentDataTimeStr()
|
tmpList = [self.product_slug, self.agent_name,
|
self.gameserver_no, self.time, str(self.concurrency)]
|
|
return super(concurrency, self).GetEventStr(tmpList)
|
|
def GetScribeEventName(self): return ShareDefine.Def_UserAction_KeepOnline
|
|
|
# 3.3.15. custom©\concurrency£¨Õû5·ÖÖÓ·Ö·þÇø×Ô¶¨ÒåÔÚÏßÍæ¼ÒÈËÊý£©
|
# ÓÃÓÚ×Ô¶¨ÒåÍæ¼ÒÔÚÏßÈËÊýÏà¹ØÍ³¼Æ£¬ÊÕ¼¯ÐèÒªµ¥¶Àͳ¼ÆµÄ×Ô¶¨ÒåÀàÐ͵ÄÔÚÏßÊý¾Ý¡£
|
class custom_concurrency(ScribeEvent):
|
def __init__(self):
|
#±ØÐë×Ö¶Î
|
super(custom_concurrency, self).__init__()
|
self.concurrency = 0 # ÔÚÏßÈËÊý
|
self.type_name = "" # ×Ô¶¨ÒåÀàÐÍ
|
|
#·Ç±ØÐë×Ö¶Î
|
|
#¼´Ê±ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
|
return
|
|
def GetCurEventStr(self):
|
if not self.time:
|
self.time = GameWorld.GetCurrentDataTimeStr()
|
tmpList = [self.product_slug, self.agent_name, self.gameserver_no, self.time, str(self.concurrency), self.type_name]
|
|
return super(custom_concurrency, self).GetEventStr(tmpList)
|
|
def GetScribeEventName(self): return ShareDefine.Def_UserAction_CustomConcurrency
|
|
# 3.3.9. custom-events£¨×Ô¶¨Òåʼþ£©
|
# ÓÃÓÚͳ¼ÆÈÎºÎÆÚÍûÈ¥¸ú×ÙµÄÊý¾Ý
|
class custom_events(ScribeEvent):
|
def __init__(self):
|
#±ØÐë×Ö¶Î
|
super(custom_events, self).__init__()
|
self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
|
self.event_name = "" # ʼþÃû³Æ
|
self.session_id = "" # ȇȡID
|
|
#·Ç±ØÐë×Ö¶Î
|
self.ip = "" # IP µØÖ·
|
self.account_name = "" # Õ˺ŵǼÃû
|
self.account_type = 0 # Õ˺ÅÀàÐÍ
|
self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
|
self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
|
self.comments = "" # ±¸×¢»ò¸½¼ÓÐÅÏ¢ char(255)
|
|
#¼´Ê±ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
|
return
|
|
def GetCurEventStr(self):
|
if not self.time:
|
self.time = GameWorld.GetCurrentDataTimeStr()
|
tmpList = [self.product_slug, self.agent_name, self.ip, self.gameserver_no, self.account_id, self.account_name,
|
str(self.account_type), self.time, self.chr_name, str(self.chr_level), self.event_name,
|
self.comments, self.session_id]
|
|
return super(custom_events, self).GetEventStr(tmpList)
|
|
def GetScribeEventName(self): return ShareDefine.Def_UserAction_CustomEvents
|
|
|
# 3.3.13. chat-log £¨ÁÄÌìÏûÏ¢£©
|
# ÓÃÓÚ¼à¿ØÍæ¼ÒÁÄÌì
|
class chat_log(ScribeEvent):
|
def __init__(self):
|
#±ØÐë×Ö¶Î
|
super(chat_log, self).__init__()
|
self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
|
self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
|
self.content = "" # ÁÄÌìÄÚÈÝ
|
self.cmc_name = "" # ÁÄÌìÆµµÀ±êʶ
|
|
#·Ç±ØÐë×Ö¶Î
|
self.ip = "" # IP µØÖ·
|
self.account_name = "" # Õ˺ŵǼÃû
|
self.account_type = 0 # Õ˺ÅÀàÐÍ
|
self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
|
self.object = "" # ˽ÁĶÔÏó
|
self.addinfo = "" # ¶îÍâÐÅÏ¢
|
|
#¼´Ê±ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
|
return
|
|
def GetCurEventStr(self):
|
if not self.time:
|
self.time = GameWorld.GetCurrentDataTimeStr()
|
tmpList = [self.product_slug, self.agent_name, self.ip, self.gameserver_no, self.account_id, self.account_name,
|
str(self.account_type), self.time, self.chr_name, str(self.chr_level), self.object, self.content,
|
self.addinfo, self.cmc_name]
|
|
return super(chat_log, self).GetEventStr(tmpList)
|
|
def GetScribeEventName(self): return ShareDefine.Def_UserAction_ChatLog
|
|
## =================================================================================================
|
|
## ÔÚÏß
|
def WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt, OperatorID):
|
# Ö»´«ÕæÊµÍæ¼Ò£¬Èúǫ́ÏÔÊ¾ÕæÊµÔÚÏßÍæ¼Ò
|
realPlayer = activePlayerCount-tjgOnlineCnt
|
EventReport(ShareDefine.Def_UserAction_KeepOnline,
|
"PlayerCount=%s&TotalPlayerCount=%s"%(realPlayer, realPlayer), None, OperatorID)
|
return
|
|
|
## ×Ô¶¨ÒåÔÚÏß
|
def WriteEvent_custom_concurrency(platform, concurrency, type_name):
|
customConcurrency = custom_concurrency()
|
customConcurrency.SetEventAgentInfo(platform)
|
customConcurrency.concurrency = concurrency
|
customConcurrency.type_name = type_name
|
WriteEvent(customConcurrency)
|
return
|
|
def WriteEvent_chat_log(curPlayer, content, cmc_name, tagName="", addinfo=""):
|
return
|
#===========================================================================
|
# '''
|
# @todo: дÁÄÌì¼à¿Ø¼Ç¼
|
# @param content: ÁÄÌìÄÚÈÝ
|
# @param cmc_name: ÁÄÌìÆµµÀ±êʶ
|
# @param tagName: ˽ÁĶÔÏó
|
# @param addinfo: ¶îÍâÐÅÏ¢
|
# '''
|
#
|
# chatlogEvent = chat_log()
|
# chatlogEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer))
|
# chatlogEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
|
# chatlogEvent.chr_name = curPlayer.GetName()
|
# chatlogEvent.content = __GetEventChatContent(content)
|
# chatlogEvent.cmc_name = cmc_name
|
# chatlogEvent.ip = curPlayer.GetIP()
|
# chatlogEvent.account_name = chatlogEvent.account_id
|
# chatlogEvent.account_type = 0
|
# chatlogEvent.chr_level = 0
|
# chatlogEvent.object = tagName
|
# chatlogEvent.addinfo = addinfo
|
# WriteEvent(chatlogEvent)
|
# return
|
#===========================================================================
|
|
def __GetEventChatContent(content):
|
'''
|
<a color="255,255,0" href="GOTO 10000,74,60">[µØÍ¼:ĺ¹âÖ®³Ç(74,60)]</a>
|
<A color="205,0,0" onmouseover="ShowInfo ITEM,55986" DATA="07 04 01 00 B2 DA 00 00 00 01 00 01
|
28 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 3C 00 00 00 7B 27 32 38 27 3A 5B
|
27 31 30 32 33 34 27 5D 2C 27 31 39 27 3A 5B 27 33 35 34 27 2C 27 38 35 36 27 2C 27 33 35
|
34 27 2C 27 37 35 38 27 2C 27 39 35 31 27 2C 27 31 30 35 32 27 5D 7D 04 00 00 00 00 00 00
|
00 00 00 00 00 00 00 00 00 00 ">[ÉñÊ¥µÄ°ÁÊÀÖ®¹ +40]</a>
|
'''
|
tempMatch = re.search("<a color=.*?>.*?</a>", content)
|
if tempMatch:
|
tempStr = tempMatch.group()
|
markIndex = tempStr.index(">") + 1
|
repStr = tempStr[markIndex:tempStr.index("<", markIndex)]
|
content = content.replace(tempStr, repStr)
|
|
tempMatch = re.search("<A color=.*?>.*?</a>", content)
|
if tempMatch:
|
tempStr = tempMatch.group()
|
markIndex = tempStr.index(">") + 1
|
repStr = tempStr[markIndex:tempStr.index("<", markIndex)]
|
content = content.replace(tempStr, repStr)
|
|
# Ìæ»»»»ÐÐ
|
content = content.replace("\r", "")
|
content = content.replace("\n", "")
|
return content
|
|
|
|