From 166b265de0327267ae47234ca6f13d17e2647aca Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 27 Dec 2020 01:14:17 +0100 Subject: [PATCH 1/3] XEP-0045: Fix issues found by mypy --- slixmpp/plugins/xep_0045/muc.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/slixmpp/plugins/xep_0045/muc.py b/slixmpp/plugins/xep_0045/muc.py index 82c07edd..1ff7632b 100644 --- a/slixmpp/plugins/xep_0045/muc.py +++ b/slixmpp/plugins/xep_0045/muc.py @@ -207,6 +207,7 @@ class XEP_0045(BasePlugin): entry = self.rooms[room][nick] if entry is not None and entry['jid'].full == jid: return nick + return None def join_muc(self, room: JID, nick: str, maxhistory="0", password='', pstatus='', pshow='', pfrom=''): @@ -229,7 +230,7 @@ class XEP_0045(BasePlugin): self.our_nicks[room] = nick async def destroy(self, room: JID, reason='', altroom='', *, - ifrom: Optional[JID] = None, **iqkwargs) -> Iq: + ifrom: Optional[JID] = None, **iqkwargs): """Destroy a room.""" iq = self.xmpp.make_iq_set(ifrom=ifrom, ito=room) iq.enable('mucowner_query') @@ -259,7 +260,7 @@ class XEP_0045(BasePlugin): await iq.send(**iqkwargs) async def set_role(self, room: JID, nick: str, role: str, *, - ifrom: Optional[JID] = None, **iqkwargs) -> Iq: + ifrom: Optional[JID] = None, **iqkwargs): """ Change role property of a nick in a room. Typically, roles are temporary (they last only as long as you are in the room), whereas affiliations are permanent (they last across groupchat @@ -389,11 +390,11 @@ class XEP_0045(BasePlugin): """ Get the list of nicks in a room. """ if room not in self.rooms.keys(): - return None + raise ValueError("Room %s is not joined" % room) return self.rooms[room].keys() def get_users_by_affiliation(self, room: JID, affiliation='member', *, ifrom: Optional[JID] = None): # Preserve old API if affiliation not in AFFILIATIONS: - raise TypeError + raise ValueError("Affiliation %s does not exist" % affiliation) return self.get_affiliation_list(room, affiliation, ifrom=ifrom) From c05cafc9637854d21c1a7d6709c69f7e8dd1497a Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 27 Dec 2020 02:19:21 +0100 Subject: [PATCH 2/3] XEP-0045: Add missing reason for affiliation and role changes This is especially useful for ban/kick reasons. --- slixmpp/plugins/xep_0045/muc.py | 8 ++++++-- slixmpp/plugins/xep_0045/stanza.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/slixmpp/plugins/xep_0045/muc.py b/slixmpp/plugins/xep_0045/muc.py index 1ff7632b..aa1ed9e9 100644 --- a/slixmpp/plugins/xep_0045/muc.py +++ b/slixmpp/plugins/xep_0045/muc.py @@ -242,7 +242,7 @@ class XEP_0045(BasePlugin): await iq.send(**iqkwargs) async def set_affiliation(self, room: JID, jid: Optional[JID] = None, nick: Optional[str] = None, *, affiliation: str, - ifrom: Optional[JID] = None, **iqkwargs): + reason: str = '', ifrom: Optional[JID] = None, **iqkwargs): """ Change room affiliation.""" if affiliation not in AFFILIATIONS: raise ValueError('%s is not a valid affiliation' % affiliation) @@ -256,11 +256,13 @@ class XEP_0045(BasePlugin): item['nick'] = nick if jid: item['jid'] = jid + if reason: + item['reason'] = reason iq['mucadmin_query'].append(item) await iq.send(**iqkwargs) async def set_role(self, room: JID, nick: str, role: str, *, - ifrom: Optional[JID] = None, **iqkwargs): + reason: str = '', ifrom: Optional[JID] = None, **iqkwargs): """ Change role property of a nick in a room. Typically, roles are temporary (they last only as long as you are in the room), whereas affiliations are permanent (they last across groupchat @@ -273,6 +275,8 @@ class XEP_0045(BasePlugin): item = MUCAdminItem() item['role'] = role item['nick'] = nick + if reason: + item['reason'] = reason iq['mucadmin_query'].append(item) await iq.send(**iqkwargs) diff --git a/slixmpp/plugins/xep_0045/stanza.py b/slixmpp/plugins/xep_0045/stanza.py index 64224949..8de938fb 100644 --- a/slixmpp/plugins/xep_0045/stanza.py +++ b/slixmpp/plugins/xep_0045/stanza.py @@ -220,7 +220,8 @@ class MUCAdminItem(ElementBase): namespace = NS_ADMIN name = 'item' plugin_attrib = 'item' - interfaces = {'role', 'affiliation', 'nick', 'jid'} + interfaces = {'role', 'affiliation', 'nick', 'jid', 'reason'} + sub_interfaces = {'reason'} class MUCStatus(ElementBase): From 1e08c900185dec05111fb9f158497c8b3ff634d3 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 27 Dec 2020 02:59:43 +0100 Subject: [PATCH 3/3] XEP-0045: Add a set_subject() helper --- slixmpp/plugins/xep_0045/muc.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/slixmpp/plugins/xep_0045/muc.py b/slixmpp/plugins/xep_0045/muc.py index aa1ed9e9..4220978d 100644 --- a/slixmpp/plugins/xep_0045/muc.py +++ b/slixmpp/plugins/xep_0045/muc.py @@ -229,6 +229,13 @@ class XEP_0045(BasePlugin): self.rooms[room] = {} self.our_nicks[room] = nick + def set_subject(self, room: JID, subject: str, *, mfrom: Optional[JID] = None): + """Set a room’s subject.""" + msg = self.xmpp.make_message(room, mfrom=mfrom) + msg['type'] = 'groupchat' + msg['subject'] = subject + msg.send() + async def destroy(self, room: JID, reason='', altroom='', *, ifrom: Optional[JID] = None, **iqkwargs): """Destroy a room."""