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