def AddToReactor(self, reactor): try: BotList = [] ssbot = SubspaceBot(self.host, self.port, self.bname, self.bpassword, self.arena, False, BM_SLAVE, 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 ssbot.setBotList(BotList) self.listeningport = reactor.listenUDP(0, ssbot) ssbot.setReactorData(reactor, self.listeningport) except: LogException(self.logger) finally: if ssbot.isConnected(): ssbot.disconnectFromServer() for b in BotList: b.Cleanup()
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()
from Credentials import botowner, botname, botpassword # import the SubspaceBot class. this is what has all the features we need from SubspaceBot import * if __name__ == '__main__': # initialize the bot, setting its owner and description, then connecting to the server bot = SubspaceBot(botowner, 'This bot rolls a random number between 1 and 100') bot.connectToServer('66.235.184.102', 7900, botname, botpassword, '#python') print "Bot connected to server" # register two commands, !roll and !about roll_command_id = bot.registerCommand('!roll', 'Roll a number between 1 and 100') # keep looping as long as the bot is connected. at each loop, pull out the next # even that is waiting for us to process while bot.isConnected(): event = bot.waitForEvent() # based on the event type, if event.type == EVENT_COMMAND: # based on what type of command this is, handle it accordingly if event.command.id == roll_command_id: # this command is the !roll command random_number = random.randrange(1, 101) bot.sendArenaMessage(event.player.name + ' rolled ' + str(random_number) + ' (1-100)') print "Bot disconnected"
#!/usr/bin/env python import random from Credentials import botowner, botname, botpassword from SubspaceBot import * if __name__ == '__main__': bot = SubspaceBot(botowner, 'This bot rolls a random number between 1 and 100') bot.connectToServer('66.235.184.102', 7900, botname, botpassword, '#python') print "Bot connected to server" roll_command_id = bot.registerCommand('!roll', 'Roll a number between 1 and 100') while bot.isConnected(): event = bot.waitForEvent() if event.type == EVENT_COMMAND: if event.command.id == roll_command_id: random_number = random.randrange(1, 101) bot.sendArenaMessage(event.player.name + ' rolled ' + str(random_number) + ' (1-100)') print "Bot disconnected"
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)