summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--poezio/core/handlers.py45
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):