diff --git a/CHANGELOG.md b/CHANGELOG.md index 281aec8fd0f5e412575be96e32ac24db81c6ccab..89b31ac472280822f79e20c299b0fa1e966820f0 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 a667734179622a118a9781f7072149e0264862e5..79daae09ea7903540fc64fb7fd7f2b8f274f38bb 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 c3dfed256731b3510be1158073b683d0a1c04aed..49bd1ff9cca761e4b86ca837f69c50a58db09065 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 1c46966cef06187b5b70385d89dd593b52486504..a91bd8f0d4e90a2ecced49478b120b08ac3d3825 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 14e9d9c8eaae545ae1045c585c2fd669dd1a0383..0c62c9d5a4969f34c70a865fea5afd392e5a2822 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: