diff options
author | mathieui <mathieui@mathieui.net> | 2020-03-29 16:35:50 +0200 |
---|---|---|
committer | mathieui <mathieui@mathieui.net> | 2020-03-29 16:35:50 +0200 |
commit | 1f014b6bfb4fac60a22a09949abb5a65d33759f7 (patch) | |
tree | 5ceb188078b05ccacdefc9ad24b205a4d4f219f0 | |
parent | 854bb0cedb151e185b9710937cf04d8757b9f100 (diff) | |
parent | 4e0d3d8107642f3e97519281dac33a61b0c954f5 (diff) | |
download | poezio-1f014b6bfb4fac60a22a09949abb5a65d33759f7.tar.gz poezio-1f014b6bfb4fac60a22a09949abb5a65d33759f7.tar.bz2 poezio-1f014b6bfb4fac60a22a09949abb5a65d33759f7.tar.xz poezio-1f014b6bfb4fac60a22a09949abb5a65d33759f7.zip |
Merge branch 'affiliations-list' into 'master'
Fix #2280: Allow /affiliation to list all affiliations
Closes #2280
See merge request poezio/poezio!19
-rw-r--r-- | poezio/tabs/muctab.py | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index 3e754ae6..3985a6c7 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -7,6 +7,7 @@ It keeps track of many things such as part/joins, maintains an user list, and updates private tabs when necessary. """ +import asyncio import bisect import curses import logging @@ -20,6 +21,7 @@ from datetime import datetime from typing import Dict, Callable, List, Optional, Union, Set from slixmpp import InvalidJID, JID +from slixmpp.exceptions import IqError, IqTimeout from poezio.tabs import ChatTab, Tab, SHOW_NAME from poezio import common @@ -1596,24 +1598,55 @@ class MucTab(ChatTab): nick, role, reason = args[0], args[1].lower(), args[2] self.change_role(nick, role, reason) - @command_args_parser.quoted(2) - def command_affiliation(self, args): + @command_args_parser.quoted(0, 2) + def command_affiliation(self, args) -> None: """ - /affiliation <nick or jid> <affiliation> + /affiliation [<nick or jid> [<affiliation>]] Changes the affiliation of a user affiliations can be: outcast, none, member, admin, owner """ - def callback(iq): - if iq['type'] == 'error': - self.core.room_error(iq, self.jid.bare) + room = JID(self.name) + if not room: + self.core.information('affiliation: requires a valid chat address', 'Error') + return - if args is None: + # List affiliations + if not args: + asyncio.ensure_future(self.get_users_affiliations(room)) + return None + + if len(args) != 2: return self.core.command.help('affiliation') nick, affiliation = args[0], args[1].lower() + # Set affiliation self.change_affiliation(nick, affiliation) + async def get_users_affiliations(self, jid: JID) -> None: + MUC_ADMIN_NS = 'http://jabber.org/protocol/muc#admin' + + try: + iqs = await asyncio.gather( + self.core.xmpp['xep_0045'].get_users_by_affiliation(jid, 'owner'), + self.core.xmpp['xep_0045'].get_users_by_affiliation(jid, 'admin'), + self.core.xmpp['xep_0045'].get_users_by_affiliation(jid, 'member'), + self.core.xmpp['xep_0045'].get_users_by_affiliation(jid, 'outcast'), + ) + except (IqError, IqTimeout) as exn: + self.core.room_error(exn.iq, jid) + return None + + self._text_buffer.add_message('Affiliations:') + for iq in iqs: + query = iq.xml.find('{%s}query' % MUC_ADMIN_NS) + for item in query.findall('{%s}item' % MUC_ADMIN_NS): + self._text_buffer.add_message( + '%s: %s' % (item.get('jid'), item.get('affiliation')) + ) + self.core.refresh_window() + return None + @command_args_parser.raw def command_say(self, line, correct=False): """ @@ -1936,7 +1969,7 @@ class MucTab(ChatTab): 'func': self.command_affiliation, 'usage': - '<nick or jid> <affiliation>', + '[<nick or jid> [<affiliation>]]', 'desc': ('Set the affiliation of a user. Affiliations can be:' ' outcast, none, member, admin, owner.'), 'shortdesc': |