Game: decorator for raising explicit exception on methods that need the game to be started

This commit is contained in:
Elnath 2021-06-09 23:53:09 +02:00
parent 8d8b0bc4b9
commit 27c45f863f
1 changed files with 22 additions and 0 deletions

View File

@ -1,11 +1,24 @@
import logging import logging
from typing import Dict, Callable, List, Union from typing import Dict, Callable, List, Union
from functools import wraps
import discord import discord
logger = logging.getLogger(__name__) 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: class Game:
""" """
Game state for one guild Game state for one guild
@ -25,29 +38,37 @@ class Game:
def is_started(self): def is_started(self):
return self.config["game_started"] return self.config["game_started"]
@started_only
def get_players_id(self) -> List[int]: def get_players_id(self) -> List[int]:
return self.config["players"] return self.config["players"]
@started_only
def get_players(self) -> List[discord.Member]: def get_players(self) -> List[discord.Member]:
return [self.guild.get_member(player) for player in self.get_players_id()] 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]): def get_player_info(self, player: Union[int, discord.Member]):
if isinstance(player, discord.Member): if isinstance(player, discord.Member):
player = player.id player = player.id
return self.config["player_info"][str(player)] return self.config["player_info"][str(player)]
@started_only
def get_gm_role_id(self) -> int: def get_gm_role_id(self) -> int:
return self.config["gm_role"] return self.config["gm_role"]
@started_only
def get_gm_role(self) -> discord.Role: def get_gm_role(self) -> discord.Role:
return self.guild.get_role(self.get_gm_role_id()) return self.guild.get_role(self.get_gm_role_id())
@started_only
def is_gm(self, user: discord.Member) -> bool: def is_gm(self, user: discord.Member) -> bool:
return self.get_gm_role() in user.roles return self.get_gm_role() in user.roles
@started_only
def get_game_category_id(self) -> int: def get_game_category_id(self) -> int:
return self.config["category"] return self.config["category"]
@started_only
def get_game_category(self) -> discord.CategoryChannel: def get_game_category(self) -> discord.CategoryChannel:
return self.guild.get_channel(self.get_game_category_id()) return self.guild.get_channel(self.get_game_category_id())
@ -100,6 +121,7 @@ class Game:
self.config["game_started"] = True self.config["game_started"] = True
self.save_function() self.save_function()
@started_only
async def delete(self): async def delete(self):
category = self.get_game_category() category = self.get_game_category()
for channel in category.channels: for channel in category.channels: