diff --git a/GameFiles/Game.py b/GameFiles/Game.py index 1c374c4..570e2b2 100644 --- a/GameFiles/Game.py +++ b/GameFiles/Game.py @@ -1,10 +1,15 @@ -from typing import Dict, Callable +from typing import Dict, Callable, List, Union +import discord +import logging + +logger = logging.getLogger(__name__) class Game: """ Game state for one guild """ + def __init__(self, config_dict: Dict, save_function: Callable): self.config = config_dict self.save_function = save_function @@ -18,5 +23,61 @@ class Game: def is_started(self): return self.config["game_started"] - async def start(self): - raise NotImplementedError("Start game") + def get_players(self) -> List[int]: + return self.config["players"] + + 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)] + + async def start(self, guild: discord.Guild, dm_role: discord.Role, player_role: discord.Role): + if self.is_started(): + raise ValueError("Game already started") + logger.info(f"[{guild.name}] Starting game") + self.config["dm_role"] = dm_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), + dm_role: discord.PermissionOverwrite(send_messages = True), + player_role: discord.PermissionOverwrite(send_messages = True), + } + game_category = await guild.create_category("In-game", overwrites = permissions) + self.config["category"] = game_category.id + logger.debug(f"[{guild.name}] Created game category") + + permissions = { + guild.default_role: discord.PermissionOverwrite(read_messages = False), + dm_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") + + permissions = { + guild.default_role: discord.PermissionOverwrite(send_messages = False), + dm_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") + + 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") + + 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), + dm_role: discord.PermissionOverwrite(read_messages = True), + } + player_channel = await game_category.create_text_channel(player_member.name, overwrites = channel_permissions) + self.get_player_info(player)["channel"] = player_channel.id + logger.debug(f"[{guild.name}] Created player channels") + + self.config["game_started"] = True + self.save_function() diff --git a/SecretBot.py b/SecretBot.py index 653f010..f06f95a 100755 --- a/SecretBot.py +++ b/SecretBot.py @@ -22,7 +22,7 @@ class SecretBot(commands.Cog): self.bot = commands.Bot( "!", help_command = commands.MinimalHelpCommand(), - intents = discord.Intents(guild_messages = True, guilds = True), + intents = discord.Intents(guild_messages = True, guilds = True, members = True), allowed_mentions = discord.AllowedMentions.none(), # By default we do not allow mentions, as we will white-list them on each required message ) self.bot.add_cog(self) @@ -33,7 +33,7 @@ class SecretBot(commands.Cog): def get_command_usage_message(self, command: commands.Command, prepend = "Usage: ") -> str: command_elements = [str(cmd) for cmd in command.parents] + [command.name] - return f"{prepend}`{self.command_prefix}{' '.join(command_elements)} {command.signature}`" + return f"{prepend}`{self.bot.command_prefix}{' '.join(command_elements)} {command.signature}`" @commands.Cog.listener() async def on_ready(self): @@ -42,7 +42,7 @@ class SecretBot(commands.Cog): oauth_url = discord.utils.oauth_url( self.bot.user.id, - discord.Permissions(manage_channels = True, read_messages = True, send_messages = True) + discord.Permissions(read_messages = True, send_messages = True, manage_channels = True, manage_roles = True, mention_everyone = True, manage_messages = True) ) logger.info(f"You can invite the bot to your server using the following link: {oauth_url}") @@ -90,14 +90,13 @@ class SecretBot(commands.Cog): await ctx.reply(":ping_pong:", mention_author = True) @commands.command("StartGame") - async def start_game(self, ctx: commands.Context): + async def start_game(self, ctx: commands.Context, dm_role: discord.Role, player_role: discord.Role): game = self.games_file[ctx.guild] if game.is_started(): await ctx.reply(":x: a game is already running") else: - await game.start() - - + await ctx.guild.get_member(self.bot.user.id).add_roles(dm_role) + await game.start(ctx.guild, dm_role, player_role) if __name__ == '__main__':