diff sat/plugins/plugin_xep_0060.py @ 3062:93e8793a735a

plugin XEP-0060: fixed bad MAM unwrapping after Python 3 port
author Goffi <goffi@goffi.org>
date Sun, 20 Oct 2019 19:34:26 +0200
parents ab2696e34d29
children 73db9db8b9e1
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0060.py	Fri Oct 18 17:51:44 2019 +0200
+++ b/sat/plugins/plugin_xep_0060.py	Sun Oct 20 19:34:26 2019 +0200
@@ -17,23 +17,24 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+
+from collections import namedtuple
+import urllib.request, urllib.parse, urllib.error
+from functools import reduce
+
 from sat.core.i18n import _
 from sat.core.constants import Const as C
 from sat.core.log import getLogger
 
-log = getLogger(__name__)
 from sat.core import exceptions
 from sat.tools import sat_defer
 from sat.tools.common import data_format
 
-from twisted.words.protocols.jabber import jid, error
-from twisted.internet import reactor, defer
+from zope.interface import implementer
+
 from wokkel import disco
 from wokkel import data_form
 from wokkel import generic
-from zope.interface import implementer
-from collections import namedtuple
-import urllib.request, urllib.parse, urllib.error
 
 # XXX: sat_tmp.wokkel.pubsub is actually use instead of wokkel version
 #      mam and rsm come from sat_tmp.wokkel too
@@ -41,6 +42,11 @@
 from wokkel import rsm
 from wokkel import mam
 
+from twisted.words.protocols.jabber import jid, error
+from twisted.internet import reactor, defer
+
+
+log = getLogger(__name__)
 
 PLUGIN_INFO = {
     C.PI_NAME: "Publish-Subscribe",
@@ -537,14 +543,16 @@
 
     def _unwrapMAMMessage(self, message_elt):
         try:
-            item_elt = (
-                next(message_elt.elements(mam.NS_MAM, "result").next()
-                .elements(C.NS_FORWARD, "forwarded").next()
-                .elements(C.NS_CLIENT, "message").next()
-                .elements("http://jabber.org/protocol/pubsub#event", "event").next()
-                .elements("http://jabber.org/protocol/pubsub#event", "items").next()
-                .elements("http://jabber.org/protocol/pubsub#event", "item"))
-            )
+            item_elt = reduce(
+                lambda elt, ns_name: next(elt.elements(*ns_name)),
+                (message_elt,
+                 (mam.NS_MAM, "result"),
+                 (C.NS_FORWARD, "forwarded"),
+                 (C.NS_CLIENT, "message"),
+                 ("http://jabber.org/protocol/pubsub#event", "event"),
+                 ("http://jabber.org/protocol/pubsub#event", "items"),
+                 ("http://jabber.org/protocol/pubsub#event", "item"),
+                ))
         except StopIteration:
             raise exceptions.DataError("Can't find Item in MAM message element")
         return item_elt