From b474d410874023c39f43d57f88046bba364bf9ea Mon Sep 17 00:00:00 2001 From: bibin Date: Wed, 15 Apr 2020 18:42:56 +0200 Subject: [PATCH] added decorator, decorator with args, time command added --- src/werewolf_bot.py | 66 ++++++++++++++++++++++++++++++-------------- src/werewolf_game.py | 19 +++++++++---- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/werewolf_bot.py b/src/werewolf_bot.py index 650840f..3ef0819 100644 --- a/src/werewolf_bot.py +++ b/src/werewolf_bot.py @@ -72,30 +72,41 @@ async def setup(ctx): def channel_setup(command): @functools.wraps(command) - async def wrapper(ctx): + async def wrapper(ctx, *args, **kwargs): if ctx.channel not in game_instances: await send_wrong(ctx, f"No game setup yet. Use {PREFIX}game setup") else: - await command(ctx) + await command(ctx, *args, **kwargs) + return wrapper + + +def game_not_running(command): + @functools.wraps(command) + @channel_setup + async def wrapper(ctx, *args, **kwargs): + if game_instances[ctx.channel].running: + await send_wrong(ctx, "Sorry! A game is already running") + else: + await command(ctx, *args, **kwargs) return wrapper def game_running(command): @functools.wraps(command) @channel_setup - async def wrapper(ctx): - if game_instances[ctx.channel].running: - await send_wrong(ctx, "Sorry! A game is already running") + async def wrapper(ctx, *args, **kwargs): + if not game_instances[ctx.channel].running: + await send_wrong(ctx, "No game is running") else: - await command(ctx) + await command(ctx, *args, **kwargs) return wrapper def error_handling(command): @functools.wraps(command) - async def wrapper(ctx): + async def wrapper(ctx, *args, **kwargs): try: - await command(ctx) + await command(ctx, *args, **kwargs) except ValueError as error: await send_wrong(ctx, str(error)) except asyncio.TimeoutError: @@ -104,7 +115,7 @@ def error_handling(command): @game.command() -@game_running +@game_not_running @error_handling async def start(ctx): game_instances[ctx.channel].game = bot.loop.create_task(game_instances[ctx.channel].round()) @@ -112,27 +123,39 @@ async def start(ctx): @game.command() +@game_running @channel_setup async def stop(ctx): - if not game_instances[ctx.channel].running: - await send_wrong(ctx, "No game is running") - else: - game_instances[ctx.channel].game.cancel() - await send_friendly(ctx, "Game canceled") + game_instances[ctx.channel].game.cancel() + await send_friendly(ctx, "Game canceled") @game.command() -@game_running +@game_not_running @error_handling async def players(ctx): await game_instances[ctx.channel].set_players(ctx.message) +@game.command() +@game_not_running +@error_handling +async def roles(ctx, *args): + await game_instances[ctx.channel].set_roles(args) + + +@game.command() +@game_not_running +@error_handling +async def minutes(ctx, i): + await game_instances[ctx.channel].set_time(i) + + @game.command() @game_running @error_handling -async def roles(ctx): - await game_instances[ctx.channel].set_roles(ctx.message.content.split()[3:]) # exclude commands +async def time(ctx): + await send_friendly(ctx, game_instances[ctx.channel].remaining_time_string()) # smaller commands @@ -153,10 +176,10 @@ async def ping(ctx): def developer(command): @functools.wraps(command) - async def wrapper(ctx): + async def wrapper(ctx, *args, **kwargs): DEV_ID = 461892912821698562 if ctx.author.id == DEV_ID: - await command(ctx) + await command(ctx, *args, **kwargs) else: await send_wrong(ctx, "This command is not for you!") return wrapper @@ -170,8 +193,9 @@ async def logout(ctx): @bot.command() @developer -async def debug(ctx): +async def debug(ctx, *args): print("DEBUG") - print(ctx.message.content) + print(ctx.args) + print(ctx.kwargs) bot.run(TOKEN) diff --git a/src/werewolf_game.py b/src/werewolf_game.py index f2a2e0f..255bef0 100644 --- a/src/werewolf_game.py +++ b/src/werewolf_game.py @@ -1,4 +1,5 @@ from random import shuffle +import time import asyncio import discord from werewolf_roles import Role, Doppelganger, Werewolf, Minion, Mason, Seer, Robber, Troublemaker, Drunk, Insomniac, Tanner, Hunter, No_role @@ -29,6 +30,10 @@ class Game: self.role_list = [Role.match(r) for r in suggestions] # raises ValueError await self.send(f"Roles: {', '.join(r.name() for r in self.role_list)}") # send confirmation + async def set_time(self, msg): + self.discussion_time = int(msg) * 60 + 1 + await self.send(f"You have set the discussion time to {self.discussion_time//60} minutes") # send confirmation + def check(self): if not 0 <= len(self.player_list) <= 10: raise ValueError(f"Invalid number of players: {len(self.player_list)}") @@ -48,7 +53,6 @@ class Game: self.voting_list = self.player_list + [No_player()] for c in self.voting_list: c.reset() - self.time = 0 def distribute_roles(self): shuffle(self.role_list) @@ -80,14 +84,19 @@ class Game: async def start_day(self): await self.send("The day has started") + def remaining_time_string(self): + t = int(self.start_time + self.discussion_time - time.time()) + return f"{t//60} minute(s) and {t%60} second(s)" + async def discussion_timer(self): - await self.send(f"You have {self.discussion_time / 60} minutes to discuss") + self.start_time = time.time() + await self.send(f"You have {self.remaining_time_string()} to discuss") await asyncio.sleep(self.discussion_time / 2) - await self.send("Half of the time has passed") + await self.send(f"{self.remaining_time_string()} remaining") await asyncio.sleep(self.discussion_time / 2 - 60) - await self.send("One minute remaining") + await self.send(f"{self.remaining_time_string()} remaining") await asyncio.sleep(30) - await self.send("30 seconds remaining") + await self.send(f"{self.remaining_time_string()} remaining") await asyncio.sleep(30) async def early_vote(self):