diff options
-rw-r--r-- | poezio/core/handlers.py | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/poezio/core/handlers.py b/poezio/core/handlers.py index d6a4c8b9..158dff17 100644 --- a/poezio/core/handlers.py +++ b/poezio/core/handlers.py @@ -109,28 +109,47 @@ class HandlerCore: """ Try to determine whether a given message is a MUC-PM, without a roundtrip. Returns None when it's not clear """ + # first, look for the x (XEP-0045 version 1.28) - if message.xml.find( - '{http://jabber.org/protocol/muc#user}x' - ) is not None: - log.debug('MUC-PM from %s with <x>', - with_jid) + if message.xml.find('{http://jabber.org/protocol/muc#user}x') is not None: + log.debug('MUC-PM from %s with <x>', with_jid) return True + + jid_bare = with_jid.bare + + # then, look whether we have a matching tab with barejid + tab = self.core.tabs.by_jid(JID(jid_bare)) + if tab is not None: + if isinstance(tab, tabs.MucTab): + log.debug('MUC-PM from %s in known MucTab', with_jid) + return True + one_to_one = isinstance(tab, ( + tabs.ConversationTab, + tabs.DynamicConversationTab, + )) + if one_to_one: + return False + + # then, look whether we have a matching tab with fulljid + if with_jid.resource: + tab = self.core.tabs.by_jid(with_jid) + if tab is not None: + if isinstance(tab, tabs.PrivateTab): + log.debug('MUC-PM from %s in known PrivateTab', with_jid) + return True + if isinstance(tab, tabs.StaticConversationTab): + return False + # then, look in the roster - if with_jid.bare in roster and roster[with_jid.bare].subscription != 'none': + if jid_bare in roster and roster[jid_bare].subscription != 'none': return False + # then, check bookmarks - jid_bare = with_jid.bare for bm in self.core.bookmarks: if bm.jid.bare == jid_bare: log.debug('MUC-PM from %s in bookmarks', with_jid) return True - # then, look whether we know the MUC JID - for tab in self.core.get_tabs(tabs.MucTab): - if tab.jid.bare == jid_bare: - if with_jid.resource: - log.debug('MUC-PM from %s in known MucTab', with_jid) - return True + return None def on_carbon_received(self, message): |