Пример #1
0
 def pre_cb(query: Iq) -> None:
     stanza_mask['mam_result']['queryid'] = query['id']
     xml_mask = str(stanza_mask)
     query['mam']['queryid'] = query['id']
     collector = Collector('MAM_Results_%s' % query_id,
                           MatchXMLMask(xml_mask))
     self.xmpp.register_handler(collector)
     cb_data['collector'] = collector
Пример #2
0
 def plugin_init(self):
     self.xmpp.register_handler(
         Callback(
             'Reaction received',
             MatchXMLMask(
                 '<message><reactions xmlns="urn:xmpp:reactions:0"/></message>'
             ),
             self._handle_reactions,
         ))
     self.xmpp['xep_0030'].add_feature('urn:xmpp:reactions:0')
     register_stanza_plugin(Message, stanza.Reactions)
Пример #3
0
 def send_feature(self, data, method='mask', use_values=True, timeout=1):
     """
     """
     sent_data = self.xmpp.socket.next_sent(timeout)
     xml = self.parse_xml(data)
     sent_xml = self.parse_xml(sent_data)
     if sent_data is None:
         self.fail("No stanza was sent.")
     if method == 'exact':
         self.assertTrue(self.compare(xml, sent_xml),
             "Features do not match.\nDesired:\n%s\nReceived:\n%s" % (
                 highlight(tostring(xml)), highlight(tostring(sent_xml))))
     elif method == 'mask':
         matcher = MatchXMLMask(xml)
         self.assertTrue(matcher.match(sent_xml),
             "Stanza did not match using %s method:\n" % method + \
             "Criteria:\n%s\n" % highlight(tostring(xml)) + \
             "Stanza:\n%s" % highlight(tostring(sent_xml)))
     else:
         raise ValueError("Uknown matching method: %s" % method)
Пример #4
0
 def send_feature(self, data, method='mask', use_values=True, timeout=1):
     """
     """
     sent_data = self.xmpp.socket.next_sent(timeout)
     xml = self.parse_xml(data)
     sent_xml = self.parse_xml(sent_data)
     if sent_data is None:
         self.fail("No stanza was sent.")
     if method == 'exact':
         self.assertTrue(self.compare(xml, sent_xml),
             "Features do not match.\nDesired:\n%s\nReceived:\n%s" % (
                 highlight(tostring(xml)), highlight(tostring(sent_xml))))
     elif method == 'mask':
         matcher = MatchXMLMask(xml)
         self.assertTrue(matcher.match(sent_xml),
             "Stanza did not match using %s method:\n" % method + \
             "Criteria:\n%s\n" % highlight(tostring(xml)) + \
             "Stanza:\n%s" % highlight(tostring(sent_xml)))
     else:
         raise ValueError("Uknown matching method: %s" % method)
Пример #5
0
    def retrieve(self,
                 jid: Optional[JID] = None,
                 start: Optional[datetime] = None,
                 end: Optional[datetime] = None,
                 with_jid: Optional[JID] = None,
                 ifrom: Optional[JID] = None,
                 reverse: bool = False,
                 timeout: int = None,
                 callback: Callable[[Iq], None] = None,
                 iterator: bool = False,
                 rsm: Optional[Dict[str, Any]] = None) -> Awaitable:
        """
        Send a MAM query and retrieve the results.

        :param JID jid: Entity holding the MAM records
        :param datetime start,end: MAM query temporal boundaries
        :param JID with_jid: Filter results on this JID
        :param JID ifrom: To change the from address of the query
        :param bool reverse: Get the results in reverse order
        :param int timeout: IQ timeout
        :param func callback: Custom callback for handling results
        :param bool iterator: Use RSM and iterate over a paginated query
        :param dict rsm: RSM custom options
        """
        iq, stanza_mask = self._pre_mam_retrieve(jid, start, end, with_jid,
                                                 ifrom)
        query_id = iq['id']
        amount = 10
        if rsm:
            for key, value in rsm.items():
                iq['mam']['rsm'][key] = str(value)
                if key == 'max':
                    amount = value
        cb_data = {}

        xml_mask = str(stanza_mask)

        def pre_cb(query: Iq) -> None:
            stanza_mask['mam_result']['queryid'] = query['id']
            xml_mask = str(stanza_mask)
            query['mam']['queryid'] = query['id']
            collector = Collector('MAM_Results_%s' % query_id,
                                  MatchXMLMask(xml_mask))
            self.xmpp.register_handler(collector)
            cb_data['collector'] = collector

        def post_cb(result: Iq) -> None:
            results = cb_data['collector'].stop()
            if result['type'] == 'result':
                result['mam']['results'] = results
                result['mam_fin']['results'] = results

        if iterator:
            return self.xmpp['xep_0059'].iterate(iq,
                                                 'mam',
                                                 'results',
                                                 amount=amount,
                                                 reverse=reverse,
                                                 recv_interface='mam_fin',
                                                 pre_cb=pre_cb,
                                                 post_cb=post_cb)

        collector = Collector('MAM_Results_%s' % query_id,
                              MatchXMLMask(xml_mask))
        self.xmpp.register_handler(collector)

        def wrapped_cb(iq: Iq) -> None:
            results = collector.stop()
            if iq['type'] == 'result':
                iq['mam']['results'] = results
            if callback:
                callback(iq)

        return iq.send(timeout=timeout, callback=wrapped_cb)