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

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

import wx, sys

import BotManager

class ServerList(wx.Panel):
	def __init__(self, parent, id, botManager):
		wx.Panel.__init__(self, parent, id)

		self.botManager = botManager

		sizer = wx.BoxSizer(wx.VERTICAL)

		self.tree = wx.TreeCtrl(self, style=wx.TR_HIDE_ROOT)
		sizer.Add(self.tree, 1, flag=wx.EXPAND)
		self.rootId = self.tree.AddRoot("Servers")

		myId = wx.NewId()
		self.serverInput = wx.TextCtrl(self, myId, "irc.freenode.net", style=wx.TE_PROCESS_ENTER)
		sizer.Add(self.serverInput, flag=wx.EXPAND)
		#self.Bind(wx.EVT_TEXT_ENTER, self.onAddServer, self.serverInput)
		wx.EVT_TEXT_ENTER(self.serverInput, myId, self.onAddServer)

		myId = wx.NewId()
		self.addServerButton = wx.Button(self, myId, "Add Server")
		sizer.Add(self.addServerButton, flag=wx.EXPAND)
		#self.Bind(wx.EVT_BUTTON, self.onAddServer, self.addServerButton)
		wx.EVT_BUTTON(self.addServerButton, myId, self.onAddServer)

		myId = wx.NewId()
		self.observeChannelButton = wx.Button(self, myId, "Observe Channel")
		sizer.Add(self.observeChannelButton, flag=wx.EXPAND)
		#self.Bind(wx.EVT_BUTTON, self.onObserveChannel, self.observeChannelButton)
		wx.EVT_BUTTON(self.observeChannelButton, myId, self.onObserveChannel)

		myId = wx.NewId()
		self.refreshButton = wx.Button(self, myId, "Refresh Channel List")
		sizer.Add(self.refreshButton, flag=wx.EXPAND)
		#self.Bind(wx.EVT_BUTTON, self.onObserveChannel, self.observeChannelButton)
		wx.EVT_BUTTON(self.refreshButton, myId, self.onRefreshChannelList)

		self.SetSizer(sizer)
		self.Fit()

	def onRefreshChannelList(self, event):
		print "ServerList:RefreshChannelList"
		self.botManager.updateAvailableChannels()

	def onObserveChannel(self, event):
		print "ServerList:onObserveChannel"
		channelId = self.tree.GetSelection()
		channel = self.tree.GetItemText(channelId)

		found = False
		for serverId in self.getChildrenIds(self.tree, self.rootId):
			if found:
				break
			if self.tree.ItemHasChildren(serverId):
				for childId in self.getChildrenIds(self.tree, serverId):
					if childId == channelId:
						server = self.tree.GetItemText(serverId)
						found = True
						break

		self.botManager.observeChannel(server, channel)

	def onAddServer(self, event):
		print "ServerList:onAddServer"
		server = self.serverInput.GetValue()
		self.serverInput.Clear()

		self.botManager.addServer(server)

	def onUpdateAvailableChannels(self):
		print "AvailableChannels updated"
		expanded = self.tree.IsExpanded(self.rootId)
		self.tree.CollapseAndReset(self.rootId)
		for server in self.botManager.availableChannels.iterkeys():
			nserver = self.tree.AppendItem(self.rootId, server)
		if expanded:
			self.tree.Expand(self.rootId)
		else:
			self.tree.Collapse(self.rootId)

		self.tree.SortChildren(self.rootId)

		for serverId in self.getChildrenIds(self.tree, self.rootId):
			server = self.tree.GetItemText(serverId)
			if self.botManager.availableChannels.has_key(server):
				expanded = self.tree.IsExpanded(serverId)
				self.tree.CollapseAndReset(serverId)

				hasObservedChannels = False

				for channel in self.botManager.availableChannels.get(server, []):
					nitem = self.tree.AppendItem(serverId, channel)
					if channel in self.botManager.observedChannels.get(server, []):
						self.tree.SetItemBold(nitem, 1)
						hasObservedChannels = True
				if expanded:
					self.tree.Expand(serverId)
				else:
					self.tree.Collapse(serverId)

				if hasObservedChannels:
					self.tree.SetItemBold(serverId, 1)
				else:
					self.tree.SetItemBold(serverId, 0)

				self.tree.SortChildren(serverId)
			else:
				self.tree.Delete(serverId)

	def onUpdateObservedChannels(self):
		print "ObservedChannels updated"
		for serverId in self.getChildrenIds(self.tree, self.tree.GetRootItem()):
			server = self.tree.GetItemText(serverId)

			if not self.botManager.observedChannels.has_key(server):
				noserver = True
				self.tree.SetItemBold(serverId, 0)
			else:
				noserver = False
				self.tree.SetItemBold(serverId, 1)

			for channelId in self.getChildrenIds(self.tree, serverId):
				if noserver:
					self.tree.SetItemBold(channelId, 0)
				else:
					channel = self.tree.GetItemText(channelId)
					if channel in self.botManager.observedChannels.get(server, []):
						self.tree.SetItemBold(channelId, 1)
					else:
						self.tree.SetItemBold(channelId, 0)

	def getChildrenIds(self, tree, parent):
		result = []
		item = tree.GetLastChild(parent)
		while item:
			result.append(item)
			item = tree.GetPrevSibling(item)
		result.reverse()
		return result


class QueryPanel(wx.SplitterWindow):
	def __init__(self, parent, id, botManager):
		wx.SplitterWindow.__init__(self, parent, id)

		self.botManager = botManager

		sizer = wx.BoxSizer(wx.VERTICAL)
		self.topPanel = wx.Panel(self, -1)
		self.textLog = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE|wx.MODERN|wx.TE_READONLY)

		myId = wx.NewId()
		self.queryList = wx.ListCtrl(self.topPanel, myId, style=wx.LC_REPORT)
		wx.EVT_LIST_ITEM_ACTIVATED(self.queryList, myId, self.onSelectQuery)
		sizer.Add(self.queryList, 1, flag=wx.EXPAND)
		
		self.queryList.InsertColumn(0, "Query")
		self.queryList.InsertColumn(1, "Results")

		self.queryInput = wx.TextCtrl(self.topPanel, -1, "x-way")
		sizer.Add(self.queryInput, flag=wx.EXPAND)

		myId = wx.NewId()
		self.queryButton = wx.Button(self.topPanel, myId, "Add Query")
		sizer.Add(self.queryButton, flag=wx.EXPAND)
		#self.Bind(wx.EVT_BUTTON, self.onAddServer, self.addServerButton)
		wx.EVT_BUTTON(self.queryButton, myId, self.onAddQuery)

		self.topPanel.SetSizer(sizer)
		self.topPanel.Fit()
		self.Fit()

		self.SplitHorizontally(self.topPanel, self.textLog)

		self.itemDataMap = {}

		self.selectedQuery = None

	def onSelectQuery(self, event):
		row = event.GetIndex()
		for (query, index) in self.itemDataMap.iteritems():
			if index == row:
				self.selectedQuery = query
				break
		self.onUpdateResults()

	def onAddQuery(self, event):
		print "Add query"
		self.botManager.addSearchQuery(self.queryInput.GetValue())
		self.queryInput.Clear()
		self.onUpdateResults()

	def onUpdateResults(self):
		print "Results updated"

		if len(self.itemDataMap):
			for query in self.itemDataMap.iterkeys():
				self.queryList.SetStringItem(self.itemDataMap[query], 1, "%s" % len(self.botManager.results.get(query, [])))

		for query in self.botManager.results.iterkeys():
			if query not in self.itemDataMap.iterkeys():
				row = self.queryList.GetItemCount()
				self.itemDataMap[query] = row
				self.queryList.InsertStringItem(row, query)
				self.queryList.SetStringItem(row, 1, "%s" % len(self.botManager.results.get(query, [])))

		if self.selectedQuery:
			self.textLog.Clear()
			results = self.botManager.results.get(self.selectedQuery, [])
			for line in results:
				self.textLog.AppendText("%s\n" % " ".join(line))




class MyBot(wx.Frame):
	def __init__(self, parent, id):
		wx.Frame.__init__(self, parent, id, 'MyBot')

		self.botManager = BotManager.BotManager()

		self.verticalSplitter = wx.SplitterWindow(self, -1)
		self.serverList = ServerList(self.verticalSplitter, -1, self.botManager)
		self.queryPanel = QueryPanel(self.verticalSplitter, -1, self.botManager)

		self.verticalSplitter.SplitVertically(self.serverList, self.queryPanel, 150)

		self.botManager.addAvailableChannelsListener(self.serverList.onUpdateAvailableChannels)
		self.botManager.addObservedChannelsListener(self.serverList.onUpdateObservedChannels)
		self.botManager.addResultsListener(self.queryPanel.onUpdateResults)

if __name__ == "__main__":
	app = wx.PySimpleApp()
	mb = MyBot(parent=None, id=-1)
	mb.Show(True)
	app.MainLoop()