# Copyright (C) 2020 by Animath # SPDX-License-Identifier: GPL-3.0-or-later import os from asgiref.sync import async_to_sync from django.core.management import BaseCommand from participation.models import Team, Tournament from registration.models import AdminRegistration, Registration, VolunteerRegistration from tfjm.matrix import Matrix, RoomPreset, RoomVisibility class Command(BaseCommand): def handle(self, *args, **options): # noqa: C901 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"): 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("#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( visibility=RoomVisibility.public, 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"#general-{slug}:tfjm.org"): Matrix.create_room( visibility=RoomVisibility.public, alias=f"general-{slug}", name=f"{name} - Général", topic=f"Accueil du tournoi de {name}", federate=False, preset=RoomPreset.private_chat, ) if not async_to_sync(Matrix.resolve_room_alias)(f"#flood-{slug}:tfjm.org"): 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 async_to_sync(Matrix.resolve_room_alias)(f"#jury-{slug}:tfjm.org"): 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 async_to_sync(Matrix.resolve_room_alias)(f"#orga-{slug}:tfjm.org"): 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, ) # 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) # Invite admins and give permissions 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") 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) # 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") 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) # 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") # 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( 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 async_to_sync(Matrix.resolve_room_alias)(f"#poule-{slug}-{pool.id}-jurys:tfjm.org"): 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, ) 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) # 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) # 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") if not orga.is_admin: Matrix.set_room_power_level(f"#poule-{slug}-{pool.id}: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") 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(): 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)