From 2181690b9a753b1f2921999b72c7555c33dc90d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Wed, 15 Apr 2020 00:23:23 +0200 Subject: affiliations: display all relevant pieces of information we get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Don't fail if only one of the requests fail - Change UI a bit Signed-off-by: Maxime “pep” Buquet --- poezio/tabs/muctab.py | 61 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index 540911cb..1b61c395 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -1626,24 +1626,59 @@ class MucTab(ChatTab): 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'), + 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'), + return_exceptions=True, + ) + + all_errors = functools.reduce( + lambda acc, iq: acc and isinstance(iq, (IqError, IqTimeout)), + iqs, + True, + ) + + theme = get_theme() + aff_colors = { + 'owner': theme.CHAR_AFFILIATION_OWNER, + 'admin': theme.CHAR_AFFILIATION_ADMIN, + 'member': theme.CHAR_AFFILIATION_MEMBER, + 'none': theme.CHAR_AFFILIATION_NONE, + } + + if all_errors: + self.add_message( + 'Can\'t access affiliations', + highlight=True, + nickname='Error', + nick_color=theme.COLOR_ERROR_MSG, + typ=2, ) - except (IqError, IqTimeout) as exn: - self.core.room_error(exn.iq, jid) + self.core.refresh_window() return None - self._text_buffer.add_message('Affiliations:') + self._text_buffer.add_message('Affiliations') for iq in iqs: + if isinstance(iq, (IqError, IqTimeout)): + continue + 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')) - ) + items = query.findall('{%s}item' % MUC_ADMIN_NS) + if not items: # Nobody with this affiliation + continue + + affiliation = items[0].get('affiliation') + aff_char = aff_colors[affiliation] + self._text_buffer.add_message( + ' %s%s' % (aff_char, affiliation.capitalize()), + ) + + items = map(lambda i: i.get('jid'), items) + for ajid in sorted(items): + self._text_buffer.add_message(' %s' % ajid) + self.core.refresh_window() return None -- cgit v1.2.3