示例#1
0
    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()
示例#2
0
	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()
示例#3
0
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"
示例#4
0
#!/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"
示例#5
0
文件: Master.py 项目: TheJunky/PyCore
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)