diff --git a/GameFiles/Game.py b/GameFiles/Game.py index 2482c5f..ce85ab0 100644 --- a/GameFiles/Game.py +++ b/GameFiles/Game.py @@ -1,11 +1,24 @@ import logging from typing import Dict, Callable, List, Union +from functools import wraps import discord logger = logging.getLogger(__name__) +def started_only(func): + """ + Decorator for *methods* of Game that need the game to be started. + """ + @wraps(func) + def decorated(obj, *args, **kwargs): + if not obj.is_started(): + raise RuntimeError("This function only works on running games!") + func(obj, *args, **kwargs) + return decorated + + class Game: """ Game state for one guild @@ -25,29 +38,37 @@ class Game: def is_started(self): return self.config["game_started"] + @started_only def get_players_id(self) -> List[int]: return self.config["players"] + @started_only def get_players(self) -> List[discord.Member]: return [self.guild.get_member(player) for player in self.get_players_id()] + @started_only 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)] + @started_only def get_gm_role_id(self) -> int: return self.config["gm_role"] + @started_only def get_gm_role(self) -> discord.Role: return self.guild.get_role(self.get_gm_role_id()) + @started_only def is_gm(self, user: discord.Member) -> bool: return self.get_gm_role() in user.roles + @started_only def get_game_category_id(self) -> int: return self.config["category"] + @started_only def get_game_category(self) -> discord.CategoryChannel: return self.guild.get_channel(self.get_game_category_id()) @@ -100,6 +121,7 @@ class Game: self.config["game_started"] = True self.save_function() + @started_only async def delete(self): category = self.get_game_category() for channel in category.channels: