Skip to content
Snippets Groups Projects
Commit 69cfe86e authored by Felix Schäfer's avatar Felix Schäfer :construction_worker:
Browse files

Allow inviting to multiple rooms #13

parent b8910c89
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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
......@@ -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,
)
......
......@@ -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")
......
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment