def bot_main(bot_class, debug=False, is_master=False, arena="#python"): """Use this method to test bots during development (to run bots in stand-alone mode) """ from Credentials import botowner, botname, botpassword try: logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # set a format str_format = '%(asctime)s:%(name)s:%(levelname)s:%(message)s' formatter = logging.Formatter(str_format) # 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.getcwd() + R"/" + __name__ + ".log", mode='a') filehandler.setLevel(logging.ERROR) filehandler.setFormatter(formatter) logger.addHandler(filehandler) ssbot = SubspaceBot(debug, is_master, None, logging.getLogger(__name__ + ".Core")) ssbot.set_bot_info(__name__, "TestBoT", botowner) # get the module object for the current file... module = sys.modules[globals()['__name__']] md = ModuleData("TesttBot", module, "None", "test.ini", "", logging.getLogger(__name__)) bot = bot_class(ssbot, md) ssbot.connect_to_server('66.36.247.83', 7900, botname, botpassword, arena) while ssbot.is_connected(): event = ssbot.wait_for_event() bot.handle_events(ssbot, event) except Exception as e: log_exception(logger) raise e finally: bot.cleanup() logger.critical("Testbot shutting down") filehandler.close()
def bot_main(bot_class, debug=False, is_master=False, arena="#python"): """Use this method to test bots during development (to run bots in stand-alone mode) """ from Credentials import botowner, botname, botpassword try: logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # set a format str_format = '%(asctime)s:%(name)s:%(levelname)s:%(message)s' formatter = logging.Formatter(str_format) # 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.getcwd() + R"/" + __name__ + ".log", mode='a') filehandler.setLevel(logging.ERROR) filehandler.setFormatter(formatter) logger.addHandler(filehandler) ssbot = SubspaceBot( debug, is_master, None, logging.getLogger(__name__ + ".Core")) ssbot.set_bot_info(__name__, "TestBoT", botowner) # get the module object for the current file... module = sys.modules[globals()['__name__']] md = ModuleData("TesttBot", module, "None", "test.ini", "", logging.getLogger(__name__)) bot = bot_class(ssbot, md) ssbot.connect_to_server( '66.36.247.83', 7900, botname, botpassword, arena) while ssbot.is_connected(): event = ssbot.wait_for_event() bot.handle_events(ssbot, event) except Exception as e: log_exception(logger) raise e finally: bot.cleanup() logger.critical("Testbot shutting down") filehandler.close()
def MasterMain(): ssbot = None master = None BotList = None 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 = MasterQueue() ssbot = SubspaceBot( False, True, Queue, logging.getLogger("ML.Master.Core")) ssbot.set_bot_info("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 = load_bot( 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.should_reconnect(): ssbot.connect_to_server(config.Host, config.Port, config.MasterName, config.MasterPassword, config.MasterArena) while ssbot.is_connected(): wait_time = 0 event = ssbot.wait_for_event() for b in BotList: b.handle_events(ssbot, event) logger.critical("Master disconnected") if ssbot.should_reconnect(): ssbot.reset_state() wait_time += 60 # if wait is over 10 mins reset wait period if wait_time > 600: wait_time = 0 # wait a little longer if retry fails each time time.sleep(wait_time) logger.critical("Reconnecting") except (KeyboardInterrupt, SystemExit): logger.critical("CTRL-c or System.exit() detected") except: logger.critical("Unhandled Exception") log_exception(logger) finally: if ssbot and ssbot.is_connected(): ssbot.disconnect_from_server() logger.info("Master disconnected") logger.info("Waiting For Bots to stop") logger.critical("Master shutting down") if master: master.StopAllBots() logger.critical("Requested Stop for all active bots...") if BotList: for b in BotList: b.cleanup() logger.critical("Master Bot behaviors cleansed") filehandler.close() sys.exit(1)
def MasterMain(): ssbot = None master = None BotList = None 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 = MasterQueue() ssbot = SubspaceBot(False, True, Queue, logging.getLogger("ML.Master.Core")) ssbot.set_bot_info("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 = load_bot(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.should_reconnect(): ssbot.connect_to_server(config.Host, config.Port, config.MasterName, config.MasterPassword, config.MasterArena) while ssbot.is_connected(): wait_time = 0 event = ssbot.wait_for_event() for b in BotList: b.handle_events(ssbot, event) logger.critical("Master disconnected") if ssbot.should_reconnect(): ssbot.reset_state() wait_time += 60 # if wait is over 10 mins reset wait period if wait_time > 600: wait_time = 0 # wait a little longer if retry fails each time time.sleep(wait_time) logger.critical("Reconnecting") except (KeyboardInterrupt, SystemExit): logger.critical("CTRL-c or System.exit() detected") except: logger.critical("Unhandled Exception") log_exception(logger) finally: if ssbot and ssbot.is_connected(): ssbot.disconnect_from_server() logger.info("Master disconnected") logger.info("Waiting For Bots to stop") logger.critical("Master shutting down") if master: master.StopAllBots() logger.critical("Requested Stop for all active bots...") if BotList: for b in BotList: b.cleanup() logger.critical("Master Bot behaviors cleansed") filehandler.close() sys.exit(1)
def run(self): ssbot = None botlist = [] try: ssbot = SubspaceBot(False, False, self.MQueue, logging.getLogger( "ML." + self.type + ".Core")) ssbot.set_bot_info(self.type, self.description, self.owner) self.ssbot = ssbot ssbot.arena = self.arena # serexl's bots look at arena in init for m in self.modules: bot = load_bot( ssbot, m[0], m[1], self.inifile, self.args, logging.getLogger("ML." + self.type + "." + m[0]) ) if bot: botlist.append(bot) retry = 0 while self.keepgoing: ssbot.connect_to_server( self.host, self.port, self.bname, self.bpassword, self.arena ) while ssbot.is_connected() and self.keepgoing: retry = 0 event = ssbot.wait_for_event() for b in botlist: b.handle_events(ssbot, event) if ssbot.should_reconnect() and retry < 6: self.logger.debug("Disconnected...") ssbot.reset_state() retry += 1 time.sleep(60 * retry) self.logger.debug("Reconnecting...") else: break except: log_exception(self.logger) finally: if isinstance(ssbot, SubspaceBot) and ssbot.is_connected(): ssbot.disconnect_from_server() for b in botlist: b.cleanup()