From 27c45f863fdd6dd725a6b3951a456f6c68c9ee7c Mon Sep 17 00:00:00 2001 From: Elnath Date: Wed, 9 Jun 2021 23:53:09 +0200 Subject: [PATCH] Game: decorator for raising explicit exception on methods that need the game to be started --- GameFiles/Game.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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: