From 532b9f45735b9a1b04667afb83b3fe3203d74ffb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 08 六月 2021 11:49:58 +0800
Subject: [PATCH] 8972 【主干】【BT】【BT2】 GM工具增加激活删除称号命令

---
 Tool/Robot/Robot/RobotMgr.py |   67 +++++++++++++++++++++------------
 1 files changed, 43 insertions(+), 24 deletions(-)

diff --git a/Tool/Robot/Robot/RobotMgr.py b/Tool/Robot/Robot/RobotMgr.py
index 7e88aae..c9e038c 100644
--- a/Tool/Robot/Robot/RobotMgr.py
+++ b/Tool/Robot/Robot/RobotMgr.py
@@ -18,13 +18,14 @@
         Thread.__init__(self, None, None, "AIThreadPy_%s"%index)
         self.robotMgr = robotMgr
         self.AIList = []
-        #config =  ConfigurationReader.ConfigIniReader.GetConfig()
-
-        self.lastTime = 0
+        config =  ConfigurationReader.ConfigIniReader.GetConfig()
+        self.tjgLimitCnt = config.GetTJGLimitCnt()  # 限制脱机数量
+        self.offTime = config.GetPlayerOffTime()    # 获取下线多久的玩家时间
+        self.lastTime = 0   # 控制日志输出频率
         self.badRobotCnt = 0 # 历史异常脱机挂个数
         
         self.ProcessFindTJGTime = 5
-        self.lastLoginTime = 0
+        self.lastLoginTime = 0  # 处理机器人登录的频率
         
     def runThread(self):   
         logging.info( "thread %s start" % self.getName() )
@@ -35,6 +36,11 @@
                 nowTime = time.time()
 
                 if self.lastLoginTime and nowTime - self.lastLoginTime > self.ProcessFindTJGTime:
+                    logging.debug( "self.tjgLimitCnt %s " % self.tjgLimitCnt )
+                    # 限制脱机挂登录数量, 没有实时的玩家上线后会补收益
+                    if self.robotMgr.GetRobotCount() > self.tjgLimitCnt:
+                        self.robotMgr.dbRobot.ClearToken()
+                    
                     self.lastLoginTime = nowTime
                     logoningList = self.robotMgr.GetRobotAccIDList()    # 在登录的机器人
                     
@@ -42,9 +48,14 @@
                     robotList = []
                     for i in xrange(len(tokenList)):
                         tokenInfo = tokenList.pop()
-
-                        if tokenInfo[1] in logoningList:
-                            print "正在登录中------", tokenInfo[1]
+                        accID = tokenInfo[1]
+                        if accID in logoningList:
+                            print "正在登录中------", accID
+                            continue
+                        
+                        lastTime = self.robotMgr.GetNoteLastTimeByAccID(accID)   # 上一次加入队列的时间
+                        if lastTime != 0 and nowTime - lastTime < self.offTime:
+                            # 登录有问题则进入排队
                             continue
                         robot = self.robotMgr.AddRobot(tokenInfo)
                         robotList.append(robot)
@@ -58,7 +69,7 @@
                             continue
                         
                         # 连接-登录-运行AI
-                        if not robot.IsConnected():
+                        if not robot.IsConnected() and robot.GetReconnectCount() < 2:
                             robot.ReCreateRobot()
                             
                     
@@ -67,7 +78,11 @@
                     if index >= self.robotMgr.GetRobotCount():
                         # ProcessAI可能会清除了robot
                         break
-                    robot = self.robotMgr.GetRobot( index )
+                    try:
+                        robot = self.robotMgr.GetRobot( index )
+                    except:
+                        # 判断index防范不到,可能多线程引起,此处报错结束循环
+                        break
                     if not robot:
                         continue
                     robot.GetAIMgr().ProcessAI()
@@ -79,7 +94,11 @@
                 # 队列中清理无效的脱机挂, 一次只清理一个
                 for index in xrange(self.robotMgr.GetRobotCount()):
                     #logging.debug( "Run AI for Index:%d", index )
-                    robot = self.robotMgr.GetRobot( index )
+                    try:
+                        robot = self.robotMgr.GetRobot( index )
+                    except:
+                        # 判断index防范不到,可能多线程引起,此处报错结束循环
+                        break
                     if not robot:
                         print "====没有机器人"
                         self.robotMgr.Remove(robot)
@@ -122,12 +141,22 @@
         self.dbRobot = dbRobot
         self.TeamMgr = {}
         
+        self.LoginHistory = {}  # 记录历史添加时间 {账号:时间} 登录失败需3分钟后方可尝试
+        
         #启动AI线程    
         #config =  ConfigurationReader.ConfigIniReader.GetConfig()
         #AI_THREAD_NUM = config.GetAIThreadNum()
 
         th = AIThread(self, 0)
         th.start()
+
+
+    def NoteHistory(self, accID):
+        self.LoginHistory[accID] = time.time()
+        
+    def GetNoteLastTimeByAccID(self, accID):
+        return self.LoginHistory.get(accID, 0)
+
 
     def GetRobotAccIDList(self):
         self.__robotAccIDs = []
@@ -136,7 +165,9 @@
         return self.__robotAccIDs
 
     def AddRobot(self, tokenInfo):
-
+        
+        self.LoginHistory[tokenInfo[1]] = time.time()   # 账号记录
+        
         #创建Robot实例,具体项目实现相应的RobotBase的子类,在这里创建子类的实例
         logging.debug( "Create Robot index:%s....." % (tokenInfo,)  )
         robot = ProjectRobot( self.__asioMgr, tokenInfo )
@@ -167,19 +198,6 @@
         return n     
         
         
-#===============================================================================
-#    def ConnectServer(self, index ):
-#        
-#        robot = self.GetRobot(index)
-#        if not robot:
-#            return False
-# 
-#        logging.debug( "ConnectServer for %d" % index )
-#        #创建了实例了,这时只需要再次连接即可
-#        robot.ReCreateRobot()
-#        return True
-#===============================================================================
-        
     def GetRobot(self, index ):
         #logging.debug( "GetRobot for %d" % index )
         
@@ -187,6 +205,7 @@
         
     def Remove(self, robot):
         self.__robots.remove(robot)
+        logging.info( "Remove robot 剩余: %s"%len(self.__robots) )
         
         
     def DisconnectServer(self, robot ):

--
Gitblit v1.8.0