@@ -102,19 +102,46 @@ def run_bot(self):
102102 super ().run (os .getenv ('DISCORD_TOKEN' ))
103103
104104
105- def cache_roles (self ):
105+ # def cache_roles(self):
106+ # # Noting: "guild" maps to discord server, and the API is designed to run on many "Discord servers" concurrently
107+ # for guild in self.guilds:
108+ # for member in guild.members:
109+ # for role in member.roles:
110+ # user = self.redmine.user_mgr.find_discord_user(member.name)
111+ # #log.debug(f"<<< {role.name} {user.name}")
112+ # if user:
113+ # self.teams.add_user(role.name, user.name, user.id)
114+ # else:
115+ # log.warning(f"Unknown user: {member.name} for team: {role.name}")
116+
117+ # log.debug(f"Loaded teams: {self.teams}")
118+
119+ def sync_team (self , role :discord .Role , team :Team ):
120+ team_ids = set ()
121+ for member in role .members :
122+ user = self .redmine .user_mgr .find_discord_user (member .name )
123+ log .debug (f"adding { user .name } to { team .name } " )
124+ self .redmine .user_mgr .join_team (user , team .name )
125+ team_ids .add (user .id )
126+ # noting: "in_team_ids" is the set of valid redmine IDs that should be in the associated team
127+ for user in team .users :
128+ if user .id not in team_ids :
129+ # user missing from ids, must have been removed
130+ log .debug (f"removing { user .name } from { team .name } " )
131+ self .redmine .user_mgr .leave_team (user , team .name )
132+
133+
134+ def sync_roles (self ):
106135 # Noting: "guild" maps to discord server, and the API is designed to run on many "Discord servers" concurrently
107136 for guild in self .guilds :
108- for member in guild .members :
109- for role in member .roles :
110- user = self .redmine .user_mgr .find_discord_user (member .name )
111- #log.debug(f"<<< {role.name} {user.name}")
112- if user :
113- self .teams .add_user (role .name , user .name , user .id )
114- else :
115- log .warning (f"Unknown user: { member .name } for team: { role .name } " )
116-
117- log .debug (f"Loaded teams: { self .teams } " )
137+ for role in guild .roles :
138+ team = self .redmine .user_mgr .get_team_by_name (role .name )
139+ if not team :
140+ log .warning (f"No team for { role .name } . Create it, please!" ) # FIXME create the team!
141+ # create_team -> POST to /groups.json?name=teamname
142+ else :
143+ self .sync_team (role , team )
144+ # TODO: On team sync, update loacl team cache
118145
119146
120147 def get_all_teams (self , include_users : bool = True ) -> dict [str , Team ]:
@@ -123,7 +150,7 @@ def get_all_teams(self, include_users: bool = True) -> dict[str, Team]:
123150
124151 def reindex (self ):
125152 log .debug ("NetBot.reindex" )
126- self .cache_roles ()
153+ self .sync_roles ()
127154
128155
129156 async def on_ready (self ):
0 commit comments