Newer
Older
src / python / mybot / BotManager.py
@Andreas Jaggi Andreas Jaggi on 4 Jun 2006 3 KB Changes:
#!/bin/python

# MyBot: BotManager
#
# (c) 2006 Andreas Jaggi <andreas.jaggi@waterwave.ch>

import BotInstance

class BotManager:
	def __init__(self):
		self.botInstances = {}
		self.availableChannels = {}
		self.observedChannels = {}
		self.comChannels = {}
		self.results = {}

		self.nickCounter = 0
		self.channelCounter = 0

		self.availableChannelsListener = []
		self.observedChannelsListener = []
		self.resultsListener = []

	def updateAvailableChannels(self):
		"""Request update of available channels list"""
		for b in self.botInstances.itervalues():
			b.requestChannelList()
	
	def addServer(self, server, port = 6667):
		"""Add a new server (e.g. create a new bot for the server)"""
		if server not in self.observedChannels.keys():
			channel = self.genComChannelName()
			nick = self.genNick()
			botInstance = BotInstance.BotInstance(self, server, port, nick, channel)
			self.botInstances[server] = botInstance
			self.comChannels[server] = channel

			botInstance.requestChannelList()

	def observeChannel(self, server, channel):
		botInstance = self.botInstances.get(server, None)
		if botInstance:
			botInstance.join(channel)

	def addSearchQuery(self, query, server=None):
		self.results[query] = []

		if not server:
			for b in self.botInstances.itervalues():
				b.queries.append(query)
		else:
			botInstance = self.botInstances.get(server, None)
			if botInstance:
				botInstance.append(query)

	def getSearchQueries(self, server=None):
		queries = set([])
		if not server:
			for b in self.botInstances.itervalues():
				queries.union(set(b.queries))
		else:
			botInstance = self.botInstances.get(server, None)
			if botInstance:
				queries = set(botInstance.queries)
		return list(queries)

	def getSearchResults(self, server=None):
		results = set([])
		if not server:
			for b in self.botInstances.itervalues():
				results.union(set(b.results))
		else:
			botInstance = self.botInstances.get(server, None)
			if botInstance:
				results = set(botInstance.results)
		return list(results)

	def genComChannelName(self):
		"""Generate a random and unique channel name"""
		self.channelCounter += 1
		return '#mbcc-%s' % self.channelCounter

	def genNick(self):
		"""Generate a random and unique nick"""
		self.nickCounter += 1
		return 'mybot-%s' % self.nickCounter

	# API for listener

	def addAvailableChannelsListener(self, listener):
		self.availableChannelsListener.append(listener)

	def removeAvailalbeChannelsListener(self, listener):
		self.availableChannelsListener.remove(listener)
	
	def addObservedChannelsListener(self, listener):
		self.observedChannelsListener.append(listener)

	def removeObservedChannelsListener(self, listener):
		self.observedChannelsListener.remove(listener)
	
	def addResultsListener(self, listener):
		self.resultsListener.append(listener)

	def removeResultsListener(self, listener):
		self.resultsListener.remove(listener)
	
	# API for BotInstances

	def availableChannelsUpdated(self, botInstance):
		serverChannels = self.availableChannels.get(botInstance.server, [])
		newChannels = set(serverChannels).union(set(botInstance.availableChannels))
		self.availableChannels[botInstance.server] = list(newChannels)

		for listener in self.availableChannelsListener:
			listener()

	def observedChannelsUpdated(self, botInstance):
		serverChannels = self.observedChannels.get(botInstance.server, [])
		newChannels = set(serverChannels).union(set(botInstance.observedChannels))
		self.observedChannels[botInstance.server] = list(newChannels)

		print "BotManager:observedChannelsUpdated"
		for listener in self.observedChannelsListener:
			listener()

	def resultsUpdated(self, botInstance):
		for query in botInstance.queries:
			for result in botInstance.results.get(query, []):
				if not self.results.has_key(query):
					self.results[query] = []
				self.results[query].append(result)

		for listener in self.resultsListener:
			listener()

if __name__ == "__main__":
	botm = BotManager()