GM and observer roles created by the bot on game start
This commit is contained in:
parent
03cee9963b
commit
ef65c2dda6
|
|
@ -117,6 +117,14 @@ class Game:
|
|||
def get_player_role(self) -> discord.Role:
|
||||
return self.guild.get_role(self.get_player_role_id())
|
||||
|
||||
@game_started
|
||||
def get_observer_role_id(self) -> int:
|
||||
return self.config["observer_role"]
|
||||
|
||||
@game_started
|
||||
def get_observer_role(self) -> discord.Role:
|
||||
return self.guild.get_role(self.get_observer_role_id())
|
||||
|
||||
@game_started
|
||||
def get_game_category_id(self) -> int:
|
||||
return self.config["category"]
|
||||
|
|
@ -171,13 +179,12 @@ class Game:
|
|||
return self.guild.get_channel(self.get_player_channel_id(player))
|
||||
|
||||
@save_on_success
|
||||
async def start(self, gm_role: discord.Role, player_role: discord.Role):
|
||||
async def start(self, player_role: discord.Role, bot_user_id: int):
|
||||
if self.is_started():
|
||||
raise ValueError("Game already started")
|
||||
logger.info(f"[{self.guild.name}] Starting game")
|
||||
tasks = [] # Asyncio tasks scheduled to run in parallel (e.g. channel creation), so that we can wait them all at the end of the function
|
||||
self.config["game_started"] = True
|
||||
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"]}
|
||||
|
|
@ -188,10 +195,19 @@ class Game:
|
|||
self.config["drawn"] = None
|
||||
self.config["enacted"] = []
|
||||
|
||||
gm_role = await self.guild.create_role(name = "GM", hoist = True, mentionable = True, permissions = self.guild.default_role.permissions)
|
||||
self.config["gm_role"] = gm_role.id
|
||||
await self.guild.get_member(bot_user_id).add_roles(gm_role) # Need to be here otherwise the bot won't have the permissions needed to set up private channels
|
||||
logger.debug("Created GM role")
|
||||
observer_role = await self.guild.create_role(name = "Observer", mentionable = True, permissions = self.guild.default_role.permissions)
|
||||
self.config["observer_role"] = observer_role.id
|
||||
logger.debug("Created Observer role")
|
||||
|
||||
category_permissions = {
|
||||
self.guild.default_role: discord.PermissionOverwrite(send_messages = False),
|
||||
gm_role: discord.PermissionOverwrite(send_messages = True),
|
||||
player_role: discord.PermissionOverwrite(send_messages = True),
|
||||
observer_role: discord.PermissionOverwrite(send_messages = False, read_messages = True),
|
||||
}
|
||||
game_category = await self.guild.create_category("In-game", overwrites = category_permissions)
|
||||
self.config["category"] = game_category.id
|
||||
|
|
@ -221,21 +237,32 @@ class Game:
|
|||
tasks.append(asyncio.create_task(create_announcements_and_vote_chans()))
|
||||
|
||||
async def create_discussion_chan():
|
||||
# Permissions are inherited from the category
|
||||
# Permissions are inherited from the category so they are synced to it
|
||||
self.config["discussion_chan"] = (await game_category.create_text_channel("discussion", position = 3)).id # Permissions are inherited from the category
|
||||
logger.debug(f"[{self.guild.name}] Created discussion channel")
|
||||
tasks.append(asyncio.create_task(create_discussion_chan()))
|
||||
|
||||
async def create_observers_chan():
|
||||
perms = {
|
||||
self.guild.default_role: discord.PermissionOverwrite(read_messages = False),
|
||||
gm_role: discord.PermissionOverwrite(read_messages = True),
|
||||
observer_role: discord.PermissionOverwrite(read_messages = True),
|
||||
}
|
||||
self.config["observer_chan"] = (await game_category.create_text_channel("observers", overwrites = perms, position = 4)).id
|
||||
logger.debug(f"[{self.guild}] Created observers channel")
|
||||
tasks.append(asyncio.create_task(create_observers_chan()))
|
||||
|
||||
async def create_player_channel(player: discord.Member, position: int):
|
||||
perms = {
|
||||
self.guild.default_role: discord.PermissionOverwrite(read_messages = False),
|
||||
player: discord.PermissionOverwrite(read_messages = True),
|
||||
gm_role: discord.PermissionOverwrite(read_messages = True),
|
||||
observer_role: discord.PermissionOverwrite(read_messages = True, send_messages = False),
|
||||
}
|
||||
self.config["player_info"][str(player.id)]["channel"] = (await game_category.create_text_channel(player.name, overwrites = perms, position = position)).id
|
||||
logger.debug(f"[{self.guild.name}] Created channel for player {player.name}")
|
||||
for i, player in enumerate(player_role.members):
|
||||
tasks.append(asyncio.create_task(create_player_channel(player, 4+i)))
|
||||
tasks.append(asyncio.create_task(create_player_channel(player, 5 + i)))
|
||||
|
||||
await asyncio.wait(tasks)
|
||||
|
||||
|
|
@ -245,8 +272,11 @@ class Game:
|
|||
category = self.get_game_category()
|
||||
await asyncio.wait([channel.delete() for channel in category.channels])
|
||||
await category.delete()
|
||||
# Need to delete the roles last
|
||||
await asyncio.wait([self.get_gm_role().delete(), self.get_observer_role().delete()])
|
||||
self.config.clear()
|
||||
self.config.update(self.new_dict())
|
||||
logger.debug(f"[{self.guild.name}] Game deleted")
|
||||
|
||||
@save_on_success
|
||||
async def start_vote(self, president: discord.Member, chancellor: discord.Member):
|
||||
|
|
|
|||
|
|
@ -172,14 +172,13 @@ class SecretBot(commands.Cog):
|
|||
await ctx.reply(":ping_pong:", mention_author = True)
|
||||
|
||||
@commands.command("StartGame")
|
||||
async def start_game(self, ctx: commands.Context, gm_role: discord.Role, player_role: discord.Role):
|
||||
async def start_game(self, ctx: commands.Context, player_role: discord.Role):
|
||||
await self.check_is_administrator(ctx)
|
||||
game = self.games_file[ctx.guild]
|
||||
if game.is_started():
|
||||
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(gm_role, player_role)
|
||||
await game.start(player_role, self.bot.user.id)
|
||||
await ctx.reply(":white_check_mark: Game started!")
|
||||
|
||||
@commands.command("DeleteGame", help = "Delete a running game and all of its associated channels")
|
||||
|
|
@ -190,9 +189,7 @@ class SecretBot(commands.Cog):
|
|||
|
||||
async def delete_game(self, ctx: commands.Context):
|
||||
game = await self.get_running_game_or_error_message(ctx)
|
||||
gm_role = game.get_gm_role()
|
||||
await game.delete()
|
||||
await ctx.guild.get_member(self.bot.user.id).remove_roles(gm_role)
|
||||
try:
|
||||
await ctx.reply(":white_check_mark: Game deleted!")
|
||||
except discord.NotFound: # If the command is executed in a game channel, then the channel won't exist anymore for the reply
|
||||
|
|
|
|||
Loading…
Reference in New Issue