Skip to content
1 change: 1 addition & 0 deletions bot.toml.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ log_level = "INFO"
id = <the id of the server here>
news_channel_id = <the id of the news channel here>
news_role_id = <the id of the news channel here>
auto_role_channel_id = <the id of the auto role channel here>

[sith_api]
api_key = "<your sith api token here>"
Expand Down
21 changes: 20 additions & 1 deletion src/commands/club.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class ClubCog(commands.GroupCog, group_name="club"):
def __init__(self, bot: AeBot):
self.club_service = ClubService(bot)
self.settings = Settings()
self.bot = bot

async def autocomplete_club(
self, _interaction: Interaction, current: str
Expand All @@ -52,6 +53,7 @@ async def autocomplete_existing_club(
async def club_infos(
self, interaction: Interaction, club: Transform[ClubSchema, ClubTransformer]
):
"""Permet d'envoie les informations d'un club"""
await interaction.response.defer(thinking=True)
await interaction.followup.send(embed=self.club_service.embed(club))

Expand All @@ -63,6 +65,10 @@ async def remove_club_member(
club: Transform[ClubSchema, ClubTransformer],
member: Member,
):
"""
Permet d'enlever, sur discord, un membre d'un club
et de l'ajouter en tant qu'ancien
"""
await interaction.response.defer(thinking=True)
db_club = Club.get_or_none(Club.sith_id == club.id)
if not db_club:
Expand Down Expand Up @@ -93,6 +99,7 @@ async def add_club_member(
club: Transform[ClubSchema, ClubTransformer],
member: Member,
):
"""Permet d'ajouter un membre à un club existant sur le serveur discord"""
await interaction.response.defer(thinking=True)
db_club = Club.get_or_none(Club.sith_id == club.id)
role_membre = member.guild.get_role(db_club.member_role_id)
Expand Down Expand Up @@ -121,11 +128,21 @@ async def add_club_member(
async def create_club(
self, interaction: Interaction, club: Transform[ClubSchema, ClubTransformer]
):
"""Permet de créer un club déjà disponible sur le sith"""
await interaction.response.defer(thinking=True)
if Club.filter(Club.sith_id == club.id).exists():
await interaction.followup.send(f"Le club : {club.name} existe déjà...")
else:
await self.club_service.create_club(club, interaction.guild)
guild = interaction.guild
id_channel_autorole = utils.get(
guild.channels, id=self.bot.settings.guild.auto_role_channel_id
)
mess = await id_channel_autorole.send(
f"Réagi à ce message pour rejoindre le club {club.name}"
)

await mess.add_reaction("✅")
await self.club_service.create_club(club, guild, mess)
await interaction.followup.send(f"Le club : {club.name} à été créé")

@app_commands.command(name="passation")
Expand All @@ -138,6 +155,7 @@ async def handover(
new_president: Member,
new_treasurer: Member,
):
"""Permet de faire la passation d'un club lors de la reprise"""
await interaction.response.defer(thinking=True)
db_club = Club.get_or_none(Club.sith_id == club.id)
guild = interaction.guild
Expand Down Expand Up @@ -172,6 +190,7 @@ async def handover(
async def stop_club(
self, interaction: Interaction, club: Transform[ClubSchema, ClubTransformer]
):
"""Permet de mettre un club en inactif"""
await interaction.response.defer(thinking=True)
db_club = Club.get_or_none(Club.sith_id == club.id)
await self.club_service.stop_club(db_club, interaction.guild)
Expand Down
51 changes: 51 additions & 0 deletions src/commands/role.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

from src.client import ClubSchema # noqa TC001
from src.db.models import Club
from src.services.club import ClubService
from src.settings import Settings

if TYPE_CHECKING:
from discord import RawReactionActionEvent

from src.main import AeBot


class RoleCog(commands.GroupCog, group_name="role"):
def __init__(self, bot: AeBot):
self.settings = Settings()
self.club_service = ClubService(bot)
self.bot = bot

@commands.Cog.listener()
async def on_raw_reaction_add(self, payload: RawReactionActionEvent):
member = self.bot.watched_guild.get_member(payload.user_id)
if payload.guild_id is None or member == self.bot.user:
return

db_club = Club.get_or_none(Club.message_autorole_id == payload.message_id)
if not db_club:
return

channel = self.bot.get_channel(payload.channel_id)
message = await channel.fetch_message(payload.message_id)
if str(payload.emoji) != "✅":
await message.remove_reaction(payload.emoji, member)

await self.club_service.add_member(db_club, member)

@commands.Cog.listener()
async def on_raw_reaction_remove(self, payload: RawReactionActionEvent):
member = self.bot.watched_guild.get_member(payload.user_id)
if payload.guild_id is None or member == self.bot.user:
return

db_club = Club.get_or_none(Club.message_autorole_id == payload.message_id)
if not db_club or str(payload.emoji) != "✅":
return

await self.club_service.remove_member(db_club, member, make_former=False)
1 change: 1 addition & 0 deletions src/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class Club(DbBaseModel):
treasurer_role_id = peewee.IntegerField(unique=True)
member_role_id = peewee.IntegerField(unique=True)
former_member_role_id = peewee.IntegerField(unique=True)
message_autorole_id = peewee.IntegerField(unique=True)


def init():
Expand Down
5 changes: 4 additions & 1 deletion src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from logging import handlers
from typing import TYPE_CHECKING

from discord import Guild, Intents, Interaction
from discord import Game, Guild, Intents, Interaction
from discord.ext import commands
from discord.utils import setup_logging

Expand All @@ -15,6 +15,7 @@
from src.commands.club import ClubCog
from src.commands.misc import MiscCog
from src.commands.news import NewsCog
from src.commands.role import RoleCog
from src.settings import BASE_DIR, Settings

if TYPE_CHECKING:
Expand All @@ -38,10 +39,12 @@ async def setup_hook(self):
await self.add_cog(NewsCog(self))
await self.add_cog(AdminCog(self))
await self.add_cog(MiscCog())
await self.add_cog(RoleCog(self))

async def on_ready(self):
await self.wait_until_ready()
self.watched_guild = self.get_guild(self.settings.guild.id)
await self.change_presence(activity=Game(name="/help"))
self.logger.info(f"Bot ready to act on {self.watched_guild.name}")

async def on_command(self, ctx: Context):
Expand Down
14 changes: 10 additions & 4 deletions src/services/club.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from src.settings import Settings

if TYPE_CHECKING:
from discord import Guild, Member
from discord import Guild, Member, Message

from src.client import ClubSchema, SimpleClubSchema
from src.main import AeBot
Expand Down Expand Up @@ -77,7 +77,7 @@ def embed(self, club: ClubSchema) -> Embed:
)
return embed

async def create_club(self, club: ClubSchema, guild: Guild):
async def create_club(self, club: ClubSchema, guild: Guild, mess: Message):
if Club.filter(Club.sith_id == club.id).exists():
raise ClubExists
# create the role for member, presidence and treasurer
Expand Down Expand Up @@ -119,6 +119,7 @@ async def create_club(self, club: ClubSchema, guild: Guild):
treasurer_role_id=treasurer.id,
member_role_id=member.id,
former_member_role_id=former_member.id,
message_autorole_id=mess.id,
)

async def add_member(self, club: Club, member: Member):
Expand All @@ -130,11 +131,16 @@ async def add_member(self, club: Club, member: Member):
)
await member.add_roles(role, reason=f"{member.name} joined club {club.name}")

async def remove_member(self, club: Club, member: Member):
async def remove_member(
self, club: Club, member: Member, *, make_former: bool = True
):
role = utils.get(member.guild.roles, id=club.member_role_id)
former = utils.get(member.guild.roles, id=club.former_member_role_id)
await member.remove_roles(role, reason=f"{member.name} left club {club.name}")
await member.add_roles(former, reason=f"{member.name} left club {club.name}")
if make_former:
await member.add_roles(
former, reason=f"{member.name} left club {club.name}"
)

async def handover(
self, club: ClubSchema, new_pres: Member, new_treso: Member, guild: Guild
Expand Down
1 change: 1 addition & 0 deletions src/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class GuildConfig(BaseModel):
id: int
news_channel_id: int | None = None
news_role_id: int | None = None
auto_role_channel_id: int | None = None


class BotConfig(BaseModel):
Expand Down