added decorator, decorator with args, time command added

This commit is contained in:
Bibin Muttappillil 2020-04-15 18:42:56 +02:00
parent e56a5d1629
commit b474d41087
2 changed files with 59 additions and 26 deletions

View File

@ -72,30 +72,41 @@ async def setup(ctx):
def channel_setup(command): def channel_setup(command):
@functools.wraps(command) @functools.wraps(command)
async def wrapper(ctx): async def wrapper(ctx, *args, **kwargs):
if ctx.channel not in game_instances: if ctx.channel not in game_instances:
await send_wrong(ctx, f"No game setup yet. Use {PREFIX}game setup") await send_wrong(ctx, f"No game setup yet. Use {PREFIX}game setup")
else: 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 return wrapper
def game_running(command): def game_running(command):
@functools.wraps(command) @functools.wraps(command)
@channel_setup @channel_setup
async def wrapper(ctx): async def wrapper(ctx, *args, **kwargs):
if game_instances[ctx.channel].running: if not game_instances[ctx.channel].running:
await send_wrong(ctx, "Sorry! A game is already running") await send_wrong(ctx, "No game is running")
else: else:
await command(ctx) await command(ctx, *args, **kwargs)
return wrapper return wrapper
def error_handling(command): def error_handling(command):
@functools.wraps(command) @functools.wraps(command)
async def wrapper(ctx): async def wrapper(ctx, *args, **kwargs):
try: try:
await command(ctx) await command(ctx, *args, **kwargs)
except ValueError as error: except ValueError as error:
await send_wrong(ctx, str(error)) await send_wrong(ctx, str(error))
except asyncio.TimeoutError: except asyncio.TimeoutError:
@ -104,7 +115,7 @@ def error_handling(command):
@game.command() @game.command()
@game_running @game_not_running
@error_handling @error_handling
async def start(ctx): async def start(ctx):
game_instances[ctx.channel].game = bot.loop.create_task(game_instances[ctx.channel].round()) 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.command()
@game_running
@channel_setup @channel_setup
async def stop(ctx): async def stop(ctx):
if not game_instances[ctx.channel].running: game_instances[ctx.channel].game.cancel()
await send_wrong(ctx, "No game is running") await send_friendly(ctx, "Game canceled")
else:
game_instances[ctx.channel].game.cancel()
await send_friendly(ctx, "Game canceled")
@game.command() @game.command()
@game_running @game_not_running
@error_handling @error_handling
async def players(ctx): async def players(ctx):
await game_instances[ctx.channel].set_players(ctx.message) 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.command()
@game_running @game_running
@error_handling @error_handling
async def roles(ctx): async def time(ctx):
await game_instances[ctx.channel].set_roles(ctx.message.content.split()[3:]) # exclude commands await send_friendly(ctx, game_instances[ctx.channel].remaining_time_string())
# smaller commands # smaller commands
@ -153,10 +176,10 @@ async def ping(ctx):
def developer(command): def developer(command):
@functools.wraps(command) @functools.wraps(command)
async def wrapper(ctx): async def wrapper(ctx, *args, **kwargs):
DEV_ID = 461892912821698562 DEV_ID = 461892912821698562
if ctx.author.id == DEV_ID: if ctx.author.id == DEV_ID:
await command(ctx) await command(ctx, *args, **kwargs)
else: else:
await send_wrong(ctx, "This command is not for you!") await send_wrong(ctx, "This command is not for you!")
return wrapper return wrapper
@ -170,8 +193,9 @@ async def logout(ctx):
@bot.command() @bot.command()
@developer @developer
async def debug(ctx): async def debug(ctx, *args):
print("DEBUG") print("DEBUG")
print(ctx.message.content) print(ctx.args)
print(ctx.kwargs)
bot.run(TOKEN) bot.run(TOKEN)

View File

@ -1,4 +1,5 @@
from random import shuffle from random import shuffle
import time
import asyncio import asyncio
import discord import discord
from werewolf_roles import Role, Doppelganger, Werewolf, Minion, Mason, Seer, Robber, Troublemaker, Drunk, Insomniac, Tanner, Hunter, No_role 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 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 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): def check(self):
if not 0 <= len(self.player_list) <= 10: if not 0 <= len(self.player_list) <= 10:
raise ValueError(f"Invalid number of players: {len(self.player_list)}") 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()] self.voting_list = self.player_list + [No_player()]
for c in self.voting_list: for c in self.voting_list:
c.reset() c.reset()
self.time = 0
def distribute_roles(self): def distribute_roles(self):
shuffle(self.role_list) shuffle(self.role_list)
@ -80,14 +84,19 @@ class Game:
async def start_day(self): async def start_day(self):
await self.send("The day has started") 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): 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 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 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 asyncio.sleep(30)
await self.send("30 seconds remaining") await self.send(f"{self.remaining_time_string()} remaining")
await asyncio.sleep(30) await asyncio.sleep(30)
async def early_vote(self): async def early_vote(self):