11from __future__ import annotations
22
33import json
4- from typing import TYPE_CHECKING , Annotated , Self
4+ from typing import TYPE_CHECKING , Self
55from urllib .parse import urljoin
66
77from discord import Embed , PermissionOverwrite , utils
8- from pydantic import BaseModel , PlainSerializer
8+ from pydantic import BaseModel
99
1010from src .settings import BASE_DIR , Settings
1111
@@ -31,7 +31,7 @@ class DiscordClub(BaseModel):
3131 treasurer_sith_id : int | None = None
3232 member_role_id : int
3333 member_sith_id : int | None = None
34- members : Annotated [ set [ int ], PlainSerializer ( list )]
34+ former_member_role_id : int
3535
3636 @classmethod
3737 def load_all (cls ) -> dict [str , dict ]:
@@ -99,18 +99,23 @@ def embed(self, club: ClubSchema) -> Embed:
9999
100100 async def create_club (self , club : ClubSchema , guild : Guild ):
101101 # create the role for member, presidence and treasurer
102- president = await guild .create_role (name = f"Président { club .name } " )
102+ president = await guild .create_role (name = f"Responsable { club .name } " )
103103 treasurer = await guild .create_role (name = f"Trésorier { club .name } " )
104104 member = await guild .create_role (name = f"Membre { club .name } " , mentionable = True )
105+ former_member = await guild .create_role (
106+ name = f"Ancien membre { club .name } " , mentionable = True
107+ )
105108
106109 # create the clubs category
107110 overwrites = {
108111 guild .default_role : PermissionOverwrite (read_messages = False ),
109112 president : PermissionOverwrite (read_messages = True , manage_channels = True ),
110113 member : PermissionOverwrite (read_messages = True ),
111114 treasurer : PermissionOverwrite (read_messages = True ),
115+ former_member : PermissionOverwrite (read_messages = True ),
112116 }
113117 news_overwrite = {
118+ former_member : PermissionOverwrite (send_messages = False ),
114119 member : PermissionOverwrite (send_messages = False ),
115120 treasurer : PermissionOverwrite (send_messages = False ),
116121 president : PermissionOverwrite (send_messages = True ),
@@ -128,21 +133,26 @@ async def create_club(self, club: ClubSchema, guild: Guild):
128133 president_role_id = president .id ,
129134 treasurer_role_id = treasurer .id ,
130135 member_role_id = member .id ,
136+ former_member_role_id = former_member .id ,
131137 category_id = category .id ,
132- members = set (),
133138 )
134139 new_club .save ()
135140
136141 async def add_member (self , club : DiscordClub , member : Member ):
137142 role = utils .get (member .guild .roles , id = club .member_role_id )
143+ former = utils .get (member .guild .roles , id = club .former_member_role_id )
144+ if former in member .roles :
145+ await member .remove_roles (
146+ former , reason = f"{ member .name } joined club { club .name } "
147+ )
138148 await member .add_roles (role , reason = f"{ member .name } joined club { club .name } " )
139- club .members .add (member .id )
140149 club .save ()
141150
142151 async def remove_member (self , club : DiscordClub , member : Member ):
143152 role = utils .get (member .guild .roles , id = club .member_role_id )
153+ former = utils .get (member .guild .roles , id = club .former_member_role_id )
144154 await member .remove_roles (role , reason = f"{ member .name } leaved club { club .name } " )
145- club . members . remove ( member .id )
155+ await member . add_roles ( former , reason = f" { member .name } leaved club { club . name } " )
146156 club .save ()
147157
148158 async def handover (
@@ -153,13 +163,19 @@ async def handover(
153163 # removing former presidence and treasurer
154164 role_pres = utils .get (guild .roles , id = club .president_role_id )
155165 role_treso = utils .get (guild .roles , id = club .treasurer_role_id )
156- l_pres = role_pres .members
157- l_treso = role_treso .members
158- for e in l_treso :
159- await e .remove_roles (role_treso , reason = f"Passation du club : { club .name } " )
160- for e in l_pres :
161- await e .remove_roles (role_pres , reason = f"Passation du club : { club .name } " )
166+ former = utils .get (guild .roles , id = club .former_member_role_id )
167+ old_board = {* role_pres .members , * role_treso .members }
168+ for member in old_board :
169+ await member .remove_roles (
170+ role_pres , role_treso , reason = f"Passation du club : { club .name } "
171+ )
172+ await member .add_roles (former , reason = f"Passation du club : { club .name } " )
162173
163174 # add new presidence and treasurer
175+ for new_member in [new_pres , new_treso ]:
176+ if former in new_member .roles :
177+ await new_member .remove_roles (
178+ former , reason = f"{ new_pres .name } joined club { club .name } "
179+ )
164180 await new_pres .add_roles (role_pres , reason = f"Passation du club : { club .name } " )
165181 await new_treso .add_roles (role_treso , reason = f"Passation du club : { club .name } " )
0 commit comments