Philipp Hörist pushed to branch master at gajim / python-nbxmpp


Commits:
44d57b9b by Philipp Hörist at 2019-07-08T20:49:12Z
Make DiscoInfo values available via propertys

- - - - -


2 changed files:

- nbxmpp/protocol.py
- nbxmpp/structs.py


Changes:

=====================================
nbxmpp/protocol.py
=====================================
@@ -123,6 +123,7 @@ NS_MUC_OWNER      = NS_MUC + '#owner'
 NS_MUC_UNIQUE     = NS_MUC + '#unique'
 NS_MUC_CONFIG     = NS_MUC + '#roomconfig'
 NS_MUC_REQUEST    = NS_MUC + '#request'
+NS_MUC_INFO       = NS_MUC + '#roominfo'
 NS_NICK           = 'http://jabber.org/protocol/nick'                 # 
XEP-0172
 NS_OFFLINE        = 'http://www.jabber.org/jeps/jep-0030.html'        # 
XEP-0013
 NS_PHYSLOC        = 'http://jabber.org/protocol/physloc'              # 
XEP-0112


=====================================
nbxmpp/structs.py
=====================================
@@ -24,6 +24,7 @@ from nbxmpp.protocol import NS_STANZAS
 from nbxmpp.protocol import NS_MAM_1
 from nbxmpp.protocol import NS_MAM_2
 from nbxmpp.protocol import NS_MUC
+from nbxmpp.protocol import NS_MUC_INFO
 from nbxmpp.const import MessageType
 from nbxmpp.const import AvatarState
 from nbxmpp.const import StatusCode
@@ -132,6 +133,20 @@ class DiscoInfo(namedtuple('DiscoInfo', 'jid node 
identities features dataforms'
         except Exception:
             return None
 
+    def _get_form_value(self, form_type, var):
+        for dataform in self.dataforms:
+            try:
+                is_info_form = dataform['FORM_TYPE'] != form_type
+                if not is_info_form:
+                    continue
+
+                if dataform[var].type_ == 'jid-multi':
+                    return dataform[var].values or None
+                return dataform[var].value or None
+
+            except Exception:
+                continue
+
     @property
     def is_muc(self):
         for identity in self.identities:
@@ -139,7 +154,95 @@ class DiscoInfo(namedtuple('DiscoInfo', 'jid node 
identities features dataforms'
                 if NS_MUC in self.features:
                     return True
         return False
-    
+
+    @property
+    def muc_name(self):
+        for identity in self.identities:
+            if identity.category == 'conference':
+                return identity.name
+
+    @property
+    def muc_description(self):
+        return self._get_form_value(NS_MUC_INFO, 'muc#roominfo_description')
+
+    @property
+    def muc_log_uri(self):
+        return self._get_form_value(NS_MUC_INFO, 'muc#roominfo_logs')
+
+    @property
+    def muc_users(self):
+        return self._get_form_value(NS_MUC_INFO, 'muc#roominfo_occupants')
+
+    @property
+    def muc_contacts(self):
+        return self._get_form_value(NS_MUC_INFO, 'muc#roominfo_contactjid')
+
+    @property
+    def muc_subject(self):
+        return self._get_form_value(NS_MUC_INFO, 'muc#roominfo_subject')
+
+    @property
+    def muc_subjectmod(self):
+        # muc#roominfo_changesubject stems from a wrong example in the MUC XEP
+        # Ejabberd and Prosody use this value
+        return (self._get_form_value(NS_MUC_INFO, 'muc#roominfo_subjectmod') or
+                self._get_form_value(NS_MUC_INFO, 
'muc#roominfo_changesubject'))
+
+    @property
+    def muc_lang(self):
+        return self._get_form_value(NS_MUC_INFO, 'muc#roominfo_lang')
+
+    @property
+    def muc_has_mam(self):
+        return NS_MAM_2 in self.features or NS_MAM_1 in self.features
+
+    @property
+    def muc_is_persistent(self):
+        return 'muc_persistent' in self.features
+
+    @property
+    def muc_is_moderated(self):
+        return 'muc_moderated' in self.features
+
+    @property
+    def muc_is_open(self):
+        return 'muc_open' in self.features
+
+    @property
+    def muc_is_members_only(self):
+        return 'muc_membersonly' in self.features
+
+    @property
+    def muc_is_hidden(self):
+        return 'muc_hidden' in self.features
+
+    @property
+    def muc_is_nonanonymous(self):
+        return 'muc_nonanonymous' in self.features
+
+    @property
+    def muc_is_passwordprotected(self):
+        return 'muc_passwordprotected' in self.features
+
+    @property
+    def muc_is_public(self):
+        return 'muc_public' in self.features
+
+    @property
+    def muc_is_semianonymous(self):
+        return 'muc_semianonymous' in self.features
+
+    @property
+    def muc_is_temporary(self):
+        return 'muc_temporary' in self.features
+
+    @property
+    def muc_is_unmoderated(self):
+        return 'muc_unmoderated' in self.features
+
+    @property
+    def muc_is_unsecured(self):
+        return 'muc_unsecured' in self.features
 
 
 class DiscoIdentity(namedtuple('DiscoIdentity', 'category type name lang')):



View it on GitLab: 
https://dev.gajim.org/gajim/python-nbxmpp/commit/44d57b9b1a30968fbc7e2f507e566c6634cc7391

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/python-nbxmpp/commit/44d57b9b1a30968fbc7e2f507e566c6634cc7391
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list
[email protected]
https://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to