#!/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 = 200  
 | 
        self.loginCnt = 0  
 | 
    #===========================================================================  
 | 
    # def InitDBCon(self):  
 | 
    #    dbConfig = ConfigurationReader.ConfigIniReader.AppConfig(self.ServerDBConfigPath + ServerDBConfigPath1)  
 | 
    #    dbConfig.SetSection( "auth" )  
 | 
    #    self.user = dbConfig.GetValue("logdb_user")  
 | 
    #    self.pwd = GetEncodePsw(dbConfig.GetValue("logdb_pwd"))[1]  
 | 
    #      
 | 
    #    dbConfig2 = ConfigurationReader.ConfigIniReader.AppConfig(self.ServerDBConfigPath + ServerDBConfigPath2)  
 | 
    #    dbConfig2.SetSection( "connect" )  
 | 
    #    self.dbIP = dbConfig2.GetValue("LOG_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  
 | 
    #      
 | 
    #    #print dbConfig2.GetValue("LOG_DB_NAME"), "--------------"  
 | 
    #      
 | 
    #    self.logdb = self.connection[dbConfig2.GetValue("LOG_DB_NAME")]  
 | 
    #    #self.interfaceDatadb = self.connection[dbConfig2.GetValue("INTERFACE_DB_NAME")]  
 | 
    #    self.userdb = self.connection[dbConfig2.GetValue("USER_DB_NAME")]  
 | 
    #      
 | 
    #    logging.info("conn ok-----------")  
 | 
    #===========================================================================  
 | 
          
 | 
    # 1.»ñÈ¡ÍÑ»ú¹ÒÍæ¼ÒÊý¾Ý--GameLog  
 | 
    def GetTJGRobot(self):  
 | 
        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)  
 | 
              
 | 
              
 | 
        if self.tokenList:  
 | 
            logging.info( "´ýµÇ¼µÄÍÑ»ú¹ÒÍæ¼Ò----:%s"%(len(self.tokenList)))  
 | 
            #logging.debug( "´ýµÇ¼µÄÍÑ»ú¹ÒÍæ¼Ò----tokenList:%s"%(self.tokenList))  
 | 
          
 | 
        return  
 | 
      
 | 
    def GetTokenList(self):  
 | 
        return self.tokenList  
 | 
      
 | 
    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)  
 | 
  
 | 
      
 | 
     
 |