Merge branch 'affiliations-list' into 'master'

Fix #2280: Allow /affiliation to list all affiliations

Closes #2280

See merge request poezio/poezio!19
This commit is contained in:
mathieui 2020-03-29 16:35:50 +02:00
commit 1f014b6bfb

View file

@ -7,6 +7,7 @@ It keeps track of many things such as part/joins, maintains an
user list, and updates private tabs when necessary. user list, and updates private tabs when necessary.
""" """
import asyncio
import bisect import bisect
import curses import curses
import logging import logging
@ -20,6 +21,7 @@ from datetime import datetime
from typing import Dict, Callable, List, Optional, Union, Set from typing import Dict, Callable, List, Optional, Union, Set
from slixmpp import InvalidJID, JID from slixmpp import InvalidJID, JID
from slixmpp.exceptions import IqError, IqTimeout
from poezio.tabs import ChatTab, Tab, SHOW_NAME from poezio.tabs import ChatTab, Tab, SHOW_NAME
from poezio import common from poezio import common
@ -1596,24 +1598,55 @@ class MucTab(ChatTab):
nick, role, reason = args[0], args[1].lower(), args[2] nick, role, reason = args[0], args[1].lower(), args[2]
self.change_role(nick, role, reason) self.change_role(nick, role, reason)
@command_args_parser.quoted(2) @command_args_parser.quoted(0, 2)
def command_affiliation(self, args): def command_affiliation(self, args) -> None:
""" """
/affiliation <nick or jid> <affiliation> /affiliation [<nick or jid> [<affiliation>]]
Changes the affiliation of a user Changes the affiliation of a user
affiliations can be: outcast, none, member, admin, owner affiliations can be: outcast, none, member, admin, owner
""" """
def callback(iq): room = JID(self.name)
if iq['type'] == 'error': if not room:
self.core.room_error(iq, self.jid.bare) 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') return self.core.command.help('affiliation')
nick, affiliation = args[0], args[1].lower() nick, affiliation = args[0], args[1].lower()
# Set affiliation
self.change_affiliation(nick, 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 @command_args_parser.raw
def command_say(self, line, correct=False): def command_say(self, line, correct=False):
""" """
@ -1936,7 +1969,7 @@ class MucTab(ChatTab):
'func': 'func':
self.command_affiliation, self.command_affiliation,
'usage': 'usage':
'<nick or jid> <affiliation>', '[<nick or jid> [<affiliation>]]',
'desc': ('Set the affiliation of a user. Affiliations can be:' 'desc': ('Set the affiliation of a user. Affiliations can be:'
' outcast, none, member, admin, owner.'), ' outcast, none, member, admin, owner.'),
'shortdesc': 'shortdesc':