From a5b05e81ad4cd8ebe059c4217cfd56006b33a9cc Mon Sep 17 00:00:00 2001 From: Elnath Date: Wed, 9 Jun 2021 23:03:58 +0200 Subject: [PATCH] Storing guild object in game for easier access to discord objects --- GameFiles/Game.py | 49 +++++++++++++++++++++++++----------------- GameFiles/GamesFile.py | 2 +- SecretBot.py | 4 ++-- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/GameFiles/Game.py b/GameFiles/Game.py index 2bc4eba..774ae1c 100644 --- a/GameFiles/Game.py +++ b/GameFiles/Game.py @@ -11,9 +11,10 @@ class Game: Game state for one guild """ - def __init__(self, config_dict: Dict, save_function: Callable): + def __init__(self, config_dict: Dict, save_function: Callable, guild: discord.Guild): self.config = config_dict self.save_function = save_function + self.guild = guild @staticmethod def new_dict(): @@ -24,72 +25,80 @@ class Game: def is_started(self): return self.config["game_started"] - def get_players(self) -> List[int]: + def get_players_id(self) -> List[int]: return self.config["players"] + def get_players(self) -> List[discord.Member]: + return [self.guild.get_member(player) for player in self.get_players_id()] + def get_player_info(self, player: Union[int, discord.Member]): if isinstance(player, discord.Member): player = player.id return self.config["player_info"][str(player)] - def get_gm_role(self) -> int: + def get_gm_role_id(self) -> int: return self.config["gm_role"] - def get_game_category(self) -> int: + def get_gm_role(self) -> discord.Role: + return self.guild.get_role(self.get_gm_role_id()) + + def get_game_category_id(self) -> int: return self.config["category"] - async def start(self, guild: discord.Guild, gm_role: discord.Role, player_role: discord.Role): + def get_game_category(self) -> discord.CategoryChannel: + return self.guild.get_channel(self.get_game_category_id()) + + async def start(self, gm_role: discord.Role, player_role: discord.Role): if self.is_started(): raise ValueError("Game already started") - logger.info(f"[{guild.name}] Starting game") + logger.info(f"[{self.guild.name}] Starting game") self.config["gm_role"] = gm_role.id self.config["player_role"] = player_role.id self.config["players"] = [member.id for member in player_role.members] self.config["player_info"] = {str(player): {} for player in self.config["players"]} permissions = { - guild.default_role: discord.PermissionOverwrite(send_messages = False), + self.guild.default_role: discord.PermissionOverwrite(send_messages = False), gm_role: discord.PermissionOverwrite(send_messages = True), player_role: discord.PermissionOverwrite(send_messages = True), } - game_category = await guild.create_category("In-game", overwrites = permissions) + game_category = await self.guild.create_category("In-game", overwrites = permissions) self.config["category"] = game_category.id - logger.debug(f"[{guild.name}] Created game category") + logger.debug(f"[{self.guild.name}] Created game category") permissions = { - guild.default_role: discord.PermissionOverwrite(read_messages = False), + self.guild.default_role: discord.PermissionOverwrite(read_messages = False), gm_role: discord.PermissionOverwrite(read_messages = True), } self.config["admin_chan"] = (await game_category.create_text_channel("admin", overwrites = permissions)).id - logger.debug(f"[{guild.name}] Created admin channel") + logger.debug(f"[{self.guild.name}] Created admin channel") permissions = { - guild.default_role: discord.PermissionOverwrite(send_messages = False), + self.guild.default_role: discord.PermissionOverwrite(send_messages = False), gm_role: discord.PermissionOverwrite(send_messages = True), } self.config["announce_chan"] = (await game_category.create_text_channel("announce", overwrites = permissions)).id self.config["votes_chan"] = (await game_category.create_text_channel("votes", overwrites = permissions)).id - logger.debug(f"[{guild.name}] Created announcements and votes channels") + logger.debug(f"[{self.guild.name}] Created announcements and votes channels") self.config["discussion_chan"] = (await game_category.create_text_channel("discussion")).id # Permissions are inherited from the category - logger.debug(f"[{guild.name}] Created discussion channel") + logger.debug(f"[{self.guild.name}] Created discussion channel") for player in self.get_players(): - player_member: discord.Member = guild.get_member(player) channel_permissions = { - guild.default_role: discord.PermissionOverwrite(read_messages = False), - player_member: discord.PermissionOverwrite(read_messages = True), + self.guild.default_role: discord.PermissionOverwrite(read_messages = False), + player: discord.PermissionOverwrite(read_messages = True), gm_role: discord.PermissionOverwrite(read_messages = True), } - player_channel = await game_category.create_text_channel(player_member.name, overwrites = channel_permissions) + player_channel = await game_category.create_text_channel(player.name, overwrites = channel_permissions) self.get_player_info(player)["channel"] = player_channel.id - logger.debug(f"[{guild.name}] Created player channels") + logger.debug(f"[{self.guild.name}] Created player channels") self.config["game_started"] = True self.save_function() async def delete(self, guild: discord.Guild): - category = guild.get_channel(self.get_game_category()) + category = self.get_game_category() for channel in category.channels: await channel.delete() await category.delete() diff --git a/GameFiles/GamesFile.py b/GameFiles/GamesFile.py index 8352b5d..ee89ac3 100644 --- a/GameFiles/GamesFile.py +++ b/GameFiles/GamesFile.py @@ -120,4 +120,4 @@ class GamesFile: if guild_id_str not in self.config: self.config[guild_id_str] = Game.new_dict() self.save_to_file() - return Game(self.config[guild_id_str], self.save_to_file) + return Game(self.config[guild_id_str], self.save_to_file, guild) diff --git a/SecretBot.py b/SecretBot.py index f1d8fc6..23952bb 100755 --- a/SecretBot.py +++ b/SecretBot.py @@ -95,13 +95,13 @@ class SecretBot(commands.Cog): await ctx.reply(":x: a game is already running") else: await ctx.guild.get_member(self.bot.user.id).add_roles(gm_role) - await game.start(ctx.guild, gm_role, player_role) + await game.start(gm_role, player_role) @commands.command("DeleteGame", help = "Delete a running game and all of its associated channels") async def delete_game(self, ctx: commands.Context): game = self.games_file[ctx.guild] if game.is_started(): - gm_role = discord.Object(game.get_gm_role()) # We need to get the role before the game is deleted + gm_role = game.get_gm_role() await game.delete(ctx.guild) await ctx.guild.get_member(self.bot.user.id).remove_roles(gm_role) else: