1
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2
# See LICENSE for details.
6
import cPickle as pickle
12
from twisted.words.im.gtkcommon import GLADE_FILE, SETTINGS_FILE, autoConnectMethods,\
15
from twisted.words.im import gtkchat
17
### This generic stuff uses the word "account" in a very different way -- chat
18
### accounts are potential sources of messages, InstanceMessenger accounts are
19
### individual network connections.
23
self.xml = openGlade(GLADE_FILE, root="MainIMWindow")
24
self.chatui = gtkchat.GtkChatClientUI(self.xml)
25
self.chatui._accountmanager = self # TODO: clean this up... it's used in gtkchat
27
autoConnectMethods(self, self.chatui.theContactsList)
28
self.widget = self.xml.get_widget("AccountManWidget")
29
self.widget.show_all()
31
f = open(SETTINGS_FILE)
32
self.accounts = pickle.load(f)
34
self.refreshAccounts()
39
def on_ConsoleButton_clicked(self, b):
40
#### For debugging purposes...
41
from twisted.manhole.ui.pywidgets import LocalInteraction
42
l = LocalInteraction()
43
l.localNS['chat'] = self.chatui
46
def created(self, acct):
47
self.accounts.append(acct)
48
self.refreshAccounts()
50
def refreshAccounts(self):
51
w = self.xml.get_widget("accountsList")
53
for acct in self.accounts:
54
l = [acct.accountName, acct.isOnline() and 'yes' or 'no',
55
acct.autoLogin and 'yes' or 'no', acct.gatewayType]
58
def lockNewAccount(self, b):
59
self.xml.get_widget("NewAccountButton").set_sensitive(not b)
61
def on_NewAccountButton_clicked(self, b):
64
def on_MainIMWindow_destroy(self, w):
66
pickle.dump(self.accounts, open(SETTINGS_FILE,'wb'))
71
def on_DeleteAccountButton_clicked(self, b):
72
lw = self.xml.get_widget("accountsList")
74
del self.accounts[lw.selection[0]]
75
self.refreshAccounts()
77
def on_LogOnButton_clicked(self, b):
78
lw = self.xml.get_widget("accountsList")
80
self.accounts[lw.selection[0]].logOn(self.chatui)
83
class DummyAccountForm:
84
def __init__(self, manager):
85
self.widget = gtk.GtkButton("HELLO")
87
def create(self, sname, autoLogin):
92
def __init__(self, manager):
93
self.manager = manager
94
self.manager.lockNewAccount(1)
95
self.xml = openGlade(GLADE_FILE, root="NewAccountWindow")
96
autoConnectMethods(self)
97
self.widget = self.xml.get_widget("NewAccountWindow")
98
self.frame = self.xml.get_widget("GatewayFrame")
99
# Making up for a deficiency in glade.
100
widgetMenu = self.xml.get_widget("GatewayOptionMenu")
103
self.currentGateway = None
104
for name, klas in registeredTypes:
105
i = gtk.GtkMenuItem(name)
107
k = klas(self.manager)
108
i.connect("activate", self.gatewaySelected, k)
111
self.gatewaySelected(None, k)
112
widgetMenu.set_menu(m)
113
self.widget.show_all()
115
def gatewaySelected(self, ig, k):
116
if self.currentGateway:
117
self.frame.remove(self.currentGateway.widget)
118
self.currentGateway = k
119
self.frame.add(k.widget)
122
def createAccount(self, b):
123
autoLogin = self.xml.get_widget("AutoLogin").get_active()
124
accountName = self.xml.get_widget("accountName").get_text()
125
x = self.currentGateway.create(accountName, autoLogin)
127
self.manager.created(x)
130
def destroyMe(self, b=None):
131
self.widget.destroy()
133
def on_NewAccountWindow_destroy(self, w):
134
self.manager.lockNewAccount(0)
136
from twisted.words.im.pbsupport import PBAccount
137
from twisted.words.im.tocsupport import TOCAccount
138
from twisted.words.im.ircsupport import IRCAccount
142
def __init__(self, manager):
143
self.manager = manager
144
self.xml = openGlade(GLADE_FILE, root="PBAccountWidget")
145
autoConnectMethods(self)
146
self.widget = self.xml.get_widget("PBAccountWidget")
147
self.on_serviceType_changed()
148
self.selectedRow = None
150
def addPerspective(self, b):
151
stype = self.xml.get_widget("serviceType").get_text()
152
sname = self.xml.get_widget("serviceName").get_text()
153
pname = self.xml.get_widget("perspectiveName").get_text()
154
self.xml.get_widget("serviceList").append([stype, sname, pname])
156
def removePerspective(self, b):
157
if self.selectedRow is not None:
158
self.xml.get_widget("serviceList").remove(self.selectedRow)
160
def on_serviceType_changed(self, w=None):
161
self.xml.get_widget("serviceName").set_text(self.xml.get_widget("serviceType").get_text())
162
self.xml.get_widget("perspectiveName").set_text(self.xml.get_widget("identity").get_text())
164
on_identity_changed = on_serviceType_changed
166
def on_serviceList_select_row(self, slist, row, column, event):
167
self.selectedRow = row
169
def create(self, accName, autoLogin):
170
host = self.xml.get_widget("hostname").get_text()
171
port = self.xml.get_widget("portno").get_text()
172
user = self.xml.get_widget("identity").get_text()
173
pasw = self.xml.get_widget("password").get_text()
174
serviceList = self.xml.get_widget("serviceList")
176
for r in xrange(0, serviceList.rows):
178
for c in xrange(0, serviceList.columns):
179
row.append(serviceList.get_text(r, c))
183
self.xml.get_widget("serviceType").get_text(),
184
self.xml.get_widget("serviceName").get_text(),
185
self.xml.get_widget("perspectiveName").get_text()])
186
return PBAccount(accName, autoLogin, user, pasw, host, int(port),
190
class TOCAccountForm:
191
def __init__(self, maanger):
192
self.xml = openGlade(GLADE_FILE, root="TOCAccountWidget")
193
self.widget = self.xml.get_widget("TOCAccountWidget")
195
def create(self, accountName, autoLogin):
197
accountName, autoLogin,
198
self.xml.get_widget("TOCName").get_text(),
199
self.xml.get_widget("TOCPass").get_text(),
200
self.xml.get_widget("TOCHost").get_text(),
201
int(self.xml.get_widget("TOCPort").get_text()) )
204
class IRCAccountForm:
205
def __init__(self, maanger):
206
self.xml = openGlade(GLADE_FILE, root="IRCAccountWidget")
207
self.widget = self.xml.get_widget("IRCAccountWidget")
209
def create(self, accountName, autoLogin):
211
accountName, autoLogin,
212
self.xml.get_widget("ircNick").get_text(),
213
self.xml.get_widget("ircPassword").get_text(),
214
self.xml.get_widget("ircServer").get_text(),
215
int(self.xml.get_widget("ircPort").get_text()),
216
self.xml.get_widget("ircChannels").get_text(),
221
registeredTypes = [ ("Twisted", PBAccountForm),
222
("AOL Instant Messenger", TOCAccountForm),
223
["IRC", IRCAccountForm],
224
("Dummy", DummyAccountForm) ]