Game: decorator for raising explicit exception on methods that need the game to be started
This commit is contained in:
parent
8d8b0bc4b9
commit
27c45f863f
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue