diff --git a/src/common/connection.py b/src/common/connection.py index 24d4540dc..a59b56a03 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -218,7 +218,7 @@ class Connection: tim = time.strptime(tim, '%Y%m%dT%H:%M:%S') tim = time.localtime(timegm(tim)) encrypted = False - chatstate_tag = None + chatstate = None xtags = msg.getTags('x') encTag = None decmsg = '' @@ -231,7 +231,7 @@ class Connection: children = msg.getChildren() for child in children: if child.getNamespace() == 'http://jabber.org/protocol/chatstates': - chatstate_tag = child.getName() + chatstate = child.getName() break if encTag and USE_GPG: @@ -264,7 +264,7 @@ class Connection: self.dispatch('MSG', (str(msg.getFrom()), msgtxt, tim, encrypted, mtype, subject, None)) else: # it's type 'chat' - if not msg.getTag('body') and chatstate_tag is None: #no
+ if not msg.getTag('body') and chatstate is None: #no return log_msgtxt = msgtxt if subject: @@ -272,7 +272,7 @@ class Connection: gajim.logger.write('incoming', log_msgtxt, str(msg.getFrom()), tim = tim) self.dispatch('MSG', (str(msg.getFrom()), msgtxt, tim, encrypted, - mtype, subject, chatstate_tag)) + mtype, subject, chatstate)) # END messageCB def _presenceCB(self, con, prs): diff --git a/src/gajim.py b/src/gajim.py index 4128e247c..e4359d2a1 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -345,10 +345,10 @@ class Interface: self.remote.raise_signal('GCPresence', (account, array)) def handle_event_msg(self, account, array): - #('MSG', account, (contact, msg, time, encrypted, msg_type, subject, chatstate_tag)) + #('MSG', account, (contact, msg, time, encrypted, msg_type, subject, chatstate)) jid = array[0].split('/')[0] msg_type = array[4] - chatstate_tag = array[6] + chatstate = array[6] if jid.find('@') <= 0: jid = jid.replace('@', '') @@ -370,7 +370,6 @@ class Interface: ask = 'none') self.roster.new_chat(c, account) return - if gajim.config.get('ignore_unknown_contacts') and \ not gajim.contacts[account].has_key(jid): @@ -378,11 +377,11 @@ class Interface: if self.windows[account]['chats'].has_key(jid): chat_win = self.windows[account]['chats'][jid] - # chatstates - display jep85 events in window - if chatstate_tag is not None: - if chat_win.chatstates[jid] == 'ask': - chat_win.chatstates[jid] = 'active' - chat_win.print_conversation(jid + ' is now ' + chatstate_tag, jid, 'status', tim = array[2]) + if chatstate is not None: # he sent us reply, so he supports jep85 + if chat_win.chatstates[jid] == 'ask': # we were jep85 disco? + chat_win.chatstates[jid] = 'active' # no more + + chat_win.handle_incoming_chatstate(account, jid, chatstate) else: # got no valid jep85 answer, peer does not support it chat_win.chatstates[jid] = False diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py new file mode 100644 index 000000000..24a45a8f9 --- /dev/null +++ b/src/gtkgui_helpers.py @@ -0,0 +1,14 @@ +from common import gajim + +def get_contact_instances_from_jid(account, jid): + ''' we may have two or more resources on that jid ''' + contact_instances = gajim.contacts[account][jid] + return contact_instances + +def get_first_contact_instance_from_jid(account, jid): + contact_instances = get_contact_instances_from_jid(account, jid) + return contact_instances[0] + +def get_contact_name_from_jid(account, jid): + contact_instances = get_contact_instances_from_jid(account, jid) + return contact_instances[0].name diff --git a/src/roster_window.py b/src/roster_window.py index ac1cc22fe..0799c33ef 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -31,6 +31,7 @@ import history_window import dialogs import config import cell_renderer_image +import gtkgui_helpers from gajim import Contact from common import gajim @@ -201,7 +202,8 @@ class RosterWindow: return 'gadugadu' elif host.startswith('irc'): return 'irc' - elif host.startswith('icq'): # abc@icqsucks.org will match as ICQ, but what to do.. + # abc@icqsucks.org will match as ICQ, but what to do.. + elif host.startswith('icq'): return 'icq' elif host.startswith('msn'): return 'msn' @@ -225,32 +227,34 @@ class RosterWindow: iters = self.get_contact_iter(jid, account) if len(iters) == 0: return - users = gajim.contacts[account][jid] - name = users[0].name - if len(users) > 1: - name += ' (' + str(len(users)) + ')' - prio = 0 - user = users[0] - for u in users: - if u.priority > prio: - prio = u.priority - user = u + contact_instances = gtkgui_helpers.get_contact_instances_from_jid(account, + jid) + contact = contact_instances[0] + name = contact.name + if len(contact_instances) > 1: + name += ' (' + str(len(contact_instances)) + ')' + + prio = 0 # FIXME: add a comment explain what you do here + for c in contact_instances: + if c.priority > prio: + prio = c.priority + contact = c state_images = self.get_appropriate_state_images(jid) if gajim.awaiting_messages[account].has_key(jid): img = state_images['message'] elif jid.find('@') <= 0: # if not '@' or '@' starts the jid ==> agent - img = state_images[user.show] + img = state_images[contact.show] else: - if user.sub == 'both': - img = state_images[user.show] + if contact.sub == 'both': + img = state_images[contact.show] else: - if user.ask == 'subscribe': + if contact.ask == 'subscribe': img = state_images['requested'] else: transport = self.get_transport_name_by_jid(jid) - if transport and state_images.has_key(user.show): - img = state_images[user.show] + if transport and state_images.has_key(contact.show): + img = state_images[contact.show] else: img = state_images[_('not in the roster')] for iter in iters: @@ -2079,9 +2083,6 @@ _('If "%s" accepts this request you will know his status.') %jid).get_response() self.tooltip = dialogs.RosterTooltip(self.plugin) self.make_menu() self.draw_roster() - if len(gajim.connections) == 0: # if no account - self.plugin.windows['account_modification'] = \ - config.AccountModificationWindow(self.plugin) if gajim.config.get('show_roster_on_startup'): self.window.show_all() @@ -2090,3 +2091,7 @@ _('If "%s" accepts this request you will know his status.') %jid).get_response() # cannot happen via GUI, but I put this incase user touches config self.window.show_all() # without trayicon, he should see the roster! gajim.config.set('show_roster_on_startup', True) + + if len(gajim.connections) == 0: # if we have no account + self.plugin.windows['account_modification'] = \ + config.AccountModificationWindow(self.plugin) diff --git a/src/tabbed_chat_window.py b/src/tabbed_chat_window.py index 2e7dc4646..5c0c9a901 100644 --- a/src/tabbed_chat_window.py +++ b/src/tabbed_chat_window.py @@ -27,6 +27,7 @@ import base64 import dialogs import chat +import gtkgui_helpers from common import gajim from common import helpers @@ -105,14 +106,17 @@ class TabbedChatWindow(chat.Chat): tip.set_tip(self.xmls[jid].get_widget('gpg_eventbox'), tt) # add the fat line at the top - self.draw_name_banner(contact.name, jid) + self.draw_name_banner(contact) - def draw_name_banner(self, name, jid): + def draw_name_banner(self, contact, chatstate = None): '''Draw the fat line at the top of the window that houses the status icon, name, jid, and avatar''' # this is the text for the big brown bar - # some chars need to be escaped.. this fixes '&' - name = name.replace('&', '&') + # some chars need to be escaped.. + name = contact.name.replace('&', '&').replace('>','>').replace( + '<','<') + + jid = contact.jid #FIXME: uncomment me when we support sending messages to specific resource # composing full jid @@ -122,8 +126,12 @@ class TabbedChatWindow(chat.Chat): #label_text = '%s\n%s' \ # % (name, fulljid) - label_text = '%s\n%s' \ - % (name, jid) + if chatstate: + label_text = '%s (chat state: %s)\n%s' \ + % (name, chatstate, jid) + else: + label_text = '%s\n%s' \ + % (name, jid) # setup the label that holds name and jid banner_name_label = self.xmls[jid].get_widget('banner_name_label') @@ -316,6 +324,11 @@ class TabbedChatWindow(chat.Chat): gobject.timeout_add(30000, self.check_for_possible_inactive_chatstate, contact) + def handle_incoming_chatstate(self, account, jid, chatstate): + ''' handle incoming chatstate that jid SENT TO us ''' + contact = gtkgui_helpers.get_first_contact_instance_from_jid(account, jid) + self.draw_name_banner(contact, chatstate) + def check_for_possible_paused_chatstate(self, contact): ''' did we move mouse of that window or kbd activity in that window in the last 5 seconds?