11from __future__ import annotations
22
3- import json
4- from typing import TYPE_CHECKING , Self
3+ from typing import TYPE_CHECKING
54from urllib .parse import urljoin
65
76from 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
1211if TYPE_CHECKING :
1312 from discord import Guild , Member
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
5130class 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