diff --git a/apps/participation/management/commands/fix_matrix_channels.py b/apps/participation/management/commands/fix_matrix_channels.py index 9213e9f..f9d3bb9 100644 --- a/apps/participation/management/commands/fix_matrix_channels.py +++ b/apps/participation/management/commands/fix_matrix_channels.py @@ -1,9 +1,9 @@ # Copyright (C) 2020 by Animath # SPDX-License-Identifier: GPL-3.0-or-later +import asyncio import os -from asgiref.sync import async_to_sync from django.core.management import BaseCommand from django.utils.http import urlencode from django.utils.translation import activate @@ -15,385 +15,388 @@ from tfjm.matrix import Matrix, RoomPreset, RoomVisibility class Command(BaseCommand): def handle(self, *args, **options): # noqa: C901 activate("fr") - - Matrix.set_display_name("Bot du TFJM²") - - if not os.getenv("SYNAPSE_PASSWORD"): - avatar_uri = "plop" - else: # pragma: no cover - if not os.path.isfile(".matrix_avatar"): - avatar_uri = Matrix.get_avatar() - if isinstance(avatar_uri, str): - with open(".matrix_avatar", "w") as f: - f.write(avatar_uri) - else: - stat_file = os.stat("tfjm/static/logo.png") - with open("tfjm/static/logo.png", "rb") as f: - resp = Matrix.upload(f, filename="logo.png", content_type="image/png", - filesize=stat_file.st_size)[0][0] - avatar_uri = resp.content_uri - with open(".matrix_avatar", "w") as f: - f.write(avatar_uri) - Matrix.set_avatar(avatar_uri) - - with open(".matrix_avatar", "r") as f: - avatar_uri = f.read().rstrip(" \t\r\n") - - # Create basic channels - if not async_to_sync(Matrix.resolve_room_alias)("#aide-jurys-orgas:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="aide-jurys-orgas", - name="Aide jurys & orgas", - topic="Pour discuter de propblèmes d'organisation", - federate=False, - preset=RoomPreset.private_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#annonces:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="annonces", - name="Annonces", - topic="Informations importantes du TFJM²", - federate=False, - preset=RoomPreset.public_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#bienvenue:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="bienvenue", - name="Bienvenue", - topic="Bienvenue au TFJM² 2021 !", - federate=False, - preset=RoomPreset.public_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#bot:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="bot", - name="Bot", - topic="Vive les r0b0ts", - federate=False, - preset=RoomPreset.public_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#cno:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="cno", - name="CNO", - topic="Channel des dieux", - federate=False, - preset=RoomPreset.private_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#dev-bot:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="dev-bot", - name="Bot - développement", - topic="Vive le bot", - federate=False, - preset=RoomPreset.private_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#faq:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="faq", - name="FAQ", - topic="Posez toutes vos questions ici !", - federate=False, - preset=RoomPreset.public_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#flood:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="flood", - name="Flood", - topic="Discutez de tout et de rien !", - federate=False, - preset=RoomPreset.public_chat, - ) - - if not async_to_sync(Matrix.resolve_room_alias)("#je-cherche-une-equipe:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias="je-cherche-une-equipe", - name="Je cherche une équipe", - topic="Le Tinder du TFJM²", - federate=False, - preset=RoomPreset.public_chat, - ) - - # Setup avatars - Matrix.set_room_avatar("#aide-jurys-orgas:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#annonces:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#bienvenue:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#bot:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#cno:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#dev-bot:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#faq:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#flood:tfjm.org", avatar_uri) - Matrix.set_room_avatar("#je-cherche-une-equipe:tfjm.org", avatar_uri) - - # Read-only channels - Matrix.set_room_power_level_event("#annonces:tfjm.org", "events_default", 50) - Matrix.set_room_power_level_event("#bienvenue:tfjm.org", "events_default", 50) - - # Invite everyone to public channels - for r in Registration.objects.all(): - Matrix.invite("#annonces:tfjm.org", f"@{r.matrix_username}:tfjm.org") - Matrix.invite("#bienvenue:tfjm.org", f"@{r.matrix_username}:tfjm.org") - Matrix.invite("#bot:tfjm.org", f"@{r.matrix_username}:tfjm.org") - Matrix.invite("#faq:tfjm.org", f"@{r.matrix_username}:tfjm.org") - Matrix.invite("#flood:tfjm.org", f"@{r.matrix_username}:tfjm.org") - Matrix.invite("#je-cherche-une-equipe:tfjm.org", - f"@{r.matrix_username}:tfjm.org") - self.stdout.write(f"Invite {r} in most common channels...") - - # Volunteers have access to the help channel - for volunteer in VolunteerRegistration.objects.all(): - Matrix.invite("#aide-jurys-orgas:tfjm.org", f"@{volunteer.matrix_username}:tfjm.org") - self.stdout.write(f"Invite {volunteer} in #aide-jury-orgas...") - - # Admins are admins - for admin in AdminRegistration.objects.all(): - self.stdout.write(f"Invite {admin} in #cno and #dev-bot...") - Matrix.invite("#cno:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite("#dev-bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - - self.stdout.write(f"Give admin permissions for {admin}...") - Matrix.set_room_power_level("#aide-jurys-orgas:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#annonces:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#bienvenue:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#cno:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#dev-bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#faq:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#flood:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level("#je-cherche-une-equipe:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - - # Create tournament-specific channels - for tournament in Tournament.objects.all(): - self.stdout.write(f"Managing tournament of {tournament.name}.") - - name = tournament.name - slug = name.lower().replace(" ", "-") - - if not async_to_sync(Matrix.resolve_room_alias)(f"#annonces-{slug}:tfjm.org"): - Matrix.create_room( + + async def main(): + await Matrix.set_display_name("Bot du TFJM²") + + if not os.getenv("SYNAPSE_PASSWORD"): + avatar_uri = "plop" + else: # pragma: no cover + if not os.path.isfile(".matrix_avatar"): + avatar_uri = await Matrix.get_avatar() + if isinstance(avatar_uri, str): + with open(".matrix_avatar", "w") as f: + f.write(avatar_uri) + else: + stat_file = os.stat("tfjm/static/logo.png") + with open("tfjm/static/logo.png", "rb") as f: + resp = await Matrix.upload(f, filename="logo.png", content_type="image/png", + filesize=stat_file.st_size)[0][0] + avatar_uri = resp.content_uri + with open(".matrix_avatar", "w") as f: + f.write(avatar_uri) + await Matrix.set_avatar(avatar_uri) + + with open(".matrix_avatar", "r") as f: + avatar_uri = f.read().rstrip(" \t\r\n") + + # Create basic channels + if not await Matrix.resolve_room_alias("#aide-jurys-orgas:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"annonces-{slug}", - name=f"{name} - Annonces", - topic=f"Annonces du tournoi de {name}", + alias="aide-jurys-orgas", + name="Aide jurys & orgas", + topic="Pour discuter de propblèmes d'organisation", federate=False, preset=RoomPreset.private_chat, ) - - if not async_to_sync(Matrix.resolve_room_alias)(f"#general-{slug}:tfjm.org"): - Matrix.create_room( + + if not Matrix.resolve_room_alias("#annonces:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"general-{slug}", - name=f"{name} - Général", - topic=f"Accueil du tournoi de {name}", + alias="annonces", + name="Annonces", + topic="Informations importantes du TFJM²", + federate=False, + preset=RoomPreset.public_chat, + ) + + if not Matrix.resolve_room_alias("#bienvenue:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias="bienvenue", + name="Bienvenue", + topic="Bienvenue au TFJM² 2021 !", + federate=False, + preset=RoomPreset.public_chat, + ) + + if not Matrix.resolve_room_alias("#bot:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias="bot", + name="Bot", + topic="Vive les r0b0ts", + federate=False, + preset=RoomPreset.public_chat, + ) + + if not Matrix.resolve_room_alias("#cno:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias="cno", + name="CNO", + topic="Channel des dieux", federate=False, preset=RoomPreset.private_chat, ) - - if not async_to_sync(Matrix.resolve_room_alias)(f"#flood-{slug}:tfjm.org"): - Matrix.create_room( + + if not Matrix.resolve_room_alias("#dev-bot:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"flood-{slug}", - name=f"{name} - Flood", - topic=f"Discussion libre du tournoi de {name}", + alias="dev-bot", + name="Bot - développement", + topic="Vive le bot", federate=False, preset=RoomPreset.private_chat, ) - - if not async_to_sync(Matrix.resolve_room_alias)(f"#jury-{slug}:tfjm.org"): - Matrix.create_room( + + if not Matrix.resolve_room_alias("#faq:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"jury-{slug}", - name=f"{name} - Jury", - topic=f"Discussion entre les orgas et jurys du tournoi de {name}", + alias="faq", + name="FAQ", + topic="Posez toutes vos questions ici !", federate=False, - preset=RoomPreset.private_chat, + preset=RoomPreset.public_chat, ) - - if not async_to_sync(Matrix.resolve_room_alias)(f"#orga-{slug}:tfjm.org"): - Matrix.create_room( + + if not Matrix.resolve_room_alias("#flood:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"orga-{slug}", - name=f"{name} - Organisateurs", - topic=f"Discussion entre les orgas du tournoi de {name}", + alias="flood", + name="Flood", + topic="Discutez de tout et de rien !", federate=False, - preset=RoomPreset.private_chat, + preset=RoomPreset.public_chat, ) - - if not async_to_sync(Matrix.resolve_room_alias)(f"#tirage-au-sort-{slug}:tfjm.org"): - Matrix.create_room( + + if not Matrix.resolve_room_alias("#je-cherche-une-equipe:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"tirage-au-sort-{slug}", - name=f"{name} - Tirage au sort", - topic=f"Tirage au sort du tournoi de {name}", + alias="je-cherche-une-equipe", + name="Je cherche une équipe", + topic="Le Tinder du TFJM²", federate=False, - preset=RoomPreset.private_chat, + preset=RoomPreset.public_chat, ) - + # Setup avatars - Matrix.set_room_avatar(f"#annonces-{slug}:tfjm.org", avatar_uri) - Matrix.set_room_avatar(f"#flood-{slug}:tfjm.org", avatar_uri) - Matrix.set_room_avatar(f"#general-{slug}:tfjm.org", avatar_uri) - Matrix.set_room_avatar(f"#jury-{slug}:tfjm.org", avatar_uri) - Matrix.set_room_avatar(f"#orga-{slug}:tfjm.org", avatar_uri) - Matrix.set_room_avatar(f"#tirage-au-sort-{slug}:tfjm.org", avatar_uri) - - # Invite admins and give permissions + await Matrix.set_room_avatar("#aide-jurys-orgas:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#annonces:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#bienvenue:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#bot:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#cno:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#dev-bot:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#faq:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#flood:tfjm.org", avatar_uri) + await Matrix.set_room_avatar("#je-cherche-une-equipe:tfjm.org", avatar_uri) + + # Read-only channels + await Matrix.set_room_power_level_event("#annonces:tfjm.org", "events_default", 50) + await Matrix.set_room_power_level_event("#bienvenue:tfjm.org", "events_default", 50) + + # Invite everyone to public channels + for r in Registration.objects.all(): + await Matrix.invite("#annonces:tfjm.org", f"@{r.matrix_username}:tfjm.org") + await Matrix.invite("#bienvenue:tfjm.org", f"@{r.matrix_username}:tfjm.org") + await Matrix.invite("#bot:tfjm.org", f"@{r.matrix_username}:tfjm.org") + await Matrix.invite("#faq:tfjm.org", f"@{r.matrix_username}:tfjm.org") + await Matrix.invite("#flood:tfjm.org", f"@{r.matrix_username}:tfjm.org") + await Matrix.invite("#je-cherche-une-equipe:tfjm.org", + f"@{r.matrix_username}:tfjm.org") + self.stdout.write(f"Invite {r} in most common channels...") + + # Volunteers have access to the help channel + for volunteer in VolunteerRegistration.objects.all(): + await Matrix.invite("#aide-jurys-orgas:tfjm.org", f"@{volunteer.matrix_username}:tfjm.org") + self.stdout.write(f"Invite {volunteer} in #aide-jury-orgas...") + + # Admins are admins for admin in AdminRegistration.objects.all(): - self.stdout.write(f"Invite {admin} in all channels of the tournament {name}...") - Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite(f"#general-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite(f"#jury-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite(f"#orga-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - - self.stdout.write(f"Give permissions to {admin} in all channels of the tournament {name}...") - Matrix.set_room_power_level(f"#annonces-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level(f"#flood-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level(f"#general-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level(f"#jury-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level(f"#orga-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level(f"#tirage-au-sort-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) - - # Invite organizers and give permissions - for orga in tournament.organizers.all(): - self.stdout.write(f"Invite organizer {orga} in all channels of the tournament {name}...") - Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - Matrix.invite(f"#general-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - Matrix.invite(f"#jury-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - Matrix.invite(f"#orga-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - - if not orga.is_admin: - Matrix.set_room_power_level(f"#annonces-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#flood-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#general-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#jury-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#orga-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#tirage-au-sort-{slug}:tfjm.org", - f"@{orga.matrix_username}:tfjm.org", 50) - - # Invite participants - for participation in tournament.participations.filter(valid=True).all(): - for participant in participation.team.participants.all(): - self.stdout.write(f"Invite {participant} in public channels of the tournament {name}...") - Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") - Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") - Matrix.invite(f"#general-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") - Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") - - # Create pool-specific channels - for pool in tournament.pools.all(): - self.stdout.write(f"Managing {pool}...") - if not async_to_sync(Matrix.resolve_room_alias)(f"#poule-{slug}-{pool.id}:tfjm.org"): - Matrix.create_room( + self.stdout.write(f"Invite {admin} in #cno and #dev-bot...") + await Matrix.invite("#cno:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite("#dev-bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + + self.stdout.write(f"Give admin permissions for {admin}...") + await Matrix.set_room_power_level("#aide-jurys-orgas:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#annonces:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#bienvenue:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#cno:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#dev-bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#faq:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#flood:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level("#je-cherche-une-equipe:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + + # Create tournament-specific channels + for tournament in Tournament.objects.all(): + self.stdout.write(f"Managing tournament of {tournament.name}.") + + name = tournament.name + slug = name.lower().replace(" ", "-") + + if not Matrix.resolve_room_alias(f"#annonces-{slug}:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"poule-{slug}-{pool.id}", - name=f"{name} - Jour {pool.round} - Poule " - f"{', '.join(participation.team.trigram for participation in pool.participations.all())}", - topic=f"Discussion avec les équipes - {pool}", + alias=f"annonces-{slug}", + name=f"{name} - Annonces", + topic=f"Annonces du tournoi de {name}", federate=False, preset=RoomPreset.private_chat, ) - if not async_to_sync(Matrix.resolve_room_alias)(f"#poule-{slug}-{pool.id}-jurys:tfjm.org"): - Matrix.create_room( + + if not Matrix.resolve_room_alias(f"#general-{slug}:tfjm.org"): + await Matrix.create_room( visibility=RoomVisibility.public, - alias=f"poule-{slug}-{pool.id}-jurys", - name=f"{name} - Jour {pool.round} - Jurys poule " - f"{', '.join(participation.team.trigram for participation in pool.participations.all())}", - topic=f"Discussion avec les jurys - {pool}", + alias=f"general-{slug}", + name=f"{name} - Général", + topic=f"Accueil du tournoi de {name}", federate=False, preset=RoomPreset.private_chat, ) - - Matrix.set_room_avatar(f"#poule-{slug}-{pool.id}:tfjm.org", avatar_uri) - Matrix.set_room_avatar(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", avatar_uri) - - url_params = urlencode(dict(url=pool.bbb_url, - isAudioConf='false', displayName='$matrix_display_name', - avatarUrl='$matrix_avatar_url', userId='$matrix_user_id')) \ - .replace("%24", "$") - Matrix.add_integration(f"#poule-{slug}-{pool.id}:tfjm.org", - f"https://scalar.vector.im/api/widgets/bigbluebutton.html?{url_params}", - f"bbb-{slug}-{pool.id}", "bigbluebutton", "BigBlueButton", str(pool)) - Matrix.add_integration(f"#poule-{slug}-{pool.id}:tfjm.org", - f"https://board.tfjm.org/boards/{slug}-{pool.id}", f"board-{slug}-{pool.id}", - "customwidget", "Tableau", str(pool)) - + + if not Matrix.resolve_room_alias(f"#flood-{slug}:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"flood-{slug}", + name=f"{name} - Flood", + topic=f"Discussion libre du tournoi de {name}", + federate=False, + preset=RoomPreset.private_chat, + ) + + if not Matrix.resolve_room_alias(f"#jury-{slug}:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"jury-{slug}", + name=f"{name} - Jury", + topic=f"Discussion entre les orgas et jurys du tournoi de {name}", + federate=False, + preset=RoomPreset.private_chat, + ) + + if not Matrix.resolve_room_alias(f"#orga-{slug}:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"orga-{slug}", + name=f"{name} - Organisateurs", + topic=f"Discussion entre les orgas du tournoi de {name}", + federate=False, + preset=RoomPreset.private_chat, + ) + + if not Matrix.resolve_room_alias(f"#tirage-au-sort-{slug}:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"tirage-au-sort-{slug}", + name=f"{name} - Tirage au sort", + topic=f"Tirage au sort du tournoi de {name}", + federate=False, + preset=RoomPreset.private_chat, + ) + + # Setup avatars + await Matrix.set_room_avatar(f"#annonces-{slug}:tfjm.org", avatar_uri) + await Matrix.set_room_avatar(f"#flood-{slug}:tfjm.org", avatar_uri) + await Matrix.set_room_avatar(f"#general-{slug}:tfjm.org", avatar_uri) + await Matrix.set_room_avatar(f"#jury-{slug}:tfjm.org", avatar_uri) + await Matrix.set_room_avatar(f"#orga-{slug}:tfjm.org", avatar_uri) + await Matrix.set_room_avatar(f"#tirage-au-sort-{slug}:tfjm.org", avatar_uri) + # Invite admins and give permissions for admin in AdminRegistration.objects.all(): - Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - Matrix.invite(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", f"@{admin.matrix_username}:tfjm.org") - - Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}:tfjm.org", - f"@{admin.matrix_username}:tfjm.org", 95) - Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", - f"@{admin.matrix_username}:tfjm.org", 95) - + self.stdout.write(f"Invite {admin} in all channels of the tournament {name}...") + await Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite(f"#general-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite(f"#jury-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite(f"#orga-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + + self.stdout.write(f"Give permissions to {admin} in all channels of the tournament {name}...") + await Matrix.set_room_power_level(f"#annonces-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level(f"#flood-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level(f"#general-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level(f"#jury-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level(f"#orga-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level(f"#tirage-au-sort-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org", 95) + # Invite organizers and give permissions - for orga in VolunteerRegistration.objects.all(): - Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - Matrix.invite(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", f"@{orga.matrix_username}:tfjm.org") - + for orga in tournament.organizers.all(): + self.stdout.write(f"Invite organizer {orga} in all channels of the tournament {name}...") + await Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + await Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + await Matrix.invite(f"#general-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + await Matrix.invite(f"#jury-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + await Matrix.invite(f"#orga-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + await Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + if not orga.is_admin: - Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}:tfjm.org", + await Matrix.set_room_power_level(f"#annonces-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#flood-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#general-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#jury-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#orga-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#tirage-au-sort-{slug}:tfjm.org", f"@{orga.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", - f"@{orga.matrix_username}:tfjm.org", 50) - - # Invite the jury, give good permissions - for jury in pool.juries.all(): - Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#general-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#jury-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#orga-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") - - if not jury.is_admin: - Matrix.set_room_power_level(f"#jury-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}:tfjm.org", - f"@{jury.matrix_username}:tfjm.org", 50) - Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", - f"@{jury.matrix_username}:tfjm.org", 50) - - # Invite participants to the right pool - for participation in pool.participations.all(): + + # Invite participants + for participation in tournament.participations.filter(valid=True).all(): for participant in participation.team.participants.all(): - Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") - - # Create private channels for teams - for team in Team.objects.all(): - self.stdout.write(f"Create private channel for {team}...") - if not async_to_sync(Matrix.resolve_room_alias)(f"#equipe-{team.trigram.lower()}:tfjm.org"): - Matrix.create_room( - visibility=RoomVisibility.public, - alias=f"equipe-{team.trigram.lower()}", - name=f"Équipe {team.trigram}", - topic=f"Discussion interne de l'équipe {team.name}", - federate=False, - preset=RoomPreset.private_chat, - ) - for participant in team.participants.all(): - Matrix.invite(f"#equipe-{team.trigram.lower}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") - Matrix.set_room_power_level(f"#equipe-{team.trigram.lower()}:tfjm.org", - f"@{participant.matrix_username}:tfjm.org", 50) + self.stdout.write(f"Invite {participant} in public channels of the tournament {name}...") + await Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") + await Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") + await Matrix.invite(f"#general-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") + await Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") + + # Create pool-specific channels + for pool in tournament.pools.all(): + self.stdout.write(f"Managing {pool}...") + if not Matrix.resolve_room_alias(f"#poule-{slug}-{pool.id}:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"poule-{slug}-{pool.id}", + name=f"{name} - Jour {pool.round} - Poule " + f"{', '.join(participation.team.trigram for participation in pool.participations.all())}", + topic=f"Discussion avec les équipes - {pool}", + federate=False, + preset=RoomPreset.private_chat, + ) + if not Matrix.resolve_room_alias(f"#poule-{slug}-{pool.id}-jurys:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"poule-{slug}-{pool.id}-jurys", + name=f"{name} - Jour {pool.round} - Jurys poule " + f"{', '.join(participation.team.trigram for participation in pool.participations.all())}", + topic=f"Discussion avec les jurys - {pool}", + federate=False, + preset=RoomPreset.private_chat, + ) + + await Matrix.set_room_avatar(f"#poule-{slug}-{pool.id}:tfjm.org", avatar_uri) + await Matrix.set_room_avatar(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", avatar_uri) + + url_params = urlencode(dict(url=pool.bbb_url, + isAudioConf='false', displayName='$matrix_display_name', + avatarUrl='$matrix_avatar_url', userId='$matrix_user_id')) \ + .replace("%24", "$") + await Matrix.add_integration(f"#poule-{slug}-{pool.id}:tfjm.org", + f"https://scalar.vector.im/api/widgets/bigbluebutton.html?{url_params}", + f"bbb-{slug}-{pool.id}", "bigbluebutton", "BigBlueButton", str(pool)) + await Matrix.add_integration(f"#poule-{slug}-{pool.id}:tfjm.org", + f"https://board.tfjm.org/boards/{slug}-{pool.id}", f"board-{slug}-{pool.id}", + "customwidget", "Tableau", str(pool)) + + # Invite admins and give permissions + for admin in AdminRegistration.objects.all(): + await Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + await Matrix.invite(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", f"@{admin.matrix_username}:tfjm.org") + + await Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}:tfjm.org", + f"@{admin.matrix_username}:tfjm.org", 95) + await Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", + f"@{admin.matrix_username}:tfjm.org", 95) + + # Invite organizers and give permissions + for orga in VolunteerRegistration.objects.all(): + await Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + await Matrix.invite(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", f"@{orga.matrix_username}:tfjm.org") + + if not orga.is_admin: + await Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}:tfjm.org", + f"@{orga.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", + f"@{orga.matrix_username}:tfjm.org", 50) + + # Invite the jury, give good permissions + for jury in pool.juries.all(): + await Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#general-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#jury-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#orga-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + await Matrix.invite(f"#tirage-au-sort-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org") + + if not jury.is_admin: + await Matrix.set_room_power_level(f"#jury-{slug}:tfjm.org", f"@{jury.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}:tfjm.org", + f"@{jury.matrix_username}:tfjm.org", 50) + await Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}-jurys:tfjm.org", + f"@{jury.matrix_username}:tfjm.org", 50) + + # Invite participants to the right pool + for participation in pool.participations.all(): + for participant in participation.team.participants.all(): + await Matrix.invite(f"#poule-{slug}-{pool.id}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") + + # Create private channels for teams + for team in Team.objects.all(): + self.stdout.write(f"Create private channel for {team}...") + if not Matrix.resolve_room_alias(f"#equipe-{team.trigram.lower()}:tfjm.org"): + await Matrix.create_room( + visibility=RoomVisibility.public, + alias=f"equipe-{team.trigram.lower()}", + name=f"Équipe {team.trigram}", + topic=f"Discussion interne de l'équipe {team.name}", + federate=False, + preset=RoomPreset.private_chat, + ) + for participant in team.participants.all(): + await Matrix.invite(f"#equipe-{team.trigram.lower}:tfjm.org", f"@{participant.matrix_username}:tfjm.org") + await Matrix.set_room_power_level(f"#equipe-{team.trigram.lower()}:tfjm.org", + f"@{participant.matrix_username}:tfjm.org", 50) + + asyncio.get_event_loop().run_until_complete(main()) diff --git a/tfjm/matrix.py b/tfjm/matrix.py index 3d7e48d..48f4d0c 100644 --- a/tfjm/matrix.py +++ b/tfjm/matrix.py @@ -4,8 +4,6 @@ from enum import Enum import os -from asgiref.sync import async_to_sync - class Matrix: """ @@ -51,7 +49,6 @@ class Matrix: return client @classmethod - @async_to_sync async def set_display_name(cls, name: str): """ Set the display name of the bot account. @@ -60,7 +57,6 @@ class Matrix: return await client.set_displayname(name) @classmethod - @async_to_sync async def set_avatar(cls, avatar_url: str): # pragma: no cover """ Set the display avatar of the bot account. @@ -69,7 +65,6 @@ class Matrix: return await client.set_avatar(avatar_url) @classmethod - @async_to_sync async def get_avatar(cls): # pragma: no cover """ Set the display avatar of the bot account. @@ -79,7 +74,6 @@ class Matrix: return resp.avatar_url if hasattr(resp, "avatar_url") else resp @classmethod - @async_to_sync async def upload( cls, data_provider, @@ -146,7 +140,6 @@ class Matrix: if not isinstance(client, FakeMatrixClient) else None, None @classmethod - @async_to_sync async def create_room( cls, visibility=None, @@ -232,7 +225,6 @@ class Matrix: return resp.room_id if resp and hasattr(resp, "room_id") else None @classmethod - @async_to_sync async def invite(cls, room_id: str, user_id: str): """ Invite a user to a room. @@ -251,7 +243,6 @@ class Matrix: return await client.room_invite(room_id, user_id) @classmethod - @async_to_sync async def send_message(cls, room_id: str, body: str, formatted_body: str = None, msgtype: str = "m.text", html: bool = True): """ @@ -274,7 +265,6 @@ class Matrix: ) @classmethod - @async_to_sync async def add_integration(cls, room_id: str, widget_url: str, state_key: str, widget_type: str = "customwidget", widget_name: str = "Custom widget", widget_title: str = ""): @@ -301,7 +291,6 @@ class Matrix: ) @classmethod - @async_to_sync async def remove_integration(cls, room_id: str, state_key: str): client = await cls._get_client() if room_id.startswith("#"): @@ -314,7 +303,6 @@ class Matrix: ) @classmethod - @async_to_sync async def kick(cls, room_id: str, user_id: str, reason: str = None): """ Kick a user from a room, or withdraw their invitation. @@ -337,7 +325,6 @@ class Matrix: return await client.room_kick(room_id, user_id, reason) @classmethod - @async_to_sync async def set_room_power_level(cls, room_id: str, user_id: str, power_level: int): # pragma: no cover """ Put a given power level to a user in a certain room. @@ -364,7 +351,6 @@ class Matrix: return await client.room_put_state(room_id, "m.room.power_levels", content=content, state_key=resp.state_key) @classmethod - @async_to_sync async def set_room_power_level_event(cls, room_id: str, event: str, power_level: int): # pragma: no cover """ Define the minimal power level to have to send a certain event type @@ -395,7 +381,6 @@ class Matrix: return await client.room_put_state(room_id, "m.room.power_levels", content=content, state_key=resp.state_key) @classmethod - @async_to_sync async def set_room_avatar(cls, room_id: str, avatar_uri: str): """ Define the avatar of a room.