From 9fc15165227af712b56709c8516e1cfefa1dd70c Mon Sep 17 00:00:00 2001 From: Nikos Kouremenos Date: Fri, 22 Jul 2005 00:34:08 +0000 Subject: [PATCH] we now have contact.chatstate ! --- src/common/connection.py | 3 ++- src/common/gajim.py | 12 ++++++------ src/common/helpers.py | 2 +- src/gajim.py | 30 ++++++++++++++++++++---------- src/tabbed_chat_window.py | 39 +++++++++++++++++++-------------------- 5 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index daf67b98f..ca55e7a17 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -901,7 +901,8 @@ class Connection: # chatstates - if peer supports jep85, send chatstates # please note that the only valid tag inside a message containing a tag is the active event if chatstate is not None: - msg_iq.setTag(chatstate, {}, namespace='http://jabber.org/protocol/chatstates') + msg_iq.setTag(chatstate, {}, + namespace = 'http://jabber.org/protocol/chatstates') self.to_be_sent.append(msg_iq) gajim.logger.write('outgoing', msg, jid) diff --git a/src/common/gajim.py b/src/common/gajim.py index 8ab3b3b31..b73ae7315 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -63,13 +63,13 @@ sleeper_state = {} # whether we pass auto away / xa or not 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 + return contacts[account][jid] def get_first_contact_instance_from_jid(account, jid): - contact_instances = get_contact_instances_from_jid(account, jid) - return contact_instances[0] + return contacts[account][jid][0] def get_contact_name_from_jid(account, jid): - contact_instances = get_contact_instances_from_jid(account, jid) - return contact_instances[0].name + return contacts[account][jid][0].name + +def get_jid_without_resource(jid): + return jid.split('/')[0] diff --git a/src/common/helpers.py b/src/common/helpers.py index c406d4379..c4fab0fcd 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -58,7 +58,7 @@ def get_fjid_from_nick(room_jid, nick): return fjid def get_nick_from_jid(jid): - pos = jid.rfind('/') + pos = jid.find('@') return jid[:pos] def get_nick_from_fjid(jid): diff --git a/src/gajim.py b/src/gajim.py index 040d5c1d1..efecb74ac 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -91,8 +91,9 @@ except ImportError: class Contact: '''Information concerning each contact''' - def __init__(self, jid='', name='', groups=[], show='', status='', sub='', - ask='', resource='', priority=5, keyID='', role='', affiliation=''): + def __init__(self, jid='', name='', groups=[], show='', status='', sub='',\ + ask='', resource='', priority=5, keyID='', role='', affiliation='',\ + chatstate=None): self.jid = jid self.name = name self.groups = groups @@ -106,6 +107,14 @@ class Contact: self.role = role self.affiliation = affiliation + # please read jep-85 http://www.jabber.org/jeps/jep-0085.html + # we keep track of jep85 support by the peer by three extra states: + # None, False and 'ask' + # None if no info about peer + # False if peer does not support jep85 + # 'ask' if we sent the first 'active' chatstate and are waiting for reply + self.chatstate = chatstate + import roster_window import systray import dialogs @@ -347,8 +356,8 @@ 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)) - jid = array[0].split('/')[0] + #('MSG', account, (jid, msg, time, encrypted, msg_type, subject, chatstate)) + jid = gajim.get_jid_without_resource(array[0]) msg_type = array[4] chatstate = array[6] if jid.find('@') <= 0: @@ -379,16 +388,17 @@ class Interface: if self.windows[account]['chats'].has_key(jid): chat_win = self.windows[account]['chats'][jid] + contact = gajim.get_first_contact_instance_from_jid(account, jid) 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 + if contact.chatstate == 'ask': # we were jep85 disco? + contact.chatstate = '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 + contact.chatstate = False - if not array[1]: #empty message + if not array[1]: #empty message text return first = False @@ -491,10 +501,10 @@ class Interface: 'attached_gpg_keys').split() if jid in attached_keys: keyID = attached_keys[attached_keys.index(jid) + 1] - user1 = Contact(jid = jid, name = jid.split('@')[0], + contact1 = Contact(jid = jid, name = jid.split('@')[0], groups = [_('General')], show = 'online', status = 'online', ask = 'to', resource = array[1], keyID = keyID) - gajim.contacts[account][jid] = [user1] + gajim.contacts[account][jid] = [contact1] self.roster.add_contact_to_roster(jid, account) dialogs.InformationDialog(_('Authorization accepted'), _('The contact "%s" has authorized you to see his status.') diff --git a/src/tabbed_chat_window.py b/src/tabbed_chat_window.py index 48170f50f..681e129c4 100644 --- a/src/tabbed_chat_window.py +++ b/src/tabbed_chat_window.py @@ -454,13 +454,6 @@ class TabbedChatWindow(chat.Chat): ''' sends our chatstate as STANDLONE chat state message (eg. no body) to the current tab only if new chatstate is different from the previous one''' - # please read jep-85 http://www.jabber.org/jeps/jep-0085.html - # we keep track of jep85 support by the peer by three extra states: - # None, False and 'ask' - # None if no info about peer - # False if peer does not support jep85 - # 'ask' if we sent the first 'active' chatstate and are waiting for reply - # JEP 85 does not allow resending the same chatstate # this function checks for that and just returns so it's safe to call it # with same state. @@ -476,16 +469,17 @@ class TabbedChatWindow(chat.Chat): return jid = self.get_active_jid() + contact = gajim.get_first_contact_instance_from_jid(self.account, jid) - if self.chatstates[jid] == False: # jid cannot do jep85 + if contact.chatstate is False: # jid cannot do jep85 return # if current state equals previous state, return - if self.chatstates[jid] == state: + if contact.chatstate == state: return - if self.chatstates[jid] is None: - # we don't know anything about jid, + if contact.chatstate is None: + # we don't know anything about jid, so return # NOTE: # send 'active', set current state to 'ask' and return is done # in send_message because we need REAL message (with ) @@ -493,20 +487,20 @@ class TabbedChatWindow(chat.Chat): # until we know peer supports jep85 return - if self.chatstates[jid] == 'ask': + if contact.chatstate == 'ask': return # prevent going paused if we we were not composing (JEP violation) - if state == 'paused' and not self.chatstates[jid] == 'composing': + if state == 'paused' and not contact.chatstate == 'composing': gajim.connections[self.account].send_message(jid, None, None, chatstate = 'active') # go active before # if we're inactive prevent composing (JEP violation) - if self.chatstates[jid] == 'inactive' and state == 'composing': + if contact.chatstate == 'inactive' and state == 'composing': gajim.connections[self.account].send_message(jid, None, None, chatstate = 'active') # go active before - self.chatstates[jid] = state + contact.chatstate = state gajim.connections[self.account].send_message(jid, None, None, chatstate = state) @@ -514,10 +508,13 @@ class TabbedChatWindow(chat.Chat): """Send the given message to the active tab""" if not message: return + jid = self.get_active_jid() + contact = gajim.get_first_contact_instance_from_jid(self.account, jid) conversation_textview = self.xmls[jid].get_widget('conversation_textview') message_textview = self.xmls[jid].get_widget('message_textview') message_buffer = message_textview.get_buffer() + if message != '' or message != '\n': self.save_sent_message(jid, message) if message == '/clear': @@ -534,21 +531,23 @@ class TabbedChatWindow(chat.Chat): keyID = self.contacts[jid].keyID encrypted = True - notif_on = gajim.config.get('send_receive_chat_state_notifications') + chatstates_on = gajim.config.get( + 'send_receive_chat_state_notifications') chatstate_to_send = None - if notif_on: # if we have them one - if self.chatstates[jid] is None: + + if chatstates_on: # if we have them one + if contact.chatstate is None: # no info about peer # send active to discover chat state capabilities # this is here (and not in send_chatstate) # because we want it sent with REAL message # (not standlone) eg. one that has body chatstate_to_send = 'active' - self.chatstates[jid] = 'ask' # pseudo state + contact.chatstate = 'ask' # pseudo state # if peer supports jep85, send 'active' - elif self.chatstates[jid] != False: + elif contact.chatstate is not False: #send active chatstate on every message (as JEP says) chatstate_to_send = 'active'