def run(self): try: BotList = [] ssbot = SubspaceBot(False,False,self.MQueue,logging.getLogger("ML." +self.type +".Core")) ssbot.setBotInfo(self.type,self.description,self.owner) self.ssbot = ssbot ssbot.arena = self.arena# serexl's bots look at arena in init bot = None for m in self.modules: bot = LoadBot(ssbot,m[0],m[1],self.inifile,self.args,logging.getLogger("ML." +self.type +"."+ m[0])) if bot: BotList.append (bot) bot = None retry = 0 while self.keepgoing: ssbot.connectToServer(self.host, self.port, self.bname, self.bpassword, self.arena) while ssbot.isConnected() and self.keepgoing: retry = 0 event = ssbot.waitForEvent() for b in BotList: b.HandleEvents(ssbot,event); if ssbot.shouldReconnect() and retry < 6: self.logger.debug("Disconnected...") ssbot.resetState() retry +=1 time.sleep(60*retry) self.logger.debug("Reconnecting...") else: break except: LogException(self.logger) finally: if ssbot.isConnected(): ssbot.disconnectFromServer() for b in BotList: b.Cleanup()
def MasterMain(): try: #other bots use logging i dont want it to spamm the main logger rootlogger = logging.getLogger('') rootlogger.addHandler(NullHandler()) rootlogger.setLevel(logging.DEBUG) #logging.basicConfig(level=logging.ERROR, # format='%(asctime)s:%(name)s:%(levelname)s:%(message)s', # datefmt='%m-%d %H:%M') logger = logging.getLogger("ML") logger.setLevel(logging.DEBUG) # set a format formatter = logging.Formatter('%(asctime)s:%(name)s:%(levelname)s:%(message)s') # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler() console.setLevel(logging.DEBUG) # tell the handler to use this format console.setFormatter(formatter) # add the handler to the mainloop logger logger.addHandler(console) filehandler = logging.FileHandler(os.path.join(os.getcwd(),"Bots.log"),mode='a') filehandler.setLevel(logging.ERROR) filehandler.setFormatter(formatter) logger.addHandler(filehandler) #command Line Options parser = OptionParser() parser.add_option("-c", "--ConfigFile", dest="ConfigFile", help="Load Configuration from a non default file", default=os.path.join(os.getcwd(),"Bots.json")) parser.add_option("-p", "--Password", dest="Password", help="pass sysop/smod pass by commandline instead of in config", default=None) (options, args) = parser.parse_args() Queue = MasterQue() ssbot = SubspaceBot(False,True,Queue,logging.getLogger("ML.Master.Core")) ssbot.setBotInfo("Master","MasterBot Manages the starting/stopping of bots", None) BotList = [ ] config = GlobalConfiguration(options.ConfigFile,options.Password) #this adds dir's to pythonpath so we can run the dev code out of seperate dirs for p in config.paths: sys.path.append(p) #get the module object for the current file... module = sys.modules[globals()['__name__']] #loads atleast the masterbot md = ModuleData("Master",module,"None",config.ConfigurationFile,"",logging.getLogger("ML.Master")) master = Bot(ssbot,md,config,Queue) BotList.append(master) #load any bots that are specified in the config bot = None for m in config.Modules: bot = LoadBot(ssbot,m[0],m[1],config.ConfigurationFile,"",logging.getLogger("ML.Master." + m[0])) if bot: BotList.append (bot) bot = None wait_time = 0 while ssbot.shouldReconnect(): ssbot.connectToServer(config.Host, config.Port, config.MasterName, config.MasterPassword, config.MasterArena) while ssbot.isConnected(): wait_time = 0 event = ssbot.waitForEvent() for b in BotList: b.HandleEvents(ssbot,event) logger.critical("Master disconnected") if ssbot.shouldReconnect(): ssbot.resetState() wait_time+=60 if wait_time > 600: #if wait is over 10 mins reset wait period wait_time = 0 time.sleep(wait_time) # wait a little longer if retry fails each time logger.critical("Reconnecting") except (KeyboardInterrupt, SystemExit): logger.critical("CTRL-c or System.exit() detected") except: logger.critical("Unhandled Exception") LogException(logger) finally: if ssbot.isConnected(): ssbot.disconnectFromServer() logger.info( "Master disconnected" ) logger.info( "Waiting For Bots to stop") logger.critical("Master shutting down") master.StopAllBots() logger.critical("Requested Stop for all active bots...") for b in BotList: b.Cleanup() logger.critical("Master Bot behaviors cleansed") filehandler.close() sys.exit(1)