#!/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()