From 69cfe86ece1e21e9392add8ac1f8729a4b1fc3a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Sch=C3=A4fer?= <felix@thegcat.net> Date: Sat, 8 Oct 2022 23:38:58 +0200 Subject: [PATCH] Allow inviting to multiple rooms #13 --- CHANGELOG.md | 2 ++ pretix_matrix_inviter/forms.py | 48 +++++++++++++++++++------------- pretix_matrix_inviter/helpers.py | 19 +++++++++---- pretix_matrix_inviter/signals.py | 30 +++++++++++--------- pretix_matrix_inviter/tasks.py | 21 +++++++++++--- 5 files changed, 79 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 281aec8..89b31ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Allow inviting participants to multiple Matrix rooms ## [1.4.1] - 2022-05-26 diff --git a/pretix_matrix_inviter/forms.py b/pretix_matrix_inviter/forms.py index a667734..79daae0 100644 --- a/pretix_matrix_inviter/forms.py +++ b/pretix_matrix_inviter/forms.py @@ -50,7 +50,7 @@ class MatrixInviterForm(SettingsForm): ) matrix_inviter_matrix_room = RegexField( label=_("Matrix room"), - regex="(!|#)[^:]+:.+", + regex="(?:!|#)[^:]+:[^:,]+(?:\\s*,\\s*(?:!|#)[^:]+:[^:,]+)*", strip=True, ) @@ -61,22 +61,32 @@ class MatrixInviterForm(SettingsForm): ] room_info = matrix_room_info_for_event(self.obj) - if not room_info["room_id"]: - room_help_text = "" - elif self.obj.settings.matrix_inviter_matrix_room.startswith("!"): - if room_info["canonical_alias"]: - room_help_text = _( - '"{name}" (main address: <code>{canonical_alias}</code>)' - ) - else: - room_help_text = _('"{name}"') + if not room_info: + room_help_text = _( + "Comma-separated list of room IDs or aliases to invite users to." + ) else: - if room_info["canonical_alias"]: - room_help_text = _( - '"{name}" (<code>{room_id}</code>, main address: <code>{canonical_alias}</code>)' - ) - else: - room_help_text = _('"{name}" (<code>{room_id}</code>)') - self.fields["matrix_inviter_matrix_room"].help_text = room_help_text.format_map( - room_info - ) + room_help = [] + for room in room_info: + if room["room_id"].startswith("!"): + if room["canonical_alias"]: + room_help.append( + _( + '"{name}" (main address: <code>{canonical_alias}</code>)' + ).format_map(room) + ) + else: + room_help.append(_('"{name}"').format_map(room)) + else: + if room["canonical_alias"]: + room_help.append( + _( + '"{name}" (<code>{room_id}</code>, main address: <code>{canonical_alias}</code>)' + ).format_map(room) + ) + else: + room_help.append( + _('"{name}" (<code>{room_id}</code>)').format_map(room) + ) + room_help_text = ", ".join(room_help) + self.fields["matrix_inviter_matrix_room"].help_text = room_help_text diff --git a/pretix_matrix_inviter/helpers.py b/pretix_matrix_inviter/helpers.py index c3dfed2..49bd1ff 100644 --- a/pretix_matrix_inviter/helpers.py +++ b/pretix_matrix_inviter/helpers.py @@ -2,14 +2,23 @@ import requests from urllib.parse import quote as url_quote +def matrix_parse_room_ids(room_ids): + return [room_id.strip() for room_id in room_ids.split(",")] + + def matrix_room_info_for_event(event): return event.cache.get_or_set( "matrix_room_info", - matrix_room_info( - event.settings.matrix_inviter_matrix_server, - event.settings.matrix_inviter_authorization_token, - event.settings.matrix_inviter_matrix_room, - ), + [ + matrix_room_info( + event.settings.matrix_inviter_matrix_server, + event.settings.matrix_inviter_authorization_token, + room_id, + ) + for room_id in matrix_parse_room_ids( + event.settings.matrix_inviter_matrix_room + ) + ], 120, ) diff --git a/pretix_matrix_inviter/signals.py b/pretix_matrix_inviter/signals.py index 1c46966..a91bd8f 100644 --- a/pretix_matrix_inviter/signals.py +++ b/pretix_matrix_inviter/signals.py @@ -16,6 +16,7 @@ from pretix.base.templatetags.rich_text import rich_text_snippet from pretix.control.signals import nav_event_settings from pretix.presale.signals import question_form_fields +from .helpers import matrix_parse_room_ids from .tasks import matrix_inviter_invite, matrix_inviter_kick settings_hierarkey.add_default("matrix_inviter_items", [], list) @@ -83,14 +84,18 @@ def matrix_inviter_invite_async(sender, order, **kwargs): ): continue - matrix_inviter_invite.apply_async( - args=( - sender.pk, - order.pk, - order_position.pk, - str(sender.settings.matrix_inviter_reason), + for room_id in matrix_parse_room_ids( + sender.settings.matrix_inviter_matrix_room + ): + matrix_inviter_invite.apply_async( + args=( + sender.pk, + order.pk, + order_position.pk, + str(sender.settings.matrix_inviter_reason), + room_id, + ) ) - ) @receiver(order_canceled, dispatch_uid="matrix_inviter_order_canceled") @@ -114,13 +119,12 @@ def matrix_inviter_kick_async(sender, order, **kwargs): ): continue - matrix_inviter_kick.apply_async( - args=( - sender.pk, - order.pk, - order_position.pk, + for room_id in matrix_parse_room_ids( + sender.settings.matrix_inviter_matrix_room + ): + matrix_inviter_kick.apply_async( + args=(sender.pk, order.pk, order_position.pk, room_id) ) - ) @receiver(nav_event_settings, dispatch_uid="matrix_inviter_nav_settings") diff --git a/pretix_matrix_inviter/tasks.py b/pretix_matrix_inviter/tasks.py index 14e9d9c..0c62c9d 100644 --- a/pretix_matrix_inviter/tasks.py +++ b/pretix_matrix_inviter/tasks.py @@ -19,7 +19,12 @@ logger = logging.getLogger(__name__) retry_backoff_max=3600, ) def matrix_inviter_invite( - self, event: int, order: int, order_position: int, invitation_reason: str + self, + event: int, + order: int, + order_position: int, + invitation_reason: str, + room_id: str, ): order_position = OrderPosition.objects.get(pk=order_position) @@ -30,10 +35,13 @@ def matrix_inviter_invite( if not user_matrix_id: return + if not room_id: + return + order = Order.objects.get(pk=order) server = event.settings.matrix_inviter_matrix_server token = event.settings.matrix_inviter_authorization_token - room_id = matrix_room_id(server, event.settings.matrix_inviter_matrix_room) + room_id = matrix_room_id(server, room_id) payload = {"user_id": user_matrix_id} if invitation_reason: payload["reason"] = invitation_reason @@ -96,7 +104,9 @@ def matrix_inviter_invite( retry_backoff=True, retry_backoff_max=3600, ) -def matrix_inviter_kick(self, event: int, order: int, order_position: int): +def matrix_inviter_kick( + self, event: int, order: int, order_position: int, room_id: str +): order_position = OrderPosition.objects.get(pk=order_position) user_matrix_id = order_position.meta_info_data.get("question_form_data", {}).get( @@ -106,10 +116,13 @@ def matrix_inviter_kick(self, event: int, order: int, order_position: int): if not user_matrix_id: return + if not room_id: + return + order = Order.objects.get(pk=order) server = event.settings.matrix_inviter_matrix_server token = event.settings.matrix_inviter_authorization_token - room_id = matrix_room_id(server, event.settings.matrix_inviter_matrix_room) + room_id = matrix_room_id(server, room_id) payload = {"user_id": user_matrix_id} try: -- GitLab