#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#---------------------------------------------------------------------  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
##@package GMT_AddNewGuyCard.py  
 | 
# GMÃüÁîGM¹¤¾ßÉú³ÉÐÂÊÖ¿¨  
 | 
#  
 | 
# @author wdb  
 | 
# @date 2012-06-21  
 | 
# @version 1.3  
 | 
#  
 | 
# @note  
 | 
# @change: "2012-06-27 12:00" wdb È¥³ýÐÂÊÖ¿¨ÀàÐÍ×î´ó29ÏÞÖÆ£¬¸ÄÓÿªÊ¼Ë÷ÒýÈ¡´úÊýÁ¿  
 | 
# @change: "2012-07-13 10:00" wdb Ð޸ĻñµÃÍæ¼Òid´íÎó  
 | 
# @change: "2012-07-30 11:30" wdb GM»Ø¸´Ï¸»¯£¬´úÂëÓÅ»¯  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2012-07-30 11:30"""  
 | 
#---------------------------------------------------------------------  
 | 
#µ¼Èë  
 | 
from MangoDBCommon import fix_incomingText  
 | 
from Collections import DataServerPlayerData  
 | 
from Collections.CollectionDefine import *  
 | 
from Common import mylog  
 | 
import GMCommon  
 | 
import md5  
 | 
import binascii  
 | 
import ctypes  
 | 
import traceback  
 | 
#---------------------------------------------------------------------  
 | 
#È«¾Ö±äÁ¿  
 | 
Def_MaxFailCount = 10  # ²åÈëʧ°Ü´óÓÚµÈÓÚ10´Î£¬ÔòÖÕÖ¹²Ù×÷  
 | 
  
 | 
# µ¥´Î²åÈë×î´óÊýÁ¿  
 | 
MaxMakeCount = 500  
 | 
# GM¹¤¾ßÉú³ÉµÄÐÂÊÖ¿¨±êÖ¾  
 | 
StoreInDBCardFlag = 'n'  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
## ÊÕµ½gmÃüÁîÖ´ÐÐ  
 | 
# @param gmCmdDict:gmÃüÁî×Öµä  
 | 
# @return None   
 | 
def OnExec(gmCmdDict):           
 | 
  
 | 
    return GMCommon.Def_DoQueryUserDB, ''  
 | 
  
 | 
      
 | 
## ²éѯlogdb·µ»Ø  
 | 
# @param logdb:logdb  
 | 
# @param data:´«ÈëµÄÐÅÏ¢  
 | 
# @param gmCmdDict:gmÃüÁî×Öµä  
 | 
# @return None   
 | 
def LogDBResponse(logdb, data, gmCmdDict):         
 | 
    return GMCommon.Def_ParamErr, ''  
 | 
  
 | 
  
 | 
## ²éѯuserdb·µ»Ø  
 | 
# @param userdb:userdb  
 | 
# @param data:´«ÈëµÄÐÅÏ¢  
 | 
# @param gmCmdDict:gmÃüÁî×Öµä  
 | 
# @return None   
 | 
def UserDBResponse(userdb, data, gmCmdDict):  
 | 
    serverMark = gmCmdDict.get('serverMark', '')  
 | 
    codeKey = gmCmdDict.get('codeKey', '')  
 | 
  
 | 
    cardType = GMCommon.ToIntDef(gmCmdDict.get('cardType', ''))  
 | 
    endIndex = GMCommon.ToIntDef(gmCmdDict.get('endIndex', ''))  
 | 
    startIndex = GMCommon.ToIntDef(gmCmdDict.get('startIndex', ''))  
 | 
    valiDayStr = gmCmdDict.get('validDay', '')  
 | 
          
 | 
    # ²ÎÊý´íÎó  
 | 
    if serverMark == '' or codeKey == '' or cardType <= 0 or (endIndex < startIndex):  
 | 
        return GMCommon.Def_ParamErr, ''  
 | 
      
 | 
    if (endIndex - startIndex + 1) > MaxMakeCount:  
 | 
        return GMCommon.Def_MaxLimit, ''  
 | 
      
 | 
    # »ñµÃÓÐЧʱ¼ä  
 | 
    validTime = ''  
 | 
    if valiDayStr != '':  
 | 
        validDay = GMCommon.ToIntDef(valiDayStr)  
 | 
        # ÉèÖôíÎó  
 | 
        if validDay <= 0:  
 | 
            return GMCommon.Def_InvalidTime, ''  
 | 
          
 | 
        curDateTime = GMCommon.GetDatetimeByPlusDays(validDay)  
 | 
        validTime = str(curDateTime).split(".")[0]  
 | 
      
 | 
    # ²åÈëʧ°ÜµÄ¿¨Êý¾Ý  
 | 
    failCardList = []  
 | 
    failCount = 0  
 | 
      
 | 
    collection = userdb[UCN_DBNewGuyCardState]  
 | 
    for index in xrange(startIndex, endIndex + 1):  
 | 
          
 | 
        # Éú³Éп¨  
 | 
        cardID = MakeNewCardID(serverMark, codeKey, cardType, index)    
 | 
        if cardID == '':  
 | 
            return GMCommon.Def_MakeNewCardFail, ''  
 | 
          
 | 
        # Éú³É¿¨ºÅ²»Öظ´£¬¿ÉÒÔ²åÈë  
 | 
        if collection.find({'CardID':fix_incomingText(cardID)}).count() <= 0:  
 | 
              
 | 
            cardObj = DataServerPlayerData.tagDBNewGuyCardState()  
 | 
            cardObj.CardIDLen = len(cardID)  
 | 
            cardObj.CardID = cardID  
 | 
            cardObj.IsUsed = 0  
 | 
            cardObj.UserDataLen = 0  
 | 
            cardObj.UserData = ''  
 | 
            cardObj.CardType = cardType  
 | 
            cardObj.ValidTime = validTime  
 | 
  
 | 
            # ²åÈë³É¹¦£¬¼ÌÐø²åÈë  
 | 
            if cardObj.adoInsert(collection):  
 | 
                continue  
 | 
                     
 | 
        failCardList.append(cardID)   
 | 
        failCount += 1        
 | 
        #ʧ°Ü´ÎÊýδµ½ÉÏÏÞ        
 | 
        if failCount >= Def_MaxFailCount:  
 | 
            break  
 | 
      
 | 
    # ²Ù×÷½á¹ûÐÅÏ¢£¬·µ»Ø¸ögm¹¤¾ß  
 | 
    gmCmdDict['lastIndex'] = index  
 | 
    gmCmdDict['failCount'] = failCount  
 | 
    gmCmdDict['failCard'] = failCardList  
 | 
                  
 | 
    # ¼Ç¼Á÷Ïò     
 | 
    dataDic = {"PlayerID":0, 'AccID':''}  
 | 
    GMCommon.SendEventPack(gmCmdDict.get(GMCommon.Def_GMKey_Type, ''), dataDic, str(gmCmdDict))  
 | 
       
 | 
    if failCount >= Def_MaxFailCount:  
 | 
        return GMCommon.Def_InsertFail, gmCmdDict  
 | 
          
 | 
    return GMCommon.Def_Success, gmCmdDict  
 | 
  
 | 
  
 | 
## Éú³É¿¨ºÅº¯Êý  
 | 
# @param serverMark:·þÎñÆ÷±êÖ¾  
 | 
# @param codeKey:Éú³ÉÃÜÂë  
 | 
# @param cardType:¿¨µÄÀàÐÍ  
 | 
# @param index:¿¨µÄË÷Òý  
 | 
# @return ¿¨ºÅ  
 | 
def MakeNewCardID(serverMark, codeKey, cardType, index):  
 | 
      
 | 
    try:  
 | 
        markMD5 = md5.md5('wyOu' + serverMark + str(cardType)).hexdigest()  
 | 
        realStr = str(index)*2 + markMD5 + codeKey  
 | 
        result = md5.md5(realStr).hexdigest()  
 | 
  
 | 
        #crcÉú³É  
 | 
        crc = binascii.crc32(result)  
 | 
        crc = ctypes.c_uint32(crc).value  
 | 
        # GM¹¤¾ßÉú³ÉµÄÐÂÊÖ¿¨±êÖ¾  
 | 
        result = StoreInDBCardFlag + hex(crc).replace('0x', '', 1)  
 | 
          
 | 
    except BaseException:  
 | 
        mylog.warning('GM ->MakeNewCardID error -> %s'%(traceback.format_exc()))  
 | 
        return ''  
 | 
      
 | 
    return result  
 | 
  
 | 
      
 | 
      
 |