async def give_player_role(self, guild, tournament): # TODO: better player_role = tosurnament.get_role(guild.roles, tournament.player_role_id, "Player") if not player_role: return for bracket in tournament.brackets: players_spreadsheet = bracket.players_spreadsheet if not players_spreadsheet: continue bracket_role = tosurnament.get_role(guild.roles, bracket.role_id, bracket.name) await players_spreadsheet.get_spreadsheet() if players_spreadsheet.range_team_name: team_name_cells = players_spreadsheet.spreadsheet.get_cells_with_value_in_range( players_spreadsheet.range_team_name) for team_name_cell in team_name_cells: team_info = TeamInfo.from_team_name( players_spreadsheet, team_name_cell.value) team_name = team_info.team_name.value team_role = tosurnament.get_role(guild.roles, None, team_name) if not team_role: team_role = await guild.create_role(name=team_name, mentionable=False) for i, player_cell in enumerate(team_info.players): player_name = player_cell.value if not player_name: continue discord_tag = None if len(team_info.discord ) > i and team_info.discord[i].value: discord_tag = team_info.discord[i].value user = tosurnament.UserAbstraction.get_from_osu_name( self.bot, player_name, discord_tag) member = user.get_member(guild) if not member: member = guild.get_member_named(user.name) if member: await member.add_roles(*filter( None, [player_role, bracket_role, team_role])) else: team_cells = players_spreadsheet.spreadsheet.get_cells_with_value_in_range( players_spreadsheet.range_team) for cell in team_cells: try: team_info = TeamInfo.from_player_name( players_spreadsheet, cell.value) if team_info.discord[0].value: user = guild.get_member_named( team_info.discord[0].value) else: user = guild.get_member_named( team_info.team_name.value) if user: await user.add_roles( *filter(None, [player_role, bracket_role])) except Exception: continue
async def clear_player_role(self, ctx, *, number: int = None): """Removes the player role of users not present in the challonge.""" # TODO improve to handle teams, bracket roles, team captain role # TODO and remove special code for nik's tournament and handle challonge error tournament = self.get_tournament(ctx.guild.id) player_role = tosurnament.get_role(ctx.guild.roles, tournament.player_role_id, "Player") if not player_role: return for bracket in tournament.brackets: players_spreadsheet = bracket.players_spreadsheet if not bracket.challonge or not players_spreadsheet: continue challonge_tournament = challonge.get_tournament(tournament.current_bracket.challonge) participants = [participant.name for participant in challonge_tournament.participants] team_cells = players_spreadsheet.worksheet.get_cells_with_value_in_range(players_spreadsheet.range_team) teams_info = [] for cell in team_cells: try: team_info = TeamInfo.from_player_name(players_spreadsheet, cell.value) teams_info.append(team_info) except Exception: continue players_found = [] users_role_not_removed = [] n_roles_removed = 0 for member in ctx.guild.members: member_id = str(member) if player_name := self.is_player_in_challonge(member_id, teams_info, participants): players_found.append(player_name) else: try: user = ctx.guild.get_member_named(member_id) if user and tosurnament.get_role(user.roles, player_role.id, "Player"): await user.remove_roles(player_role) n_roles_removed += 1 except Exception: users_role_not_removed.append(member_id) continue success_extra = "" players_not_found = "\n".join(list(set(participants) - set(players_found))) if players_not_found: success_extra += self.get_string(ctx.command.name, "players_not_found", players_not_found) if users_role_not_removed: success_extra += self.get_string( ctx.command.name, "users_role_not_removed", "\n".join(users_role_not_removed) ) await self.send_reply( ctx, ctx.command.name, "success", bracket.name, n_roles_removed, len(players_found), success_extra, )
async def give_player_role(self, guild): tournament = self.get_tournament(guild.id) player_role = tosurnament.get_role(guild.roles, tournament.player_role_id, "Player") if not player_role: return for bracket in tournament.brackets: players_spreadsheet = bracket.players_spreadsheet if not players_spreadsheet: continue if players_spreadsheet.range_team_name: team_name_cells = players_spreadsheet.worksheet.get_cells_with_value_in_range( players_spreadsheet.range_team_name) team_info = None for team_name_cell in team_name_cells: team_info = TeamInfo.from_team_name( players_spreadsheet, team_name_cell.value) if not team_info: continue for player_cell in team_info.players: user = guild.get_member_named(player_cell.value) if user: await user.add_roles(player_role) else: team_cells = players_spreadsheet.worksheet.get_cells_with_value_in_range( players_spreadsheet.range_team) for cell in team_cells: try: team_info = TeamInfo.from_player_name( players_spreadsheet, cell.value) if team_info.discord[0]: user = guild.get_member_named(team_info.discord[0]) else: user = guild.get_member_named( team_info.team_name.value) if user: await user.add_roles(player_role) except Exception: continue