Storing guild object in game for easier access to discord objects
This commit is contained in:
parent
aae877693a
commit
a5b05e81ad
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue