diff --git a/src/chat_control.py b/src/chat_control.py index baa9beec8..7b62ec6cd 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1815,6 +1815,9 @@ class ChatControl(ChatControlBase): encrypted = data[4], subject = data[1], xhtml = data[7]) if len(data) > 6 and isinstance(data[6], int): message_ids.append(data[6]) + + if len(data) > 8: + self.set_thread_id(data[8]) if message_ids: gajim.logger.set_read_messages(message_ids) gajim.events.remove_events(self.account, jid_with_resource, diff --git a/src/common/contacts.py b/src/common/contacts.py index b309981d4..d6352cea6 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -16,6 +16,8 @@ import common.gajim +import random, string + class Contact: '''Information concerning each contact''' def __init__(self, jid='', name='', groups=[], show='', status='', sub='', @@ -50,6 +52,20 @@ class Contact: self.chatstate = chatstate self.last_status_time = last_status_time + # XEP-0201 + self.sessions = {} + + def new_session(self): + thread_id = "".join([random.choice(string.letters) for x in xrange(0,32)]) + self.sessions[self.get_full_jid()] = thread_id + return thread_id + + def get_session(self): + try: + return self.sessions[self.get_full_jid()] + except KeyError: + return None + def get_full_jid(self): if self.resource: return self.jid + '/' + self.resource diff --git a/src/message_control.py b/src/message_control.py index e2d16a45b..11b3b6996 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -37,6 +37,8 @@ class MessageControl: self.hide_chat_buttons_current = False self.resource = resource + self.thread_id = self.contact.get_session() + gajim.last_message_time[self.account][self.get_full_jid()] = 0 self.xml = gtkgui_helpers.get_glade('message_window.glade', widget_name) @@ -110,14 +112,26 @@ class MessageControl: def get_specific_unread(self): return len(gajim.events.get_events(self.account, self.contact.jid)) + def set_thread_id(self, thread_id): + if thread_id == self.thread_id: + return + if self.thread_id: + print "starting a new session, forgetting about the old one!" + self.thread_id = thread_id + self.contact.sessions[self.contact.get_full_jid()] = thread_id + def send_message(self, message, keyID = '', type = 'chat', chatstate = None, msg_id = None, composing_jep = None, resource = None, user_nick = None): '''Send the given message to the active tab. Doesn't return None if error ''' jid = self.contact.jid + + if not self.thread_id: + self.thread_id = self.contact.new_session() + # Send and update history return gajim.connections[self.account].send_message(jid, message, keyID, type = type, chatstate = chatstate, msg_id = msg_id, composing_jep = composing_jep, resource = self.resource, - user_nick = user_nick) + user_nick = user_nick, thread = self.thread_id) diff --git a/src/roster_window.py b/src/roster_window.py index b1c3700d0..4f0019aa5 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3596,6 +3596,8 @@ class RosterWindow: typ = '' if msg_type == 'error': typ = 'status' + if thread: + ctrl.set_thread_id(thread) ctrl.print_conversation(msg, typ, tim = tim, encrypted = encrypted, subject = subject, xhtml = xhtml) if msg_id: