#!/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
|
|
|
|