diff --git a/plugins/gtkgui/gtkgui.glade b/plugins/gtkgui/gtkgui.glade index e9faf1e2c..2be428448 100644 --- a/plugins/gtkgui/gtkgui.glade +++ b/plugins/gtkgui/gtkgui.glade @@ -252,6 +252,7 @@ True True 0 + @@ -261,7 +262,6 @@ True Online True - @@ -270,7 +270,6 @@ True Away True - @@ -279,7 +278,6 @@ True NA True - @@ -288,7 +286,6 @@ True DND True - @@ -297,7 +294,6 @@ True Invisible True - @@ -312,7 +308,6 @@ True Offline True - diff --git a/plugins/gtkgui/gtkgui.py b/plugins/gtkgui/gtkgui.py index 564984827..070106740 100644 --- a/plugins/gtkgui/gtkgui.py +++ b/plugins/gtkgui/gtkgui.py @@ -109,7 +109,7 @@ class vCard_Window: def on_retrieve(self, widget): acct = self.plugin.accts.which_account(self.user) if self.plugin.connected[acct]: - self.plugin.send('ASK_VCARD', acct, self.jid)) + self.plugin.send('ASK_VCARD', acct, self.jid) else: warning_Window("You must be connected to get your informations") @@ -1085,24 +1085,27 @@ class roster_Window: self.tab_messages[jid].user = user1 self.tab_messages[jid].img.set_from_pixbuf(self.pixbufs[show]) - def chg_status(self, jid, show, status): - """When a user change his status remove or change its icon""" - u = self.l_contact[jid]['user'] - if self.l_contact[jid]['iter'] == []: - self.add_user(u) + def chg_status(self, user, show, status, account): + """When a user change his status""" + if self.l_contact[user.jid]['iter'] == []: + self.add_user(user) else: model = self.tree.get_model() if show == 'offline' and not self.showOffline: - self.remove_user(u) + self.remove_user(user) else: - for i in self.l_contact[jid]['iter']: + for i in self.l_contact[user.jid]['iter']: if self.pixbufs.has_key(show): model.set_value(i, 0, self.pixbufs[show]) #update icon in chat window - if self.tab_messages.has_key(jid): - self.tab_messages[jid].img.set_from_pixbuf(self.pixbufs[show]) + if self.tab_messages.has_key(user.jid): + self.tab_messages[user.jid].img.set_from_pixbuf(self.pixbufs[show]) u.show = show u.status = status + #Print status in chat window + if self.plugin.windows.has_key("%s_%s" % (user.jid, account)): + self.windows["%s_%s" % (user.jid, account)].print_conversation(\ + "%s is now %s (%s)" % (user.name, show, status), 'status') def on_info(self, widget, jid): """Call infoUser_Window class to display user's information""" @@ -1232,19 +1235,62 @@ class roster_Window: """Remove a user""" window_confirm = confirm_Window(self, iter) - def on_status_changed(self, widget): + def on_optionmenu_changed(self, widget): """When we change our status""" - if widget.name != 'online' and widget.name != 'offline': + optionmenu = self.xml.get_widget('optionmenu') + history = optionmenu.get_history() + status = optionmenu.get_menu().get_children()[history].name + if status != 'online' and status != 'offline': w = awayMsg_Window() txt = w.run() else: - txt = widget.name + txt = status if len(self.plugin.accounts) > 0: - self.queueOUT.put(('STATUS',(widget.name, txt, \ - self.plugin.accounts.keys()[0]))) + self.queueOUT.put(('STATUS', None, (status, txt))) else: warning_Window("You must setup an account before connecting to jabber network.") + def on_status_changed(self, account, status): + optionmenu = self.xml.get_widget('optionmenu') + for i in range(7): + if optionmenu.get_menu().get_children()[i].name == status: + optionmenu.set_history(i) + break + if status == 'offline': + self.plugin.connected[account] = 0 + self.plugin.sleeper = None + for jid in self.l_contact.keys(): + user = self.l_contact[jid]['user'] +#TODO: give account to chg_status + self.chg_status(user, 'offline', 'Disconnected', 'account') + elif self.plugin.connected[ev[1]] == 0: + self.plugin.connected[ev[1]] = 1 + self.plugin.sleeper = None#common.sleepy.Sleepy(\ + #self.autoawaytime*60, self.autoxatime*60) + + def on_message(self, jid, msg, account): + """when we receive a message""" + if not self.l_contact.has_key(jid): + user1 = user(jid, jid, ['not in list'], \ + 'not in list', 'not in list', 'none', '') + self.add_user(user1) + autopopup = self.plugin.config['autopopup'] + if autopopup == 0 and not self.tab_messages.has_key(jid): + #We save it in a queue + if not self.tab_queues.has_key(jid): + model = self.tree.get_model() + self.tab_queues[jid] = Queue.Queue(50) + for i in self.l_contact[jid]['iter']: + model.set_value(i, 0, self.pixbufs['message']) + tim = time.strftime("[%H:%M:%S]") + self.tab_queues[jid].put((msg, tim)) + else: + if not self.tab_messages.has_key(jid): + if self.l_contact.has_key(jid): + self.tab_messages[jid] = \ + message_Window(self.l_contact[jid]['user'], self) + self.tab_messages[jid].print_conversation(msg) + def on_prefs(self, widget): """When preferences is selected : call the preference_Window class""" @@ -1360,12 +1406,12 @@ class roster_Window: self.showOffline = 1 - self.showOffline self.redraw_roster() - def __init__(self, queueOUT, plug): + def __init__(self, plugin): # FIXME : handle no file ... - xml = gtk.glade.XML(GTKGUI_GLADE, 'Gajim') - self.window = xml.get_widget('Gajim') - self.tree = xml.get_widget('treeview') - self.plugin = plug + self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Gajim') + self.window = self.xml.get_widget('Gajim') + self.tree = self.xml.get_widget('treeview') + self.plugin = plugin self.connected = 0 #(icon, name, jid, editable, background color, show_icon) model = gtk.TreeStore(gtk.gdk.Pixbuf, str, str, \ @@ -1393,9 +1439,7 @@ class roster_Window: # print st.bg # print self.tree.get_property('expander-column') # self.tree.set_style(st) - self.queueOUT = queueOUT - self.optionmenu = xml.get_widget('optionmenu') - self.optionmenu.set_history(6) + self.xml.get_widget('optionmenu').set_history(6) self.tab_messages = {} self.tab_queues = {} self.tab_vcard = {} @@ -1442,12 +1486,47 @@ class roster_Window: xml.signal_connect('on_quit_activate', self.on_quit) xml.signal_connect('on_treeview_event', self.on_treeview_event) xml.signal_connect('on_status_changed', self.on_status_changed) + xml.signal_connect('on_optionmenu_changed', self.on_optionmenu_changed) xml.signal_connect('on_row_activated', self.on_row_activated) xml.signal_connect('on_row_expanded', self.on_row_expanded) xml.signal_connect('on_row_collapsed', self.on_row_collapsed) class plugin: """Class called by the core in a new thread""" + + class accounts: + """Class where are stored the accounts and users in them""" + def __init__(self): + self.__accounts = {} + + def add_account(self, account, users=()): + #users must be like (user1, user2) + self.__accounts[account] = users + + def add_user_to_account(self, account, user): + if self.__accounts.has_key(account): + self.__accounts[account].append(user) + else : + return 1 + + def get_accounts(self): + return self.__accounts.keys(); + + def get_users(self, account): + if self.__accounts.has_key(account): + return self.__accounts[account] + else : + return None + + def which_account(self, user): + for a in self.__accounts.keys(): + if user in self.__accounts[a]: + return a + return None + + def send(self, event, account, data): + self.queueOUT.put((event, account, data)) + def wait(self, what): """Wait for a message from Core""" #TODO: timeout @@ -1455,12 +1534,12 @@ class plugin: while 1: if not self.queueIN.empty(): ev = self.queueIN.get() - if ev[0] == what and ev[1][0] == 'GtkGui': + if ev[0] == what and ev[2][0] == 'GtkGui': #Restore messages while not temp_q.empty(): ev2 = temp_q.get() self.queueIN.put(ev2) - return ev[1][1] + return ev[2][1] else: #Save messages temp_q.put(ev) @@ -1469,159 +1548,119 @@ class plugin: def read_queue(self): """Read queue from the core and execute commands from it""" global browserWindow - model = self.r.tree.get_model() + model = self.roster.tree.get_model() while self.queueIN.empty() == 0: ev = self.queueIN.get() if ev[0] == 'ROSTER': - self.r.init_tree() - self.r.mklists(ev[1]) - self.r.draw_roster() + self.roster.init_tree() + self.roster.mklists(ev[2]) + self.roster.draw_roster() elif ev[0] == 'WARNING': - warning_Window(ev[1]) + warning_Window(ev[2]) + #('STATUS', account, status) elif ev[0] == 'STATUS': - st = "" - for i in range(7): - if self.r.optionmenu.get_menu().get_children()[i].name == ev[1]: - st = self.r.optionmenu.get_menu().get_children()[i].name - self.r.optionmenu.set_history(i) - break - if st == 'offline': - self.r.connected = 0 - self.sleeper = None - for j in self.r.l_contact.keys(): - self.r.chg_status(j, 'offline', 'Disconnected') - elif self.r.connected == 0: - self.r.connected = 1 - self.sleeper = None#common.sleepy.Sleepy(\ - #self.autoawaytime*60, self.autoxatime*60) - + self.roster.on_status_changed(ev[1], ev[2]) + #('NOTIFY', account, (jid, status, message, resource)) elif ev[0] == 'NOTIFY': - jid = string.split(ev[1][0], '/')[0] - res = ev[1][3] - if not res: - res = '' + jid = string.split(ev[2][0], '/')[0] + resource = ev[2][3] + if not resource: + resource = '' if string.find(jid, "@") <= 0: #It must be an agent ji = string.replace(jid, '@', '') else: ji = jid #Update user - if self.r.l_contact.has_key(ji): - u = self.r.l_contact[ji]['user'] - u.show = ev[1][1] - u.status = ev[1][2] - u.resource = res - #Print status in chat window - if self.r.tab_messages.has_key(ji): - self.r.tab_messages[ji].print_conversation(\ - "%s is now %s (%s)" % (u.name, ev[1][1], \ - ev[1][2]), 'status') + if self.roster.l_contact.has_key(ji): + user = self.roster.l_contact[ji]['user'] + user.show = ev[2][1] + user.status = ev[2][2] + user.resource = resource if string.find(jid, "@") <= 0: #It must be an agent - if not self.r.l_contact.has_key(ji): - user1 = user(ji, ji, ['Agents'], ev[1][1], \ - ev[1][2], 'from', res) - self.r.add_user(user1) + if not self.roster.l_contact.has_key(ji): + user1 = user(ji, ji, ['Agents'], ev[2][1], \ + ev[2][2], 'from', resource) + self.roster.add_user(user1) else: #Update existing iter - for i in self.r.l_contact[ji]['iter']: - if self.r.pixbufs.has_key(ev[1][1]): - model.set_value(i, 0, self.r.pixbufs[ev[1][1]]) - elif self.r.l_contact.has_key(ji): + for i in self.roster.l_contact[ji]['iter']: + if self.roster.pixbufs.has_key(ev[2][1]): + model.set_value(i, 0, self.r.pixbufs[ev[2][1]]) + elif self.roster.l_contact.has_key(ji): #It isn't an agent - self.r.chg_status(jid, ev[1][1], ev[1][2]) + self.roster.chg_status(user, ev[2][1], ev[2][2], ev[1]) + #('MSG', account, (user, msg)) elif ev[0] == 'MSG': - if string.find(ev[1][0], "@") <= 0: - jid = string.replace(ev[1][0], '@', '') + if string.find(ev[2][0], "@") <= 0: + jid = string.replace(ev[2][0], '@', '') else: - jid = ev[1][0] + jid = ev[2][0] + self.roster.on_message(jid, ev[2][1], ev[1]) - if self.config.has_key('autopopup'): - self.autopopup = self.config['autopopup'] - else: - self.autopopup = 0 - if not self.r.l_contact.has_key(jid): - user1 = user(jid, jid, ['not in list'], \ - 'not in list', 'not in list', 'none', '') - self.r.add_user(user1) - if self.autopopup == 0 and not self.r.tab_messages.has_key(jid): - #We save it in a queue - if not self.r.tab_queues.has_key(jid): - self.r.tab_queues[jid] = Queue.Queue(50) - for i in self.r.l_contact[jid]['iter']: - model.set_value(i, 0, self.r.pixbufs['message']) - tim = time.strftime("[%H:%M:%S]") - self.r.tab_queues[jid].put((ev[1][1], tim)) - else: - if not self.r.tab_messages.has_key(jid): - if self.r.l_contact.has_key(jid): - self.r.tab_messages[jid] = \ - message_Window(self.r.l_contact[jid]['user'], self.r) - if self.r.tab_messages.has_key(jid): - self.r.tab_messages[jid].print_conversation(ev[1][1]) - elif ev[0] == 'SUBSCRIBE': - authorize_Window(self.r, ev[1][0], ev[1][1]) + authorize_Window(self.roster, ev[2][0], ev[2][1]) + #('SUBSCRIBED', account, (jid, nom, resource)) elif ev[0] == 'SUBSCRIBED': - jid = ev[1]['jid'] - if self.r.l_contact.has_key(jid): - u = self.r.l_contact[jid]['user'] - u.name = ev[1]['nom'] - for i in self.r.l_contact[u.jid]['iter']: + if self.roster.l_contact.has_key(ev[2][0]): + u = self.roster.l_contact[ev[2][0]]['user'] + u.name = ev[2][1] + u.resource = ev[2][2] + for i in self.roster.l_contact[u.jid]['iter']: model.set_value(i, 1, u.name) else: - user1 = user(jid, jid, ['general'], 'online', \ - 'online', 'to', ev[1]['ressource']) - self.r.add_user(user1) - warning_Window("You are now authorized by " + jid) + user1 = user(ev[2][0], ev[2][0], ['general'], 'online', \ + 'online', 'to', ev[2][2]) + self.roster.add_user(user1) + warning_Window("You are now authorized by " + ev[2][0]) elif ev[0] == 'UNSUBSCRIBED': warning_Window("You are now unsubscribed by " + jid) #TODO: change icon + #('AGENTS', account, agents) elif ev[0] == 'AGENTS': - if browserWindow: - browserWindow.agents(ev[1]) + if self.windows.has_key('browser'): + self.windows['browser'].agents(ev[2]) + #('AGENTS_INFO', account, (agent, infos)) elif ev[0] == 'AGENT_INFO': - if not ev[1][1].has_key('instructions'): - warning_Window('error contacting %s' % ev[1][0]) + if not ev[2][1].has_key('instructions'): + warning_Window('error contacting %s' % ev[2][0]) else: - Wreg = agentRegistration_Window(ev[1][0], ev[1][1], self.r) - #('ACC_OK', (hostname, login, pasword, name, ressource)) + agentRegistration_Window(ev[2][0], ev[2][1], self.roster) + #('ACC_OK', account, (hostname, login, pasword, name, ressource)) elif ev[0] == 'ACC_OK': - self.accounts[ev[1][3]] = {'ressource': ev[1][4], \ - 'password': ev[1][2], 'hostname': ev[1][0], 'name': ev[1][1]} - self.r.queueOUT.put(('CONFIG', ('accounts', self.r.plugin.accounts))) - if (accountsWindow != 0): - accountsWindow.init_accounts() + self.accounts[ev[2][3]] = {'ressource': ev[2][4], \ + 'password': ev[2][2], 'hostname': ev[2][0], 'name': ev[2][1]} + self.send('CONFIG', None, ('accounts', self.accounts))) + if self.windiws.has_key('accounts'): + self.windows['accounts'].init_accounts() elif ev[0] == 'QUIT': - self.r.on_quit(self) + self.roster.on_quit(self) elif ev[0] == 'VCARD': - if self.r.tab_vcard.has_key(ev[1]['jid']): - self.r.tab_vcard[ev[1]['jid']].set_values(ev[1]) + if self.roster.tab_vcard.has_key(ev[2]['jid']): + self.roster.tab_vcard[ev[2]['jid']].set_values(ev[2]) return 1 def read_sleepy(self): """Check if we are idle""" - if self.sleeper and (self.autoaway or self.autoxa) and \ - (self.r.optionmenu.get_history()==0 or \ + if self.sleeper and (self.config['autoaway'] or self.config['autoxa'])\ + and (self.roster.optionmenu.get_history()==0 or \ self.sleeper_state!=common.sleepy.STATE_AWAKE): self.sleeper.poll() state = self.sleeper.getState() if state != self.sleeper_state: if state == common.sleepy.STATE_AWAKE: #we go online - self.r.optionmenu.set_history(0) - self.r.queueOUT.put(('STATUS',('online', '', \ - self.accounts.keys()[0]))) + self.roster.optionmenu.set_history(0) + self.send('STATUS', None, ('online', '')) if state == common.sleepy.STATE_AWAY and self.autoaway: #we go away - self.r.optionmenu.set_history(1) - self.r.queueOUT.put(('STATUS',('away', \ - 'auto away (idle)', self.accounts.keys()[0]))) + self.roster.optionmenu.set_history(1) + self.send('STATUS', None, ('away', 'auto away (idle)')) if state == common.sleepy.STATE_XAWAY and self.autoxa: #we go extanded away - self.r.optionmenu.set_history(2) - self.r.queueOUT.put(('STATUS',('xa', \ - 'auto away (idel)', self.accounts.keys[0]))) + self.roster.optionmenu.set_history(2) + self.send('STATUS',('xa', 'auto away (idel)')) self.sleeper_state = state return 1 @@ -1629,7 +1668,9 @@ class plugin: gtk.threads_init() gtk.threads_enter() self.queueIN = quIN - quOUT.put(('ASK_CONFIG', ('GtkGui', 'GtkGui', {'autopopup':1,\ + self.queueOUT = quOUT + self.windows = {} + self.send('ASK_CONFIG', None, ('GtkGui', 'GtkGui', {'autopopup':1,\ 'showoffline':0,\ 'autoaway':0,\ 'autoawaytime':10,\ @@ -1638,28 +1679,28 @@ class plugin: 'iconstyle':'sun',\ 'inmsgcolor':'#ff0000',\ 'outmsgcolor': '#0000ff',\ - 'statusmsgcolor':'#1eaa1e'}))) + 'statusmsgcolor':'#1eaa1e'})) self.config = self.wait('CONFIG') - quOUT.put(('ASK_CONFIG', ('GtkGui', 'accounts'))) + self.send('ASK_CONFIG', None, ('GtkGui', 'accounts')) self.accounts = self.wait('CONFIG') - self.r = roster_Window(quOUT, self) - if self.config.has_key('autoaway'): - self.autoaway = self.config['autoaway'] - else: - self.autoaway = 1 - if self.config.has_key('autoawaytime'): - self.autoawaytime = self.config['autoawaytime'] - else: - self.autoawaytime = 10 - if self.config.has_key('autoxa'): - self.autoxa = self.config['autoxa'] - else: - self.autoxa = 1 - if self.config.has_key('autoxatime'): - self.autoxatime = self.config['autoxatime'] - else: - self.autoxatime = 20 - self.time = gtk.timeout_add(200, self.read_queue) + self.roster = roster_Window(self) +# if self.config.has_key('autoaway'): +# self.autoaway = self.config['autoaway'] +# else: +# self.autoaway = 1 +# if self.config.has_key('autoawaytime'): +# self.autoawaytime = self.config['autoawaytime'] +# else: +# self.autoawaytime = 10 +# if self.config.has_key('autoxa'): +# self.autoxa = self.config['autoxa'] +# else: +# self.autoxa = 1 +# if self.config.has_key('autoxatime'): +# self.autoxatime = self.config['autoxatime'] +# else: +# self.autoxatime = 20 + gtk.timeout_add(200, self.read_queue) gtk.timeout_add(1000, self.read_sleepy) self.sleeper = None self.sleeper_state = None