Skip to content

Commit b5acd3c

Browse files
committed
migrate from json to database for storage
1 parent dda2149 commit b5acd3c

2 files changed

Lines changed: 40 additions & 59 deletions

File tree

src/commands/club.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
from discord.ext import commands
88
from discord.ext.commands import BadArgument
99

10+
from db.models import Club
1011
from src.client import ClubSchema # noqa TC001
11-
from src.services.club import ClubService, DiscordClub
12+
from src.services.club import ClubExists, ClubService
1213
from src.settings import Settings
1314

1415
if TYPE_CHECKING:
@@ -63,14 +64,14 @@ async def remove_club_member(
6364
member: Member,
6465
):
6566
await interaction.response.defer(thinking=True)
66-
discord_club = DiscordClub.load(club.id)
67-
role_membre = utils.get(member.guild.roles, id=discord_club.member_role_id)
68-
if not discord_club:
67+
db_club = Club.get_or_none(Club.sith_id == club.id)
68+
if not db_club:
6969
await interaction.followup.send(f"Le club : {club.name} n'existe pas")
7070
return
71+
role_membre = utils.get(member.guild.roles, id=db_club.member_role_id)
7172
if (
7273
not interaction.user.guild_permissions.manage_roles
73-
and not interaction.user.get_role(discord_club.president_role_id)
74+
and not interaction.user.get_role(db_club.president_role_id)
7475
):
7576
await interaction.followup.send(
7677
"Seul le président du club et les admins peuvent retirer un membre"
@@ -79,7 +80,7 @@ async def remove_club_member(
7980
if role_membre not in member.roles:
8081
await interaction.followup.send("Cet utilisateur n'est pas dans le club")
8182
return
82-
await self.club_service.remove_member(discord_club, member)
83+
await self.club_service.remove_member(db_club, member)
8384
await interaction.followup.send(
8485
f"{member.name} a été retiré du club :thumbs_up:"
8586
)
@@ -93,14 +94,14 @@ async def add_club_member(
9394
member: Member,
9495
):
9596
await interaction.response.defer(thinking=True)
96-
discord_club = DiscordClub.load(club.id)
97-
role_membre = utils.get(member.guild.roles, id=discord_club.member_role_id)
98-
if not discord_club:
97+
db_club = Club.get_or_none(Club.sith_id == club.id)
98+
role_membre = member.guild.get_role(db_club.member_role_id)
99+
if not db_club:
99100
await interaction.followup.send(f"Le club : {club.name} n'existe pas")
100101
return
101102
if (
102103
not interaction.user.guild_permissions.manage_roles
103-
and not interaction.user.get_role(discord_club.president_role_id)
104+
and not interaction.user.get_role(db_club.president_role_id)
104105
):
105106
await interaction.followup.send(
106107
"Seul le président du club et les admins peuvent ajouter un membre"
@@ -109,7 +110,7 @@ async def add_club_member(
109110
if role_membre in member.roles:
110111
await interaction.followup.send("Cet utilisateur est déjà dans le club")
111112
return
112-
await self.club_service.add_member(discord_club, member)
113+
await self.club_service.add_member(db_club, member)
113114
await interaction.followup.send(
114115
f"{member.name} a été ajouté au club :thumbs_up:"
115116
)
@@ -121,8 +122,10 @@ async def create_club(
121122
self, interaction: Interaction, club: Transform[ClubSchema, ClubTransformer]
122123
):
123124
await interaction.response.defer(thinking=True)
124-
discord_club = DiscordClub.load(club.id)
125-
if discord_club is not None:
125+
try:
126+
await self.club_service.create_club(club, interaction.guild)
127+
await interaction.followup.send(f"Le club : {club.name} à été créé")
128+
except ClubExists:
126129
await interaction.followup.send(f"Le club : {club.name} existe déjà...")
127130
else:
128131
await self.club_service.create_club(club, interaction.guild)
@@ -139,16 +142,16 @@ async def handover(
139142
new_treasurer: Member,
140143
):
141144
await interaction.response.defer(thinking=True)
142-
discord_club = DiscordClub.load(club.id)
145+
db_club = Club.get_or_none(Club.sith_id == club.id)
143146
guild = interaction.guild
144147

145-
if not discord_club:
148+
if not db_club:
146149
await interaction.followup.send(f"Le club : {club.name} n'existe pas")
147150
return
148151

149152
await self.club_service.handover(club, new_president, new_treasurer, guild)
150153
annonce = await self.club_service.get_channel(
151-
guild, discord_club.category_id, f"annonces {club.name}".lower()
154+
guild, db_club.category_id, f"annonces {club.name}".lower()
152155
)
153156

154157
if annonce:
@@ -157,12 +160,11 @@ async def handover(
157160
f"le nouveau président du club {club.name}"
158161
f" et {new_treasurer.mention} le nouveau trésorier !!"
159162
)
160-
161163
else:
162164
await interaction.followup.send(
163-
"Attention, ce club n'a ses salons de discussion.\n"
165+
"Attention, ce club n'a pas ses salons de discussion.\n"
164166
"La passation va quand même se faire, mais il faut "
165-
"contacter un des mainteneurs du bots pour remettre "
167+
"contacter un des mainteneurs du bot pour remettre "
166168
"les salons en place"
167169
)
168170
await interaction.followup.send("Passation effectuée")

src/services/club.py

Lines changed: 19 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
from __future__ import annotations
22

3-
import json
4-
from typing import TYPE_CHECKING, Self
3+
from typing import TYPE_CHECKING
54
from urllib.parse import urljoin
65

76
from discord import Embed, PermissionOverwrite, utils
8-
from pydantic import BaseModel
97

10-
from src.settings import BASE_DIR, Settings
8+
from db.models import Club
9+
from src.settings import Settings
1110

1211
if TYPE_CHECKING:
1312
from discord import Guild, Member
@@ -16,36 +15,16 @@
1615
from src.main import AeBot
1716

1817

19-
class DiscordClub(BaseModel):
20-
"""Pydantic model representing data about a club on the discord guild.
18+
class ClubError(Exception):
19+
"""Errors related to operations on clubs"""
2120

22-
It can also manage interaction with the internal data cache.
23-
"""
2421

25-
name: str
26-
sith_id: int
27-
category_id: int
28-
president_role_id: int
29-
president_sith_id: int | None = None
30-
treasurer_role_id: int
31-
treasurer_sith_id: int | None = None
32-
member_role_id: int
33-
member_sith_id: int | None = None
34-
former_member_role_id: int
22+
class ClubExists(ClubError):
23+
"""Trying to create a club that already exists"""
3524

36-
@classmethod
37-
def load_all(cls) -> dict[str, dict]:
38-
return json.loads((BASE_DIR / "data/club.json").read_text())
3925

40-
@classmethod
41-
def load(cls, club_id: int) -> Self | None:
42-
club = cls.load_all().get(str(club_id))
43-
return cls.model_validate(club) if club is not None else club
44-
45-
def save(self):
46-
all_clubs = self.load_all()
47-
all_clubs[str(self.sith_id)] = self.model_dump()
48-
(BASE_DIR / "data/club.json").write_text(json.dumps(all_clubs))
26+
class ClubDoesNotExist(ClubError):
27+
"""Trying to use a club that does not exist"""
4928

5029

5130
class ClubService:
@@ -62,7 +41,8 @@ async def search_club(
6241
) -> list[SimpleClubSchema]:
6342
clubs = await self._client.search_clubs(current)
6443
if clubs and only_existing:
65-
clubs = [c for c in clubs if str(c.id) in DiscordClub.load_all()]
44+
clubs_ids = [c[0] for c in Club.select(Club.sith_id).tuples()]
45+
clubs = [c for c in clubs if c.id in clubs_ids]
6646
return clubs if clubs is not None else []
6747

6848
async def get_club(self, club_id: int) -> ClubSchema | None:
@@ -98,6 +78,8 @@ def embed(self, club: ClubSchema) -> Embed:
9878
return embed
9979

10080
async def create_club(self, club: ClubSchema, guild: Guild):
81+
if Club.filter(Club.sith_id == club.id).exists():
82+
raise ClubExists
10183
# create the role for member, presidence and treasurer
10284
president = await guild.create_role(name=f"Responsable {club.name}")
10385
treasurer = await guild.create_role(name=f"Trésorier {club.name}")
@@ -127,38 +109,35 @@ async def create_club(self, club: ClubSchema, guild: Guild):
127109
)
128110
await category.create_text_channel(f"Général-{club.name}")
129111
await category.create_voice_channel(f"Général-{club.name}")
130-
new_club = DiscordClub(
131-
sith_id=club.id,
112+
Club.create(
132113
name=club.name,
114+
category_id=category.id,
115+
sith_id=club.id,
133116
president_role_id=president.id,
134117
treasurer_role_id=treasurer.id,
135118
member_role_id=member.id,
136119
former_member_role_id=former_member.id,
137-
category_id=category.id,
138120
)
139-
new_club.save()
140121

141-
async def add_member(self, club: DiscordClub, member: Member):
122+
async def add_member(self, club: Club, member: Member):
142123
role = utils.get(member.guild.roles, id=club.member_role_id)
143124
former = utils.get(member.guild.roles, id=club.former_member_role_id)
144125
if former in member.roles:
145126
await member.remove_roles(
146127
former, reason=f"{member.name} joined club {club.name}"
147128
)
148129
await member.add_roles(role, reason=f"{member.name} joined club {club.name}")
149-
club.save()
150130

151-
async def remove_member(self, club: DiscordClub, member: Member):
131+
async def remove_member(self, club: Club, member: Member):
152132
role = utils.get(member.guild.roles, id=club.member_role_id)
153133
former = utils.get(member.guild.roles, id=club.former_member_role_id)
154134
await member.remove_roles(role, reason=f"{member.name} leaved club {club.name}")
155135
await member.add_roles(former, reason=f"{member.name} leaved club {club.name}")
156-
club.save()
157136

158137
async def handover(
159138
self, club: ClubSchema, new_pres: Member, new_treso: Member, guild: Guild
160139
):
161-
club = DiscordClub.load(club.id)
140+
club = Club.get_or_none(Club.sith_id == club.id)
162141

163142
# removing former presidence and treasurer
164143
role_pres = utils.get(guild.roles, id=club.president_role_id)

0 commit comments

Comments
 (0)