Preparation for MUC Archive querys
- Refactor and clean up code around MamMessageReceivedEvent - Goal is to add a GcMamMessageReceivedEvent later on - For that cause added a raw-mam-message-received base event
This commit is contained in:
parent
aefb571168
commit
33a51f3180
2 changed files with 75 additions and 38 deletions
|
@ -44,6 +44,7 @@ from common.logger import LOG_DB_PATH
|
|||
from common.pep import SUPPORTED_PERSONAL_USER_EVENTS
|
||||
from common.jingle_transport import JingleTransportSocks5
|
||||
from common.file_props import FilesProp
|
||||
from common.nec import NetworkEvent
|
||||
|
||||
if gajim.HAVE_PYOPENSSL:
|
||||
import OpenSSL.crypto
|
||||
|
@ -1037,43 +1038,70 @@ class BeforeChangeShowEvent(nec.NetworkIncomingEvent):
|
|||
|
||||
class MamMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||
name = 'mam-message-received'
|
||||
base_network_events = []
|
||||
base_network_events = ['raw-mam-message-received']
|
||||
|
||||
def init(self):
|
||||
def __init__(self, name, base_event):
|
||||
'''
|
||||
Pre-Generated attributes on self:
|
||||
|
||||
:conn: Connection instance
|
||||
:stanza: Complete stanza Node
|
||||
:forwarded: Forwarded Node
|
||||
:result: Result Node
|
||||
'''
|
||||
self._set_base_event_vars_as_attributes(base_event)
|
||||
self.additional_data = {}
|
||||
self.encrypted = False
|
||||
self.groupchat = False
|
||||
|
||||
def generate(self):
|
||||
if not self.stanza:
|
||||
return
|
||||
account = self.conn.name
|
||||
self.msg_ = self.stanza.getTag('message')
|
||||
# use timestamp of archived message, if available and archive timestamp otherwise
|
||||
delay = self.stanza.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
||||
delay2 = self.msg_.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
||||
if delay2:
|
||||
delay = delay2
|
||||
if not delay:
|
||||
return
|
||||
tim = delay.getAttr('stamp')
|
||||
tim = helpers.datetime_tuple(tim)
|
||||
self.tim = timegm(tim)
|
||||
to_ = self.msg_.getAttr('to')
|
||||
if to_:
|
||||
to_ = gajim.get_jid_without_resource(to_)
|
||||
else:
|
||||
to_ = gajim.get_jid_from_account(account)
|
||||
frm_ = gajim.get_jid_without_resource(self.msg_.getAttr('from'))
|
||||
archive_jid = self.stanza.getFrom()
|
||||
own_jid = self.conn.get_own_jid()
|
||||
if archive_jid and not archive_jid.bareMatch(own_jid):
|
||||
# MAM Message not from our Archive
|
||||
log.info('MAM message not from our user archive')
|
||||
return False
|
||||
|
||||
self.msg_ = self.forwarded.getTag('message')
|
||||
|
||||
if self.msg_.getType() == 'groupchat':
|
||||
log.info('Received groupchat message from user archive')
|
||||
return False
|
||||
|
||||
self.msgtxt = self.msg_.getTagData('body')
|
||||
if to_ == gajim.get_jid_from_account(account):
|
||||
self.with_ = frm_
|
||||
self.stanza_id = self.msg_.getID()
|
||||
self.mam_id = self.result.getID()
|
||||
self.query_id = self.result.getAttr('queryid')
|
||||
|
||||
# Use timestamp provided by archive,
|
||||
# Fallback: Use timestamp provided by user and issue a warning
|
||||
delay = self.forwarded.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
||||
if not delay:
|
||||
log.warning('No timestamp on archive Message, try fallback')
|
||||
delay = self.msg_.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
||||
if not delay:
|
||||
log.error('Received MAM message without timestamp')
|
||||
return
|
||||
|
||||
self.timestamp = helpers.parse_delay(delay)
|
||||
|
||||
frm = self.msg_.getFrom()
|
||||
to = self.msg_.getTo()
|
||||
|
||||
if not to or to.bareMatch(own_jid):
|
||||
self.with_ = str(frm)
|
||||
self.direction = 'from'
|
||||
self.resource = gajim.get_resource_from_jid(
|
||||
self.msg_.getAttr('from'))
|
||||
self.resource = frm.getResource()
|
||||
else:
|
||||
self.with_ = to_
|
||||
self.with_ = str(to)
|
||||
self.direction = 'to'
|
||||
self.resource = gajim.get_resource_from_jid(self.msg_.getAttr('to'))
|
||||
self.resource = to.getResource()
|
||||
|
||||
log_message = \
|
||||
'received: mam-message: ' \
|
||||
'stanza id: {:15} - mam id: {:15} - query id: {}'.format(
|
||||
self.stanza_id, self.mam_id, self.query_id)
|
||||
log.debug(log_message)
|
||||
return True
|
||||
|
||||
class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||
|
@ -1087,14 +1115,14 @@ class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
|||
self.additional_data = self.msg_obj.additional_data
|
||||
self.with_ = self.msg_obj.with_
|
||||
self.direction = self.msg_obj.direction
|
||||
self.tim = self.msg_obj.tim
|
||||
self.timestamp = self.msg_obj.timestamp
|
||||
res = self.msg_obj.resource
|
||||
self.msgtxt = self.msg_obj.msgtxt
|
||||
is_pm = gajim.logger.jid_is_room_jid(self.with_)
|
||||
if msg_.getAttr('type') == 'groupchat':
|
||||
if is_pm == False:
|
||||
log.warn('JID %s is marked as normal contact in database '
|
||||
'but we got a groupchat message from it.')
|
||||
'but we got a groupchat message from it.', self.with_)
|
||||
return
|
||||
if is_pm == None:
|
||||
gajim.logger.get_jid_id(self.with_, 'ROOM')
|
||||
|
@ -1105,12 +1133,12 @@ class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
|||
server = gajim.get_server_from_jid(self.with_)
|
||||
if server not in self.conn.mam_awaiting_disco_result:
|
||||
self.conn.mam_awaiting_disco_result[server] = [
|
||||
[self.with_, self.direction, self.tim, self.msgtxt,
|
||||
[self.with_, self.direction, self.timestamp, self.msgtxt,
|
||||
res]]
|
||||
self.conn.discoverInfo(server)
|
||||
else:
|
||||
self.conn.mam_awaiting_disco_result[server].append(
|
||||
[self.with_, self.direction, self.tim, self.msgtxt,
|
||||
[self.with_, self.direction, self.timestamp, self.msgtxt,
|
||||
res])
|
||||
return
|
||||
return True
|
||||
|
@ -1218,8 +1246,16 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
|||
nbxmpp.NS_MAM_1,
|
||||
nbxmpp.NS_MAM_2):
|
||||
forwarded = result.getTag('forwarded', namespace=nbxmpp.NS_FORWARD)
|
||||
gajim.nec.push_incoming_event(MamMessageReceivedEvent(None,
|
||||
conn=self.conn, stanza=forwarded, query_id=result.getAttr('queryid')))
|
||||
if not forwarded:
|
||||
log.warning('Invalid MAM Message: no forwarded child')
|
||||
return
|
||||
|
||||
gajim.nec.push_incoming_event(
|
||||
NetworkEvent('raw-mam-message-received',
|
||||
conn=self.conn,
|
||||
stanza=self.stanza,
|
||||
forwarded=forwarded,
|
||||
result=result))
|
||||
return
|
||||
|
||||
# Mediated invitation?
|
||||
|
|
|
@ -22,7 +22,7 @@ import nbxmpp
|
|||
from common import gajim
|
||||
from common import ged
|
||||
from common import helpers
|
||||
from common.connection_handlers_events import ArchivingReceivedEvent
|
||||
import common.connection_handlers_events as ev
|
||||
|
||||
from calendar import timegm
|
||||
from time import localtime
|
||||
|
@ -48,6 +48,7 @@ class ConnectionArchive313(ConnectionArchive):
|
|||
self.iq_answer = []
|
||||
self.mam_query_date = None
|
||||
self.mam_query_id = None
|
||||
gajim.nec.register_incoming_event(ev.MamMessageReceivedEvent)
|
||||
gajim.ged.register_event_handler('archiving-finished-legacy', ged.CORE,
|
||||
self._nec_result_finished)
|
||||
gajim.ged.register_event_handler('archiving-finished', ged.CORE,
|
||||
|
@ -132,7 +133,7 @@ class ConnectionArchive313(ConnectionArchive):
|
|||
def _nec_mam_decrypted_message_received(self, obj):
|
||||
if obj.conn.name != self.name:
|
||||
return
|
||||
gajim.logger.save_if_not_exists(obj.with_, obj.direction, obj.tim,
|
||||
gajim.logger.save_if_not_exists(obj.with_, obj.direction, obj.timestamp,
|
||||
msg=obj.msgtxt, nick=obj.nick, additional_data=obj.additional_data)
|
||||
|
||||
def get_query_id(self):
|
||||
|
@ -399,7 +400,7 @@ class ConnectionArchive136(ConnectionArchive):
|
|||
return ['may']
|
||||
|
||||
def _ArchiveCB(self, con, iq_obj):
|
||||
gajim.nec.push_incoming_event(ArchivingReceivedEvent(None, conn=self,
|
||||
gajim.nec.push_incoming_event(ev.ArchivingReceivedEvent(None, conn=self,
|
||||
stanza=iq_obj))
|
||||
raise nbxmpp.NodeProcessed
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue