#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package EventReport
#
# @todo:ʼþ»ã±¨
# @author hxp
# @date 2015-1-14
# @version 2.4
# @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-07-30 11:30" hxp ¹Ø±ÕÎïÆ·¸ú×Ù
# @change: "2016-08-18 16:30" hxp ×Ô¶¨ÒåÈÎÎñʼþ
# @change: "2016-08-30 23:00" hxp ÁÄÌì¼à¿Ø
# @change: "2016-09-10 11:00" hxp ÁÄÌìÄÚÈÝÌæ»»»»ÐÐ
# @change: "2016-11-09 20:00" hxp Ôö¼Ó×Ô¶¨Òå¼Ç¼(×øÆï¡¢³á°ò¡¢³èÎï¡¢»õ±Ò½ø³ö¡¢³È×°)
# @change: "2017-06-08 19:30" hxp Ôö¼Ó×Ô¶¨Òå¼Ç¼(µãȯ¡¢Éñ±ø¡¢·ûÓ¡¡¢¸ÄÃû¡¢ÕæÆø)
# @change: "2017-07-01 15:30" hxp ƽ̨¸ÄΪ´ÓÍæ¼ÒÕ˺ÅÖÐÈ¡£¬Ö§³Ö»ì·þģʽ
# @change: "2017-07-04 15:00" hxp Ôö¼Ó»ì·þģʽÏ¿ÉÇø·Ö¸÷ƽ̨×ÔÉíÇø·þºÏ·þºóµÄƽ̨Ö÷·þID
# ÏêϸÃèÊö: ʼþ»ã±¨
#
#---------------------------------------------------------------------
#"""Version = 2017-07-04 15:00"""
#---------------------------------------------------------------------
import IPY_GameWorld
import DataRecordPack
import PlayerControl
import ReadChConfig
import ShareDefine
import GameWorld
import ChConfig
import CommFunc
import PlayerTJG
import datetime
import random
import time
import md5
import os
import re
import json
import urllib
EventFilepath = "D:\\EventServer\\PythonScribe\\EventLog\\" 
g_wFileName = ""
g_writeHandle = None  # ²»¿ÉÖ±½Óµ÷ÓÃ
Def_Custom_Events_Bug = "Bug" # ÓÎÏ·Bug
Def_Custom_Events_Suggest = "suggest" # ÓÎÏ·½¨Òé
Def_Custom_Events_Item = "Item" # ÎïÆ·¸ú×Ù
Def_Custom_Events_GetMail = "GetMail" # ÓʼþÁìÈ¡
Def_Custom_Events_CommonCard = "CommonCard_%s" # ͨÓÃÐÂÊÖ¿¨ÂëʹÓÃ, ²ÎÊýΪͨÓÃÂ뿨ºÅ
Def_Custom_Events_NewbieCard = "NewbieCard_%s" # ³£¹æÐÂÊÖ¿¨Ê¹ÓÃ, ²ÎÊýΪÀñ°üÀàÐÍ
Def_Custom_Events_MediaCard = "MediaCard_%s" # ÐÂýÌ忨ʹÓÃ, ²ÎÊýΪ¿¨ÀàÐÍ
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"
    
    if not curPlayer and not OperatorID:
        return
    ProductID = ReadChConfig.GetPyMongoConfig("EventReport", "ProductID")
    ReportUrl = ReadChConfig.GetPyMongoConfig("EventReport", "ReportUrl")
    
    
    playerInfo = ""
    if curPlayer:
        #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,
             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):
    return
    if GameWorld.IsCrossServer():
        return
    
    if eventClass.GetScribeEventName() not in ReadChConfig.GetEvalChConfig("EventReportID"):
        return
    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()
    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)
    
# 3.3.1. entry£¨ÐÂÍæ¼Òµ¼È룩
class entry(ScribeEvent):
    
    Def_EntryStep_CreatRole = 3
    Def_EntryStep_FirstLogin = 4
    
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(entry, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.step = 0 # ²½ÖèÖµ
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.browser = "" # Íæ¼ÒʹÓõÄä¯ÀÀÆ÷
        self.resolution = "" # Íæ¼ÒµÄ×ÀÃæ·Ö±æÂÊ£¬¸ñʽΪ¡¸¿í*¸ß¡¹
        self.os = "" # Íæ¼ÒʹÓõIJÙ×÷ϵͳ
        
        #¼´Ê±ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
        return
    
    def GetCurEventStr(self):
        tmpList = [self.product_slug, self.agent_name, self.ip, self.gameserver_no, self.account_id, self.account_name, 
                   str(self.account_type), self.browser, self.resolution, self.os, str(self.step)]
        
        return super(entry, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_CreateRole
    
# 3.3.2. login£¨µÇ¼£©
class login(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(login, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.session_id = "" # ȇȡID
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.browser = "" # Íæ¼ÒʹÓõÄä¯ÀÀÆ÷
        self.resolution = "" # Íæ¼ÒµÄ×ÀÃæ·Ö±æÂÊ£¬¸ñʽΪ¡¸¿í*¸ß¡¹
        self.os = "" # Íæ¼ÒʹÓõIJÙ×÷ϵͳ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        
        #¼´Ê±ÊǷ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.browser, self.resolution, self.os, self.time, self.chr_name, 
                   str(self.chr_level), self.session_id]
        
        return super(login, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_Login
    
    
# 3.3.3. session£¨»á»°¼Ç¼£©
# Íæ¼ÒµÇ³ö¡¢ÀëÏßµÄÊý¾Ý£¬ÅäºÏµÇ¼Êý¾ÝÊý¾ÝÖÐÐÄ¿Éͳ¼Æ³öÍæ¼ÒÔÚÏßʱ³¤
class session(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(session, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.session_id = "" # ȇȡID
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        
        #¼´Ê±ÊǷ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.session_id]
        
        return super(session, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_Session
    
# 3.3.5. virtual©\cost£¨ÐéÄâ±ÒÏû·Ñ£©
# Íæ¼Ò²úÉúÏû·Ñ¼Ç¼¼´ÊÕ¼¯£» 
class virtual_cost(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(virtual_cost, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.quantity = 0 # Ïû·ÑÊýÁ¿
        self.price = 0 # Ïû·ÑµãµÄÐéÄâ±Òµ¥¼Û
        self.reason_name = "" # Ïû·ÑµãÃû³Æ
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        self.balance = 0 # Íæ¼ÒÊ£ÓàÐéÄâ±Ò
        
        #¼´Ê±ÊǷ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), str(self.quantity), 
                   str(self.price), str(self.balance), self.reason_name]
        
        return super(virtual_cost, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_VirtualCost
    
# 3.3.6. virtual©\reward£¨ÐéÄâ±ÒÔùËÍ£©
# Íæ¼Ò»ñµÃÐéÄâ±ÒÔùËÍʱ¼´ÊÕ¼¯£» 
# ³ýÁËÕæÊµ³äÖµ¶©µ¥²úÉúµÄÐéÄâ±ÒÔö¼Ó¶¼Ó¦¸Ã¼ÆÈëµ½ÐéÄâ±ÒÔùËÍ
class virtual_reward(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(virtual_reward, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.virtual_amount = 0 # Ôö¼ÓµÄÐéÄâ±ÒÊýÁ¿
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        self.balance = 0 # Íæ¼ÒÊ£ÓàÐéÄâ±Ò
        self.source = "" # »ñµÃ½±ÀøµÄ;¾¶
        
        #¼´Ê±ÊǷ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), str(self.virtual_amount), 
                   str(self.balance), self.source]
        
        return super(virtual_reward, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_VirtualReward
    
# 3.3.12. virtual©\resource£¨ÐéÄâ×ÊÔ´²ú³öÓëÏûºÄ£©
# ²úÉúÏàÓ¦ÐéÄâ×ÊÔ´µÄÏû·Ñ¡¢Éú²ú¼Ç¼ʱ¼´ÊÕ¼¯¡£
# ÓÃÓÚͳ¼ÆÈκÎÐéÄâ×ÊÔ´Èç¸÷Àà¶þ¼¶»õ±ÒµÄ²ú³öÓëÏûºÄ
class virtual_resource(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(virtual_resource, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.type_name = "" # ÐéÄâ×ÊÔ´ÀàÐÍÃû³Æ
        self.reason_name = "" # ×ÊÔ´µãÃû³Æ
        self.quantity = 0 # ÐéÄâ×ÊÔ´²ú³ö/ÏûºÄµÄ´ÎÊý
        self.price = 0 # ÐéÄâ×ÊÔ´²ú³ö/ÏûºÄµÄÊýÁ¿£¬Çø·ÖÕý¸º£¬ÕýֵΪ²ú³ö£¬¸ºÖµÎªÏûºÄ
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        
        #¼´Ê±ÊǷ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.type_name, 
                   self.reason_name, str(self.quantity), str(self.price)]
        
        return super(virtual_resource, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_VirtualResource
# 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.10. mission©\log£¨ÈÎÎñ¼Ç¼£©
# ¸ú×ÙÍæ¼ÒÈÎÎñ½ÓÈ¡¡¢Íê³É¡¢Ê§°ÜÇé¿ö£¬ÒÔ¼°ÓÃÓÚÁ÷Ê§Íæ¼ÒµÄÈÎÎñ·ÖÎöµÈͳ¼Æ¡£
# ÈÎÎñ½Óȡʱ¼´ÊÕ¼¯ type=0 µÄÊý¾Ý£¬ÈÎÎñ½áÊøÇҳɹ¦Ê±¼´ÊÕ¼¯ type=1¡¢mission_result=1 µÄÊý¾Ý£¬ÈÎÎñ½áÊøÇÒʧ°Üʱ¼´ÊÕ¼¯ type=1¡¢mission_result=0 µÄÊý¾Ý¡£
class missionlog(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(missionlog, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        self.type = 0 # 0 ÈÎÎñ¿ªÊ¼ 1 ÈÎÎñ½áÊø
        self.mission_name = "" # ÈÎÎñÃû
        self.session_id = "" # ȇȡID
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        self.mission_result = 0 # µ±ÈÎÎñ½áÊø£¬ÈÎÎñ½á¹û 0£ºÊ§°Ü 1£º³É¹¦
        self.mission_reason = "" # µ±ÈÎÎñ½áÊøÇÒÈÎÎñʧ°ÜʱµÄÔÒò
        #¼´Ê±ÊǷDZØÐë×Ö¶ÎÒ²Ó¦¸Ã´«ËÍ£¬¸÷×Ö¶ÎÓÃ,·Ö¸ô£¬²¢ÇÒÓÃË«ÒýºÅ°üº¬£¬²Î¿¼¸ñʽ'"1","","","12314"'
        
        self.scribeEventName = ShareDefine.Def_UserAction_MissionLog
        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), str(self.type), self.mission_name,
                   str(self.mission_result), self.mission_reason, self.session_id]
        
        return super(missionlog, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return self.scribeEventName
    
# 3.3.11. level©\up£¨Éý¼¶¼Ç¼£©
# ÓÃÓÚÍæ¼ÒÉý¼¶Ê±³¤µÈµÈ¼¶Ïà¹ØÍ³¼Æ¡£
# µÈ¼¶·¢Éú±ä»¯Ê±¼´ÊÕ¼¯£»
# Ҫͳ¼Æ 2 ¼¶µÄÉý¼¶Ê±³¤±ØÐëÒªÓÐ 1 ¼¶µÄÉý¼¶Êý¾Ý£¬Òò´Ë¸Õ´´½¨Íê½ÇɫʱµÄ 1 ¼¶µÄÊý¾ÝÒ²ÐèÒªÊÕ¼¯¡£
class levelup(ScribeEvent):
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(levelup, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_level = 0 # Íæ¼Ò½ÇÉ«µÈ¼¶
        self.session_id = "" # ȇȡID
        
        #·Ç±ØÐë×Ö¶Î
        self.ip = "" # IP µØÖ·
        self.account_name = "" # Õ˺ŵǼÃû
        self.account_type = 0 # Õ˺ÅÀàÐÍ
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        #¼´Ê±ÊǷ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.session_id]
        
        return super(levelup, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_LVUP
    
# 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_entry_firstlogin(curPlayer, browser, resolution, pcOS):
#    entryEvent = entry()
#    entryEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
#    entryEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
#    entryEvent.step = entryEvent.Def_EntryStep_FirstLogin
#    entryEvent.ip = curPlayer.GetIP()
#    entryEvent.account_name = entryEvent.account_id
#    entryEvent.account_type = GameWorld.GetAccountType(curPlayer)
#    entryEvent.browser = browser
#    entryEvent.resolution = resolution
#    entryEvent.os = pcOS
#    WriteEvent(entryEvent)
#    return
#===============================================================================
def WriteEvent_login(curPlayer):
    if curPlayer.GetIP() == "127.0.0.1":
        return
    EventReport(ShareDefine.Def_UserAction_Login, "Job=%s&SessionID=%s"%(curPlayer.GetJob(), GameWorld.GetSessionID(curPlayer)), curPlayer)
    return
# ÀëÏßÊý¾Ý
def WriteEvent_session(curPlayer):
    seconds = 0
    if PlayerTJG.GetIsTJG(curPlayer):
        return
    else:
        logoffTimeStr = curPlayer.GetLogoffTime().strip()
        loginTimeStr = curPlayer.GetLoginTime().strip()
        if logoffTimeStr and loginTimeStr:
            passTimes = GameWorld.GetDateTimeByStr(logoffTimeStr) - GameWorld.GetDateTimeByStr(loginTimeStr)
            seconds = passTimes.seconds
    EventReport(ShareDefine.Def_UserAction_Session, "OnlineTime=%s&SessionID=%s"%(seconds, GameWorld.GetSessionID(curPlayer)), curPlayer)
    #===========================================================================
    # sessionEvent = session()
    # sessionEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # sessionEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # sessionEvent.session_id = GameWorld.GetSessionID(curPlayer)
    # sessionEvent.ip = curPlayer.GetIP()
    # sessionEvent.account_name = sessionEvent.account_id
    # sessionEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # sessionEvent.chr_name = curPlayer.GetPlayerName()
    # sessionEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # WriteEvent(sessionEvent)
    #===========================================================================
    return
## дÐéÄâÔª±¦Ïû·Ñ¼Ç¼
#  @param quantity: Ïû·ÑÊýÁ¿
#  @param price: Ïû·ÑµãµÄÐéÄâ±Òµ¥¼Û
#  @param reason_name: Ïû·ÑµãÃû³Æ
def WriteEvent_virtual_cost(curPlayer, quantity, price, reason_name):
    '''
     ÎÊ£ºÐéÄâÏû·ÑµãµÄÁ£¶È¼¸´óºÃ£¿
        ´ð£ºÊý¾Ý±¨±í¶ÔÐéÄâÏû·ÑµÄͳ¼ÆÖ§³ÖÁ½¼¶£¬¼´Ïû·Ñµã¼°Æä¸¸ÀàÏû·Ñµã·Ö×飬¾Ý´Ë£º
       ¡ñ ½¨ÒéÊÇÏû·Ñ;¾¶¼ÓÉÏÏû·Ñ¶ÔÏ󣬱ÈÈ硸É̵깺Âò£ºÈýʬÄÔÉñµ¤¡¹£¬¶øºó½«¸ÃÏû·ÑµãÔÚÏû·Ñµã·Ö×éÀï¹éΪ¡¸É̵깺Âò¡¹£»
       ¡ñ ²»Òª¼ÓÉÏÏû·ÑÕßÈ硸Ҷ¹Âº®£ºÉ̵깺Âò£ºÈýʬÄÔÉñµ¤¡¹£»
       ¡ñ ²»Òª¼ÓÉÏÏû·Ñ¶ÔÏóµÈ¼¶È硸ǿ»¯£ºÁøÒ¶µ¶ [9¼¶]¡¹¡£
    '''
    #===========================================================================
    # virtualCostEvent = virtual_cost()
    # virtualCostEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # virtualCostEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # virtualCostEvent.quantity = quantity
    # virtualCostEvent.price = price
    # virtualCostEvent.balance = curPlayer.GetGold()
    # virtualCostEvent.reason_name = reason_name
    # virtualCostEvent.ip = curPlayer.GetIP()
    # virtualCostEvent.account_name = virtualCostEvent.account_id
    # virtualCostEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # virtualCostEvent.chr_name = curPlayer.GetPlayerName()
    # virtualCostEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # WriteEvent(virtualCostEvent)
    #===========================================================================
    return
## дÐéÄâÔª±¦ÔùËÍ»ñµÃ¼Ç¼,º¬³äÖµ¿É²éµ½Õ˶һ»³ÉÐéÄâ±Òʱ¼ä
#  @param virtual_reward: Ôö¼ÓµÄÐéÄâ±ÒÊýÁ¿
#  @param source: »ñµÃ½±ÀøµÄ;¾¶
def WriteEvent_virtual_reward(curPlayer, virtual_amount, source):
    #===========================================================================
    # virtualRewardEvent = virtual_reward()
    # virtualRewardEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # virtualRewardEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # virtualRewardEvent.virtual_amount = virtual_amount
    # virtualRewardEvent.balance = curPlayer.GetGold()
    # virtualRewardEvent.source = source
    # virtualRewardEvent.ip = curPlayer.GetIP()
    # virtualRewardEvent.account_name = virtualRewardEvent.account_id
    # virtualRewardEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # virtualRewardEvent.chr_name = curPlayer.GetPlayerName()
    # virtualRewardEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # WriteEvent(virtualRewardEvent)
    #===========================================================================
    return
## д¶þ¼¶»õ±ÒµÄ²ú³öÓëÏûºÄ¼Ç¼
#  @param type_name: ÐéÄâ×ÊÔ´ÀàÐÍÃû³Æ, Èç½ð±Ò
#  @param reason_name: ×ÊÔ´µãÃû³Æ, ÈçË¢ÐÂÈÙÓþÉ̵ê
#  @param quantity: ÐéÄâ×ÊÔ´²ú³ö/ÏûºÄµÄ´ÎÊý
#  @param price: ÐéÄâ×ÊÔ´²ú³ö/ÏûºÄµÄÊýÁ¿µ¥¼Û£¬Çø·ÖÕý¸º£¬ÕýֵΪ²ú³ö£¬¸ºÖµÎªÏûºÄ
#  @param flow  0 ´ú±íÏû·Ñ  1 ´ú±í²ú³ö
def WriteEvent_virtual_resource(curPlayer, type_name, reason_name, quantity, price, flow, extraDict={}):
    #±ÜÃâ¼Ç¼̫¶àÐÅÏ¢
    if type_name in [IPY_GameWorld.TYPE_Price_Silver_Money] and abs(quantity * price) < ChConfig.Def_DRRecord_Min_Silver:
        return
    # ±êʶ´Ë»õ±ÒÊÇ·ñÊÇÒ»¼¶»õ±Ò£¨³äÖµ£©
    Recharged = 1 if type_name == IPY_GameWorld.TYPE_Price_Gold_Money else 0
    #===========================================================================
    # virtualResourceEvent = virtual_resource()
    # virtualResourceEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # virtualResourceEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # virtualResourceEvent.type_name = str(type_name)
    # virtualResourceEvent.reason_name = reason_name
    # virtualResourceEvent.quantity = quantity
    # virtualResourceEvent.price = price
    # virtualResourceEvent.ip = curPlayer.GetIP()
    # virtualResourceEvent.account_name = virtualResourceEvent.account_id
    # virtualResourceEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # virtualResourceEvent.chr_name = curPlayer.GetPlayerName()
    # virtualResourceEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # WriteEvent(virtualResourceEvent)
    #===========================================================================
    # OperatorExtra json ¸ñʽ Ïû·Ñ¾ßÌåÔÒò
    EventReport(ShareDefine.Def_UserAction_VirtualResource, 
                "Price=%s&Quantity=%s&OperateType=%s&CurrencyType=%s&Recharged=%s&Flow=%s&Balance=%s&OperatorExtra=%s"%(
                price, quantity, reason_name, type_name, Recharged, flow, 
                PlayerControl.GetMoney(curPlayer, type_name), json.dumps(extraDict, ensure_ascii=False)), curPlayer)
    return
## дÈÎÎñʼþ¼Ç¼
#  @param startType: 0 ÈÎÎñ¿ªÊ¼ 1 ÈÎÎñ½áÊø
#  @param isFinish: µ±ÈÎÎñ½áÊø£¬ÈÎÎñ½á¹û 0£ºÊ§°Ü 1£º³É¹¦
#  @param failReason: µ±ÈÎÎñ½áÊøÇÒÈÎÎñʧ°ÜʱµÄÔÒò
def WriteEvent_mission_log(curPlayer, missionData, startType, isFinish=0, failReason=""):
    if startType not in [0, 1] or isFinish not in [0, 1]:
        return
    
    if not missionData:
        return
    
    #missionName = "0%s%s" % (missionData.ID, missionData.Name)
    missionName = missionData.ID
    __WriteEvent_mission_log(curPlayer, startType, missionName, isFinish, failReason)
    return
def WriteFuncCMEAcceptable(curPlayer, funcID):
    return
    if funcID not in ChConfig.FuncCMEDict:
        return
    WriteEvent_custom_mission_log(curPlayer, ChConfig.FuncCMEDict[funcID], ChConfig.CME_Log_Acceptable)
    return True
def WriteEvent_MWSuccess(curPlayer, mwID, succID, logType, isFinish=0):
    '''д×Ô¶¨ÒåÈÎÎñ - ·¨±¦³É¾Íʼþ, ʼþID¸ñʽ:  91+·¨±¦ID+ÖÁÉÙ4λµÄ³É¾ÍID
    '''
    cmeType = "91%d%04d" % (mwID, succID)
    WriteEvent_custom_mission_log(curPlayer, cmeType, logType, isFinish)
    return
def WriteEvent_FB(curPlayer, mapID, funcLineID, logType, joinType=0, isFinish=0, failReason=""):
    '''д×Ô¶¨ÒåÈÎÎñ - ¸±±¾Ê¼þ, ʼþID¸ñʽ: 90+mapID+joinType+funcLineID
    @param joinType: 0-ĬÈÏÎÞ; 1-µ¥ÈË; 2-¶àÈË; 3-ÖúÕ½;   ×¢Òâµ¥È˶ÓÎéËãµ¥ÈË
    '''
    cmeType = "90%d%d%02d" % (mapID, joinType, funcLineID)
    WriteEvent_custom_mission_log(curPlayer, cmeType, logType, isFinish, failReason=failReason)
    return
## д×Ô¶¨ÒåÈÎÎñʼþ¼Ç¼
#  @param cmeType: ×Ô¶¨ÒåÀàÐÍ, ¶ÔÓ¦ ChConfig.CME_Type_List
#  @param logType: ¼Ç¼ÀàÐÍ, ¶ÔÓ¦ ChConfig.CME_Log_Type_List
#  @param cmeInfoEx: À©Õ¹×Ô¶¨ÒåÐÅÏ¢, Ò»°ãÓÃÓÚÐèÒª·Ö×ÓÏî¼Ç¼µÄÀàÐÍ
#  @param isFinish: µ±Ê¼þ½áÊøÊ±½á¹û 0£ºÊ§°Ü 1£º³É¹¦
#  @param failReason: µ±Ê¼þ½áÊøÊ±Ê§°ÜµÄÔÒò
def WriteEvent_custom_mission_log(curPlayer, cmeType, logType, isFinish=0, failReason="", cmeInfoEx=None):
    #if cmeType not in ChConfig.CME_Type_List:
    #    return
    
    if logType not in ChConfig.CME_Log_Type_List:
        return
    
    startType = 1 if logType == ChConfig.CME_Log_End else 0 
    #===========================================================================
    # missionName = ChConfig.CME_Type_Dict.get(cmeType, "δ֪")
    # if cmeInfoEx != None:
    #    missionName = "%s:%s" % (missionName, cmeInfoEx)
    # if logType == ChConfig.CME_Log_Acceptable:
    #    missionName = "%s_¿ÉÌôÕ½" % missionName
    #===========================================================================
        
    missionName = cmeType
    __WriteEvent_mission_log(curPlayer, startType, missionName, isFinish, failReason, cmeType in ChConfig.CME_Ex_Log_List)
    return
## дÈÎÎñʼþ¼Ç¼
#  @param startType: 0 ÈÎÎñ¿ªÊ¼ 1 ÈÎÎñ½áÊø
#  @param missionName: ÈÎÎñÃû
#  @param isFinish: µ±ÈÎÎñ½áÊø£¬ÈÎÎñ½á¹û 0£ºÊ§°Ü 1£º³É¹¦
#  @param failReason: µ±ÈÎÎñ½áÊøÇÒÈÎÎñʧ°ÜʱµÄÔÒò
def __WriteEvent_mission_log(curPlayer, startType, missionName, isFinish, failReason, isExLog=False):
    isFinish = 1 if isFinish else 0
    exDict = {"Fail":failReason}
    resultMsg = json.dumps(exDict, ensure_ascii=False)
    EventReport(ShareDefine.Def_UserAction_MissionLog, 
                "MissionStep=%s&MissionID=%s&MissionResult=%s&MissionExtra=%s"%(startType, missionName, isFinish, resultMsg), curPlayer)
    #===========================================================================
    # missionlogEvent = missionlog()
    # missionlogEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # missionlogEvent.scribeEventName = ShareDefine.Def_UserAction_ExMissionLog if isExLog else \
    #                                    ShareDefine.Def_UserAction_MissionLog
    # missionlogEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # missionlogEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # missionlogEvent.type = startType
    # missionlogEvent.mission_name = missionName
    # missionlogEvent.session_id = GameWorld.GetSessionID(curPlayer)
    # 
    # missionlogEvent.ip = curPlayer.GetIP()
    # missionlogEvent.account_name = missionlogEvent.account_id
    # missionlogEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # missionlogEvent.chr_name = curPlayer.GetPlayerName()
    # missionlogEvent.mission_result = isFinish
    # missionlogEvent.mission_reason = failReason
    # WriteEvent(missionlogEvent)
    #===========================================================================
    return
def WriteEvent_level_up(curPlayer):
    EventReport(ShareDefine.Def_UserAction_LVUP, "", curPlayer)
    #===========================================================================
    # levelupEvent = levelup()
    # levelupEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # levelupEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # levelupEvent.session_id = GameWorld.GetSessionID(curPlayer)
    # levelupEvent.ip = curPlayer.GetIP()
    # levelupEvent.account_name = levelupEvent.account_id
    # levelupEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # levelupEvent.chr_name = curPlayer.GetPlayerName()
    # levelupEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # WriteEvent(levelupEvent)
    #===========================================================================
    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.GetAccID()))
    # 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 = GameWorld.GetAccountType(curPlayer)
    # chatlogEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # chatlogEvent.object = tagName
    # chatlogEvent.addinfo = addinfo
    # WriteEvent(chatlogEvent)
    #===========================================================================
    return
def __GetEventChatContent(content):
    '''
    [µØÍ¼:ĺ¹âÖ®³Ç(74,60)]
    [ÉñÊ¥µÄ°ÁÊÀÖ®¹ +40]
    '''
    tempMatch = re.search(".*?", content)
    if tempMatch:
        tempStr = tempMatch.group()
        markIndex = tempStr.index(">") + 1
        repStr = tempStr[markIndex:tempStr.index("<", markIndex)]
        content = content.replace(tempStr, repStr)
        
    tempMatch = re.search(".*?", 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
## д×Ô¶¨Òåʼþ¼Ç¼
#  @param event_name: ʼþÃû³Æ
#  @param comments: ±¸×¢»ò¸½¼ÓÐÅÏ¢
def WriteEvent_custom_events(curPlayer, event_name, comments):
    #===========================================================================
    # customEvent = custom_events()
    # customEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # customEvent.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # customEvent.event_name = event_name
    # customEvent.session_id = GameWorld.GetSessionID(curPlayer)
    # 
    # customEvent.ip = curPlayer.GetIP()
    # customEvent.account_name = customEvent.account_id
    # customEvent.account_type = GameWorld.GetAccountType(curPlayer)
    # customEvent.chr_name = curPlayer.GetPlayerName()
    # customEvent.chr_level = GetScribeEvent_chr_level(curPlayer)
    # customEvent.comments = CommFunc.GetStrCutoff(comments, 255)
    # WriteEvent(customEvent)
    #===========================================================================
    return
#// A1 01 Íæ¼ÒµçÄÔÐÅÏ¢ #tagCMPCInfo
#
#struct tagCMPCInfo
#{
#    tagHead        Head;
#    BYTE        PCOSLen; 
#    char        PCOS[PCOSLen];    // ²Ù×÷ϵͳ
#    BYTE        ResolutionLen; 
#    char        Resolution[ResolutionLen];    // ·Ö±æÂÊ
#    BYTE        BrowserLen; 
#    char        Browser[BrowserLen];    // ä¯ÀÀÆ÷
#    BYTE        ScribeTypeLen; 
#    char        ScribeType[ScribeTypeLen];    // ¼Ç¼ÀàÐÍ
#    BYTE        ScribeDataLen; 
#    char        ScribeData[ScribeDataLen];    // ¼Ç¼À©Õ¹ÐÅÏ¢
#};
def ReceiveClientPCInfo(index, clientData, tick):
    #===========================================================================
    # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    # PCOS = clientData.PCOS
    # Resolution = clientData.Resolution
    # Browser = clientData.Browser
    # ScribeType = clientData.ScribeType
    # #ScribeData = clientData.ScribeData
    # 
    # GameWorld.DebugLog("ReceiveClientPCInfo %s" % ScribeType)
    # GameWorld.DebugLog("    PCOS=%s" % PCOS)
    # GameWorld.DebugLog("    Resolution=%s" % Resolution)
    # GameWorld.DebugLog("    Browser=%s" % Browser)
    # 
    # # ת»¯Îª¶Ô·½ËùÐè¸ñʽ
    # if PCOS and "Windows" in PCOS:
    #    PCOS = " ".join(PCOS.split(" ")[:2])
    # 
    # # ת»¯Îª¶Ô·½ËùÐè¸ñʽ
    # if Resolution:
    #    Resolution = "%s*%s" % eval(Resolution)
    # 
    # if ScribeType == ShareDefine.Def_UserAction_Login:
    #    firstLogin = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FirstLogin)
    #    if not firstLogin:
    #        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FirstLogin, 1)
    #        WriteEvent_entry_firstlogin(curPlayer, Browser, Resolution, PCOS)
    #        if curPlayer.GetLV() == 1:
    #            WriteEvent_level_up(curPlayer) # Ê׵Ƿ¢ËÍÒ»´Î1¼¶Êý¾Ý
    #        GameWorld.DebugLog("    entry_firstlogin")
    #        
    #    WriteEvent_login(curPlayer, Browser, Resolution, PCOS)
    #===========================================================================
            
    return
#// A2 19 ÓÎÏ·½¨ÒéÊÕ¼¯ #tagCMAdviceSubmit
#
#struct    tagCMAdviceSubmit
#{
#    tagHead        Head;
#    BYTE        Type;        //Ìá½»ÀàÐÍ
#    WORD        Len;
#    char        Content[Len];    //size = Len
#};
def OnSubmitBugSuggest(index, clientData, tick):
    #===========================================================================
    # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    # subType = clientData.Type
    # content = clientData.Content
    # eventName = Def_Custom_Events_Bug if subType == 0 else Def_Custom_Events_Suggest
    # WriteEvent_custom_events(curPlayer, eventName, content)
    # DataRecordPack.DR_BugSuggest(curPlayer, eventName, content)
    #===========================================================================
    return
def GetScribeEvent_chr_level(curPlayer):
    transCnt, showLV = GameWorld.GetClientLV(curPlayer)
    return transCnt * 1000 + showLV
## -------------------------------------- À©Õ¹×Ô¶¨Òå ---------------------------------------
class horse_class(ScribeEvent):
    # ×øÆï½ø½×¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(horse_class, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.bef_class_lv = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄ×øÆïµÈ½×, 0´ú±í1½×
        self.bef_exp = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄ×øÆïµÈ½×ÐÇÊýµÄ¾ÑéÖµ
        self.cost_item_cnt = 0 # ´Ë´Î½ø½×ÏûºÄµÄ½ø½×µÀ¾ßÊýÁ¿
        self.aft_class_lv = 0 # ´Ë´Î½ø½×²Ù×÷ºóµÄ×øÆïµÈ½×, 0´ú±í1½×
        self.aft_exp = 0 # ´Ë´Î½ø½×²Ù×÷ºóµÄ×øÆïµÈ½×ÐÇÊýµÄ¾ÑéÖµ
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   str(self.bef_class_lv), str(self.bef_exp), str(self.cost_item_cnt),
                   str(self.aft_class_lv), str(self.aft_exp), self.time]
        
        return super(horse_class, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_HorseClass
    
def WriteEvent_horse_class(curPlayer, befClassLV, befExp, costCnt, aftClassLV, aftExp):
    ## Ð´×øÆï½ø½×¼Ç¼
    #===========================================================================
    # horseClass = horse_class()
    # horseClass.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # horseClass.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # horseClass.chr_name = curPlayer.GetPlayerName()
    # horseClass.bef_class_lv = befClassLV
    # horseClass.bef_exp = befExp
    # horseClass.cost_item_cnt = costCnt
    # horseClass.aft_class_lv = aftClassLV
    # horseClass.aft_exp = aftExp
    # WriteEvent(horseClass)
    #===========================================================================
    return
class wing_class(ScribeEvent):
    # ³á°ò½ø½×¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(wing_class, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.bef_class_lv = 0 # µ±Ç°³á°òµÈ½×, 0´ú±í1½×
        self.bef_exp = 0 # ½ø½×²Ù×÷ǰµÄ×£¸£Öµ
        self.cost_item_cnt = 0 # ´Ë´Î½ø½×ÏûºÄµÄ½ø½×µÀ¾ßÊýÁ¿
        self.aft_class_lv = 0 # ´Ë´Î½ø½×²Ù×÷ºó³á°òµÄµÈ½×, 0´ú±í1½×
        self.aft_exp = 0 # ½ø½×²Ù×÷ºóµÄ×£¸£Öµ
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   str(self.bef_class_lv), str(self.bef_exp), str(self.cost_item_cnt),
                   str(self.aft_class_lv), str(self.aft_exp), self.time]
        
        return super(wing_class, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_WingClass
    
def WriteEvent_wing_class(curPlayer, befClassLV, befExp, costCnt, aftClassLV, aftExp):
    ## д³á°ò½ø½×¼Ç¼
    #===========================================================================
    # wingClass = wing_class()
    # wingClass.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # wingClass.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # wingClass.chr_name = curPlayer.GetPlayerName()
    # wingClass.bef_class_lv = befClassLV
    # wingClass.bef_exp = befExp
    # wingClass.cost_item_cnt = costCnt
    # wingClass.aft_class_lv = aftClassLV
    # wingClass.aft_exp = aftExp
    # WriteEvent(wingClass)
    #===========================================================================
    return
class pet_lv(ScribeEvent):
    # ³èÎïÉý¼¶¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(pet_lv, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.bef_lv = 0 # Éý¼¶Ç°µÈ¼¶, 0´ú±í1ÐÇ
        self.aft_lv = 0 # ´Ë´ÎÉý¼¶²Ù×÷ºóµÈ¼¶
        self.bef_exp = 0 ## ´Ë´Î½ø½×²Ù×÷ǰµÄ¾ÑéÖµ
        self.aft_exp = 0 ## ´Ë´Î½ø½×²Ù×÷ºóµÄ¾ÑéÖµ
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   str(self.bef_lv), str(self.aft_lv), str(self.bef_exp), str(self.aft_exp), self.time]
        
        return super(pet_lv, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_PetLV
    
def WriteEvent_pet_lv(curPlayer, befLV, aftLV, befExp, aftExp):
    ## д³èÎïÉý¼¶¼Ç¼
    #===========================================================================
    # petLV = pet_lv()
    # petLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # petLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # petLV.chr_name = curPlayer.GetPlayerName()
    # petLV.bef_lv = befLV
    # petLV.aft_lv = aftLV
    # petLV.bef_exp = befExp
    # petLV.aft_exp = aftExp
    # WriteEvent(petLV)
    #===========================================================================
    return
class pet_class(ScribeEvent):
    # ³èÎï½ø½×¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(pet_class, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.pet_name = "" # ³èÎïÃû³Æ
        self.bef_class_lv = 0 # ²Ù×÷ǰµÄµÈ½×, 0´ú±í1½×
        self.bef_exp = 0 # ²Ù×÷ǰµÄ×£¸£Öµ
        self.aft_class_lv = 0 # ´Ë´Î½ø½×²Ù×÷ºóµÄµÈ½×
        self.aft_exp = 0 # ½ø½×²Ù×÷ºóµÄ×£¸£Öµ
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.pet_name, str(self.bef_class_lv), str(self.bef_exp), 
                   str(self.aft_class_lv), str(self.aft_exp), self.time]
        
        return super(pet_class, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_PetClass
    
def WriteEvent_pet_class(curPlayer, petName, befClassLV, befExp, aftClassLV, aftExp):
    ## д³èÎï½ø½×¼Ç¼
    #===========================================================================
    # petLV = pet_class()
    # petLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # petLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # petLV.chr_name = curPlayer.GetPlayerName()
    # petLV.pet_name = petName
    # petLV.bef_class_lv = befClassLV
    # petLV.bef_exp = befExp
    # petLV.aft_class_lv = aftClassLV
    # petLV.aft_exp = aftExp
    # WriteEvent(petLV)
    #===========================================================================
    return
class give_money(ScribeEvent):
    # »õ±Ò²ú³ö¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(give_money, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.source = "" # À´Ô´
        self.type_name = "" # »õ±ÒÃû³Æ
        self.addMoney = 0 # ²ú³öÊýÁ¿
        self.total_money = 0 # Ê£Óà»õ±Ò×ÜÁ¿
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.source, self.type_name, str(self.addMoney), str(self.total_money), self.time]
        
        return super(give_money, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_GiveMoney
    
def WriteEvent_give_money(curPlayer, source, typeName, addMoney, totalMoney):
    ## д»õ±Ò²ú³ö¼Ç¼
    #===========================================================================
    # giveMoney = give_money()
    # giveMoney.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # giveMoney.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # giveMoney.chr_name = curPlayer.GetPlayerName()
    # giveMoney.source = source
    # giveMoney.type_name = typeName
    # giveMoney.addMoney = addMoney
    # giveMoney.total_money = totalMoney
    # WriteEvent(giveMoney)
    #===========================================================================
    return
class pay_money(ScribeEvent):
    # »õ±ÒÏûºÄ¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(pay_money, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.reason_name = "" # Ïû·Ñµã
        self.type_name = "" # »õ±ÒÃû³Æ
        self.costmoney = 0 # ÏûºÄÊýÁ¿
        self.total_money = 0 # Ê£Óà»õ±Ò×ÜÁ¿
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.reason_name, self.type_name, str(self.costmoney), str(self.total_money), self.time]
        
        return super(pay_money, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_PayMoney
    
def WriteEvent_pay_money(curPlayer, reasonName, typeName, costMoney, totalMoney):
    ## д»õ±ÒÏûºÄ¼Ç¼
    #===========================================================================
    # payMoney = pay_money()
    # payMoney.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # payMoney.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # payMoney.chr_name = curPlayer.GetPlayerName()
    # payMoney.reason_name = reasonName
    # payMoney.type_name = typeName
    # payMoney.costmoney = costMoney
    # payMoney.total_money = totalMoney
    # WriteEvent(payMoney)
    #===========================================================================
    return
class equip_item(ScribeEvent):
    # Íæ¼Ò×°±¸Í³¼Æ
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(equip_item, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.equip_place = 0 # ×°±¸Î»
        self.class_lv = 0 # ×°±¸½×Êý, 0ÐÂÊÖ½×, 1-1½×
        self.item_quality = 0 # Æ·ÖÊ
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   str(self.equip_place), str(self.class_lv), str(self.item_quality), self.time]
        
        return super(equip_item, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_EquipItem
    
def WriteEvent_orange_equip(curPlayer, place, classLV, quality):
    ## Ð´Íæ¼Ò×°±¸Í³¼Æ
    #===========================================================================
    # equipItem = equip_item()
    # equipItem.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # equipItem.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # equipItem.chr_name = curPlayer.GetPlayerName()
    # equipItem.equip_place = place
    # equipItem.class_lv = classLV
    # equipItem.item_quality = quality
    # WriteEvent(equipItem)
    #===========================================================================
    return
class item_record(ScribeEvent):
    # ÎïÆ·Á÷Ë®¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(item_record, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.rec_type = 0 # »ñµÃ¡¢Ê§È¥
        self.event_name = "" # ʼþµãÃû³Æ
        self.item_name = "" # ÎïÆ·Ãû
        self.item_count = 0 # ÎïÆ·ÊýÁ¿
        self.guid = "" # ÎïÆ·Î¨Ò»ID
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   str(self.rec_type), self.event_name, self.item_name, str(self.item_count), self.guid, self.time]
        
        return super(item_record, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_ItemRecord
    
def WriteEvent_item_record(curPlayer, recType, operateType, itemData, operatorExtra):
    EventReport(ShareDefine.Def_UserAction_ItemRecord, "Flow=%s&OperateType=%s&ItemData=%s&OperatorExtra=%s" 
                % (recType, operateType, 
                   json.dumps(itemData, ensure_ascii=False), 
                   json.dumps(operatorExtra, ensure_ascii=False)), curPlayer)
    return
    #===============================================================================================
    # ''' @todo: ÎïÆ·Á÷Ë®¼Ç¼
    #    @param recType: 1-»ñµÃ£»-1-ʧȥ
    # '''
    # itemRecord = item_record()
    # itemRecord.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # itemRecord.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # itemRecord.chr_name = curPlayer.GetPlayerName()
    # itemRecord.rec_type = recType
    # itemRecord.event_name = eventName
    # itemRecord.item_name = itemName
    # itemRecord.item_count = itemCount
    # itemRecord.guid = guid
    # WriteEvent(itemRecord)
    # return
    #===============================================================================================
class coin_to_gold(ScribeEvent):
    # ¶Ò»»µãȯ
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(coin_to_gold, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.order_id = "" # ¶©µ¥ID
        self.event_name = "" # ʼþµãÃû³Æ
        self.coin = 0 # ¶Ò»»µãȯ
        self.coin_prize = 0 # ½±Àøµãȯ
        self.gold = 0 # »ñµÃ×êʯ
        self.total_gold = 0 # µ±Ç°×Ü×êʯÊý
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.order_id, self.event_name, str(self.coin), str(self.coin_prize), str(self.gold), 
                   str(self.total_gold), self.time]
        
        return super(coin_to_gold, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_CoinToGold
   
def WriteEvent_coin_to_gold(curPlayer, orderID, eventName, coin, prizeCoin, addGold):
    return
    #===========================================================================
    # coinToGold = coin_to_gold()
    # coinToGold.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # coinToGold.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # coinToGold.chr_name = curPlayer.GetPlayerName()
    # coinToGold.order_id = orderID
    # coinToGold.event_name = eventName
    # coinToGold.coin = coin
    # coinToGold.coin_prize = prizeCoin
    # coinToGold.gold = addGold
    # coinToGold.total_gold = curPlayer.GetGold()
    # WriteEvent(coinToGold)
    #===========================================================================
    return
class god_weapon_lv(ScribeEvent):
    # Éñ±øÉý¼¶¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(god_weapon_lv, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.god_weapon_name = "" # Éñ±øÃû³Æ
        self.bef_lv = 0 # ´Ë´Î²Ù×÷ǰµÄµÈ¼¶, 0´ú±í0¼¶, 1´ú±í+1¼¶
        self.bef_exp = 0 # ´Ë´Î²Ù×÷ǰµÄ¾ÑéÖµ
        self.cost_item_cnt = 0 # ´Ë´ÎÏûºÄµÄµÀ¾ßÊýÁ¿
        self.aft_lv = 0 # ´Ë´Î²Ù×÷ºóµÄµÈ¼¶, 0´ú±í0¼¶, 1´ú±í+1¼¶
        self.aft_exp = 0 # ´Ë´Î½ø½×²Ù×÷ºóµÄ¾ÑéÖµ
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.god_weapon_name, str(self.bef_lv), str(self.bef_exp), str(self.cost_item_cnt),
                   str(self.aft_lv), str(self.aft_exp), self.time]
        
        return super(god_weapon_lv, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_GodWeaponLV
    
def WriteEvent_god_weapon_lv(curPlayer, godWeaponName, befLV, befExp, costCnt, aftLV, aftExp):
    ## дÉñ±øÉý¼¶¼Ç¼
    #===========================================================================
    # godWeaponLV = god_weapon_lv()
    # godWeaponLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # godWeaponLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # godWeaponLV.chr_name = curPlayer.GetPlayerName()
    # godWeaponLV.god_weapon_name = godWeaponName
    # godWeaponLV.bef_lv = befLV
    # godWeaponLV.bef_exp = befExp
    # godWeaponLV.cost_item_cnt = costCnt
    # godWeaponLV.aft_lv = aftLV
    # godWeaponLV.aft_exp = aftExp
    # WriteEvent(godWeaponLV)
    #===========================================================================
    return
class rune_lv(ScribeEvent):
    # ·ûÓ¡Éý¼¶¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(rune_lv, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.rune_name = "" # ·ûÓ¡Ãû³Æ
        self.cost_rune_money = 0 # ´Ë´ÎÏûºÄµÄ·ûÓ¡¾«»ª
        self.aft_lv = 0 # ´Ë´Î²Ù×÷ºóµÄµÈ¼¶, 0´ú±í1¼¶
        self.aft_rune_money = 0 # ´Ë´Î²Ù×÷ºóµÄ·ûÓ¡¾«»ª
        
        #·Ç±ØÐë×Ö¶Î
        
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.rune_name, str(self.cost_rune_money), str(self.aft_lv), str(self.aft_rune_money), self.time]
        
        return super(rune_lv, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_RuneLV
    
def WriteEvent_rune_lv(curPlayer, runeName, costruneMoney, aftLV, aftruneMoney):
    ## д·ûÓ¡Éý¼¶¼Ç¼
    #===========================================================================
    # runeLV = rune_lv()
    # runeLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # runeLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # runeLV.chr_name = curPlayer.GetPlayerName()
    # runeLV.rune_name = runeName
    # runeLV.cost_rune_money = costruneMoney
    # runeLV.aft_lv = aftLV
    # runeLV.aft_rune_money = aftruneMoney
    # WriteEvent(runeLV)
    #===========================================================================
    return
class change_name(ScribeEvent):
    # ¸ÄÃû¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(change_name, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.old_name = "" # ÔÀ´µÄÃû×Ö
        self.new_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.account_id, self.chr_name, 
                   self.old_name, self.new_name, self.time]
        
        return super(change_name, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_ChangeName
    
def WriteEvent_change_name(curPlayer, oldName, newName):
    ## ¸ÄÃû¼Ç¼
    #===========================================================================
    # changeName = change_name()
    # changeName.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # changeName.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # changeName.chr_name = curPlayer.GetPlayerName()
    # changeName.old_name = oldName
    # changeName.new_name = newName    
    # WriteEvent(changeName)
    #===========================================================================
    return
class add_zhenqi(ScribeEvent):
    # ÕæÆø²ú³ö¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(add_zhenqi, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.eventName = "" # À´Ô´
        self.eventData = "" # À´Ô´¸½¼ÓÐÅÏ¢
        self.addValue = 0 # ²ú³öÊýÁ¿
        self.totalValue = 0 # Ê£Óà×ÜÁ¿
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.eventName, str(self.eventData), str(self.addValue), str(self.totalValue), self.time]
        
        return super(add_zhenqi, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_AddZhenqi
    
def WriteEvent_add_zhenqi(curPlayer, eventName, eventData, addValue, totalValue):
    ## ÕæÆø²ú³ö¼Ç¼
    #===========================================================================
    # if eventData:
    #    eventData = str(eventData)
    #    eventData = eventData.replace("\"", "'")
    #    eventData = eventData.replace(",", "|")
    #    
    # addZhenQi = add_zhenqi()
    # addZhenQi.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # addZhenQi.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # addZhenQi.chr_name = curPlayer.GetPlayerName()
    # addZhenQi.eventName = eventName
    # addZhenQi.eventData = eventData
    # addZhenQi.addValue = addValue
    # addZhenQi.totalValue = totalValue
    # WriteEvent(addZhenQi)
    #===========================================================================
    return
class lost_zhenqi(ScribeEvent):
    # ÕæÆøÏûºÄ¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(lost_zhenqi, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.eventName = "" # ÏûºÄµã
        self.eventData = "" # ÏûºÄµã¸½¼ÓÐÅÏ¢
        self.lostValue = 0 # ÏûºÄÊýÁ¿
        self.totalValue = 0 # Ê£Óà×ÜÁ¿
        
        #·Ç±ØÐë×Ö¶Î
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.eventName, str(self.eventData), str(self.lostValue), str(self.totalValue), self.time]
        
        return super(lost_zhenqi, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_LostZhenqi
    
def WriteEvent_lost_zhenqi(curPlayer, eventName, eventData, lostValue, totalValue):
    ## ÕæÆøÏûºÄ¼Ç¼
    #===========================================================================
    # if eventData:
    #    eventData = str(eventData)
    #    eventData = eventData.replace("\"", "'")
    #    eventData = eventData.replace(",", "|")
    #    
    # lostZhenQi = lost_zhenqi()
    # lostZhenQi.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # lostZhenQi.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # lostZhenQi.chr_name = curPlayer.GetPlayerName()
    # lostZhenQi.eventName = eventName
    # lostZhenQi.eventData = eventData
    # lostZhenQi.lostValue = lostValue
    # lostZhenQi.totalValue = totalValue
    # WriteEvent(lostZhenQi)
    #===========================================================================
    return
class coat_lv(ScribeEvent):
    # ʱװÉý¼¶¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(coat_lv, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.coat_name = "" # ʱװÃû³Æ
        self.bef_lv = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄµÈ¼¶
        self.bef_exp = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄ¾ÑéÖµ
        self.cost_item_cnt = 0 # ´Ë´ÎÏûºÄµÄµÀ¾ßÊýÁ¿
        self.aft_lv = 0 # ´Ë´Î²Ù×÷ºóµÄµÈ¼¶, 0´ú±í0¼¶, 1´ú±í+1¼¶
        self.aft_exp = 0 #´Ë´Î½ø½×²Ù×÷ºóµÄ¾ÑéÖµ
        #·Ç±ØÐë×Ö¶Î
        
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.coat_name, str(self.bef_lv), str(self.bef_exp), str(self.cost_item_cnt), str(self.aft_lv), str(self.aft_exp), self.time]
        
        return super(coat_lv, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_CoatLV
    
def WriteEvent_coat_lv(curPlayer, coatName, befLV, befExp, costItemCnt, aftLV, aftExp):
    return
    ## дʱװÉý¼¶¼Ç¼
    #===========================================================================
    # coatLV = coat_lv()
    # coatLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # coatLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # coatLV.chr_name = curPlayer.GetPlayerName()
    # coatLV.coat_name = coatName
    # coatLV.bef_lv = befLV
    # coatLV.bef_exp = befExp
    # coatLV.cost_item_cnt = costItemCnt
    # coatLV.aft_lv = aftLV
    # coatLV.aft_exp = aftExp
    # WriteEvent(coatLV)
    #===========================================================================
class wingskin_lv(ScribeEvent):
    # ʱװÉý¼¶¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(wingskin_lv, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.skin_name = "" # »Ã»¯³á°òÃû³Æ
        self.bef_lv = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄµÈ¼¶
        self.bef_exp = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄ¾ÑéÖµ
        self.cost_item_cnt = 0 # ´Ë´ÎÏûºÄµÄµÀ¾ßÊýÁ¿
        self.aft_lv = 0 # ´Ë´Î²Ù×÷ºóµÄµÈ¼¶, 0´ú±í0¼¶, 1´ú±í+1¼¶
        self.aft_exp = 0 #´Ë´Î½ø½×²Ù×÷ºóµÄ¾ÑéÖµ
        #·Ç±ØÐë×Ö¶Î
        
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.skin_name, str(self.bef_lv), str(self.bef_exp), str(self.cost_item_cnt), str(self.aft_lv), str(self.aft_exp), self.time]
        
        return super(wingskin_lv, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_WingSkinLV
    
def WriteEvent_wingskin_lv(curPlayer, skinName, befLV, befExp, costItemCnt, aftLV, aftExp):
    ## д»Ã»¯³á°òÉý¼¶¼Ç¼
    #===========================================================================
    # wingskinLV = wingskin_lv()
    # wingskinLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # wingskinLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # wingskinLV.chr_name = curPlayer.GetPlayerName()
    # wingskinLV.skin_name = skinName
    # wingskinLV.bef_lv = befLV
    # wingskinLV.bef_exp = befExp
    # wingskinLV.cost_item_cnt = costItemCnt
    # wingskinLV.aft_lv = aftLV
    # wingskinLV.aft_exp = aftExp
    # WriteEvent(wingskinLV)
    #===========================================================================
    return
class horseskin_lv(ScribeEvent):
    # ʱװÉý¼¶¼Ç¼
    def __init__(self):
        #±ØÐë×Ö¶Î
        super(horseskin_lv, self).__init__()
        self.account_id = "" # Õ˺ŠID£¬Æ½Ì¨ÏÂΨһ£¬ÇÒÖÕÉú²»±ä
        self.chr_name = "" # Íæ¼Ò½ÇÉ«Ãû
        
        self.skin_name = "" # »Ã»¯×øÆïÃû³Æ
        self.bef_lv = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄµÈ¼¶
        self.bef_exp = 0 # ´Ë´Î½ø½×²Ù×÷ǰµÄ¾ÑéÖµ
        self.cost_item_cnt = 0 # ´Ë´ÎÏûºÄµÄµÀ¾ßÊýÁ¿
        self.aft_lv = 0 # ´Ë´Î²Ù×÷ºóµÄµÈ¼¶, 0´ú±í0¼¶, 1´ú±í+1¼¶
        self.aft_exp = 0 #´Ë´Î½ø½×²Ù×÷ºóµÄ¾ÑéÖµ
        #·Ç±ØÐë×Ö¶Î
        
        #¼´Ê±ÊǷ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.account_id, self.chr_name, 
                   self.skin_name, str(self.bef_lv), str(self.bef_exp), str(self.cost_item_cnt), str(self.aft_lv), str(self.aft_exp), self.time]
        
        return super(horseskin_lv, self).GetEventStr(tmpList)
    
    def GetScribeEventName(self): return ShareDefine.Def_UserAction_HorseSkinLV
    
def WriteEvent_horseskin_lv(curPlayer, skinName, befLV, befExp, costItemCnt, aftLV, aftExp):
    ## д»Ã»¯×øÆïÉý¼¶¼Ç¼
    #===========================================================================
    # horseSkinLV = horseskin_lv()
    # horseSkinLV.SetEventAgentInfo(GameWorld.GetPlayerPlatform(curPlayer.GetAccID()))
    # horseSkinLV.account_id = GameWorld.GetPlatformAccID(curPlayer.GetAccID())
    # horseSkinLV.chr_name = curPlayer.GetPlayerName()
    # horseSkinLV.skin_name = skinName
    # horseSkinLV.bef_lv = befLV
    # horseSkinLV.bef_exp = befExp
    # horseSkinLV.cost_item_cnt = costItemCnt
    # horseSkinLV.aft_lv = aftLV
    # horseSkinLV.aft_exp = aftExp
    # WriteEvent(horseSkinLV)
    #===========================================================================
    return
## ---------------------------------------------------------------------------------------
#------------------------2018-02-09  еÄÊý¾Ýͳ¼Æ--------------------------------
def WriteEvent_Entry(curPlayer, step):
    EventReport(ShareDefine.Def_UserAction_LostModel, "Step=%s&Flag=%s"%(step, ShareDefine.Def_UserAction_CreateRole), curPlayer)
    
def WriteEvent_VIP(curPlayer):
    EventReport(ShareDefine.Def_UserAction_VIPLvUP, "VIPLevel=%s"%curPlayer.GetVIPLv(), curPlayer)
    
def WriteEvent_FightPower(curPlayer):
    EventReport(ShareDefine.Def_UserAction_FightPower, "FightPower=%s"%curPlayer.GetFightPower(), curPlayer)