added decorator, decorator with args, time command added
This commit is contained in:
parent
e56a5d1629
commit
b474d41087
|
@ -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.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)
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue