#!/usr/bin/python # -*- coding: GBK -*- # # @todo: # # @author: Alee # @date 2018-1-3 ÏÂÎç05:47:38 # @version 1.0 # # @note: # #--------------------------------------------------------------------- #ϵͳ import os import sys import time import datetime from binary.PyNetwork import * from threading import Thread import logging from DataReader import MapEventPointReader, ChinMapReader import ConfigurationReader.RobotsConfigReader import ConfigurationReader.ConfigIniReader from Robot.RobotMgr import * import traceback import base64 import pymongo import datetime ServerDBConfigPath1 = r"\Config\config.ini" ServerDBConfigPath2 = r"\PyMongoDataServer.ini" g_starttime = time.time() BASE64_ENCODE_CNT = 3 XOR_KEY = 151 def GetEncodePsw(psw): ret = "" try: for i in range(BASE64_ENCODE_CNT): psw = base64.decodestring(psw) except: return False,ret for i in psw: ret += chr(ord(i)^XOR_KEY) return True, ret TYPE_Time_Format = "%Y-%m-%d %H:%M:%S" def GetDateTimeByStr(timeStr): timeStr = timeStr.strip().split(".")[0] try: return datetime.datetime.strptime(timeStr, TYPE_Time_Format) except BaseException , e : return return def ChangeTimeStrToNum(timeStr, timeFormat=TYPE_Time_Format): timeStr = datetime.datetime.strptime(timeStr, timeFormat).timetuple() return int(time.mktime(timeStr)) # Êý¾Ý¿â¹ÜÀí class MongoDBRobot(): def __init__(self): self.user = "" self.pwd = "" self.dbIP = "" self.dbName = "" self.logdb = None self.interfaceDatadb = None self.userdb = None self.connection = None config = ConfigurationReader.ConfigIniReader.GetConfig() self.PlayerOffTime = config.GetPlayerOffTime() #Íæ¼ÒÏÂÏßʱ³¤ self.ServerDBConfigPath = config.GetServerDBConfigPath() #Êý¾Ý¿â·¾¶ self.InitDBCon() self.tokenList = [] # Êý¾Ý¿â»ñÈ¡£¬µÇ¼ȥ³ý self.maxPlayerCnt = config.GetMaxPlayerCnt() self.loginCnt = 0 self.AccountSource = config.GetAccountSource() def InitDBCon(self): dbConfig = ConfigurationReader.ConfigIniReader.AppConfig(self.ServerDBConfigPath + ServerDBConfigPath1) dbConfig.SetSection( "auth" ) self.user = dbConfig.GetValue("userdb_user") self.pwd = GetEncodePsw(dbConfig.GetValue("userdb_pwd"))[1] dbConfig2 = ConfigurationReader.ConfigIniReader.AppConfig(self.ServerDBConfigPath + ServerDBConfigPath2) dbConfig2.SetSection( "connect" ) self.dbIP = dbConfig2.GetValue("USER_DB_IP") self.connection = pymongo.Connection(self.dbIP, 27017, auto_start_request=False) db = self.connection.admin if not db.authenticate(self.user, self.pwd): logging.error( "!!!InitDBCon error" ) return self.userdb = self.connection[dbConfig2.GetValue("USER_DB_NAME")] logging.info("conn ok-----------") # 1.»ñÈ¡ÍÑ»ú¹ÒÍæ¼ÒÊý¾Ý--GameLog def GetTJGRobot(self): if self.AccountSource == 0: index = 0 if len(sys.argv) == 2: index = sys.argv[1] clientMac = "abc" for i in xrange(self.maxPlayerCnt): accID = "ice%s_%s@yun@s1"%(index, i) account = ("123456789012345678901234567890ab", accID, clientMac, 1) if account not in self.tokenList: self.tokenList.append(account) else: col = self.userdb["tagDSAccount"] account = None for rec in col.find(limit=self.maxPlayerCnt): account = ("123456789012345678901234567890ab", str(rec['ACCID']), 'anc', 1) if account not in self.tokenList: self.tokenList.append(account) print account if self.tokenList: logging.info( "´ýµÇ¼µÄÍÑ»ú¹ÒÍæ¼Ò----:%s"%(len(self.tokenList))) #logging.debug( "´ýµÇ¼µÄÍÑ»ú¹ÒÍæ¼Ò----tokenList:%s"%(self.tokenList)) return def GetTokenList(self): return self.tokenList def AddCrossRobotInfo(self, accID, IPList): account = ("123456789012345678901234567890ab", accID, "abc", 1, IPList) if account not in self.tokenList: self.tokenList.append(account) def RemoveToken(self, value): self.tokenList.remove(value) class WorkerThread(Thread): def __init__(self, mgr, index ): Thread.__init__(self, None, None, "WorkerThreadPy%s"%index) self.mgr = mgr self.clsTick = 30 self.lastClsTick = 0 def run(self): logging.debug( "thread %s start" % self.getName() ) while 1: try: #Ïß³Ì1 »ñÈ¡ÍÑ»ú¹ÒÍæ¼ÒÊý¾Ý£¬¼ÓÈëµ½robotmgr self.mgr.ThreadRun() time.sleep( 0.01 ) # Ãë if time.time() - self.lastClsTick > self.clsTick: os.system("cls") self.lastClsTick = time.time() except Exception, e: print str(e) print traceback.print_exc() logging.error( "WorkerThread: %s"%str(e) ) logging.error( "WorkerThread: %s"%traceback.print_exc() ) # 1.»ñÈ¡ÍÑ»ú¹ÒÍæ¼ÒÊý¾Ý--GameLog # 2.³õʼ»¯ÍÑ»ú¹ÒÍæ¼ÒµÄrobot¼ÓÈëmgr # 3.ÇëÇóÐÂtokenµÇ¼--InterfaceData # 4.µÇ¼ºóÔÚ0107loadmapok°üǰ·¢ËÍÍÑ»úµÇ¼ÏûÏ¢£¬ÓÃÓÚÇø·ÖÍæ¼ÒÕæÊµµÇ¼ # 5.ÍÑ»ú¹ÒÍæ¼Ò·À³ÁÃÔÂß¼­ÐÞÕý£¬¸ù¾Ý4Ìõ¼þ def StartApp( PyBaseRoot ): logging.info( "PyBaseRoot:%s" % PyBaseRoot ) titleMark = 0 if len(sys.argv) == 2: titleMark = sys.argv[1] os.system("title %s-Robot-%s"%(titleMark, datetime.datetime.today())) #¶ÁÈ¡¸÷ÖÖÅäÖã¨IP£¬¶Ë¿Ú£¬VERSION_NOµÈ£© ConfigurationReader.ConfigIniReader.ReadConfig( PyBaseRoot + "Configuration\\Config.ini" ) config = ConfigurationReader.ConfigIniReader.GetConfig() #logging.info( "ConfigData:%s" % str(config) ) dbRobot = MongoDBRobot() #¶ÁÈ¡¸÷ÖÖÊý¾Ý£¨µØÍ¼£©, ÍÑ»ú¹ÒÖ±½Ó·ÉÐÐ #MapDataReader.ReadMapData( PyBaseRoot ) #TransportDataReader.ReadTransportData( PyBaseRoot ) MapEventPointReader.ReadMapEventPoint(PyBaseRoot) ChinMapReader.ReadChinMapData(PyBaseRoot) #³õʼ»¯ÍøÂ磨Asio£© asioMgr = CAsioMgr() ret = asioMgr.InitModule( config.GetVersionNo(), config.GetPackStartCount(),\ config.GetKeyString(), PyBaseRoot + config.GetSendKeyDictFilePath() ) if not ret: logging.fatal( "Init PyNetwork failed." ) return else: logging.debug( "Init PyNetwork success." ) #´´½¨ÍøÂçÄ£¿é¹¤×÷Ị̈߳¬ÕâЩÏß³ÌÊýÁ¿²»Ò˹ý¶à£¬ÒÔÃâ³öÏÖ´óÁ¿¾ºÕù #½¨Òéȡֵ·¶Î§ÔÚ nThreadsµ½2*nThreadsÖ®¼ä nThreads = asioMgr.GetProcessorNumber() logging.info( "Host has %d logic processor." % nThreads ) IO_WORKER_THREAD_NUM = config.GetIOThreadNum() threadList = [] logging.info( "Create %d IO Threads....." % IO_WORKER_THREAD_NUM ) for i in range( IO_WORKER_THREAD_NUM ): th = WorkerThread( asioMgr, i ) threadList.append( th ) th.start() dbRobot.GetTJGRobot() #´´½¨RobotMgr£¬Ìṩ»úÆ÷ÈË×ÜÊý£¨´ËMgrÄÚ²¿»á´´½¨AIÏß³ÌÓÃÓÚ½øÐÐAI´¦Àí£© CreateRobotMgr( asioMgr, dbRobot)