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