aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--minecrafttrivia/game.py7
-rw-r--r--minecrafttrivia/trivia_interface_cog.py83
-rw-r--r--minecrafttrivia/utils.py2
3 files changed, 69 insertions, 23 deletions
diff --git a/minecrafttrivia/game.py b/minecrafttrivia/game.py
index 3e8f725..e2373e6 100644
--- a/minecrafttrivia/game.py
+++ b/minecrafttrivia/game.py
@@ -36,14 +36,15 @@ class OngoingGame(ABC):
async def start_signup(self):
self.phase = GamePhase.SIGNUP
+ join_timeout = await self.config.join_timeout()
embed = discord.Embed(
title="Signups opened for new game of Minecraft trivia",
- description="React to this message in order to join. You have 30 seconds to signup.",
+ description=f"React to this message in order to join. You have {join_timeout} seconds to signup.",
)
embed.timestamp = datetime.now()
self.signup_message = await self.channel.send(embed=embed)
await self.signup_message.add_reaction(constants.POSITIVE_REACTION)
- await asyncio.sleep(await self.config.join_timeout())
+ await asyncio.sleep(join_timeout)
embed.description = "Signups are now closed. Wait for the game to finish to start a new one."
await self.signup_message.edit(embed=embed)
self.participants = await utils.get_participants((await self.channel.fetch_message(self.signup_message.id)).reactions)
@@ -62,7 +63,7 @@ class OngoingGame(ABC):
await self.channel.send(embed=embed)
async def gameloop(self):
- for i in range(2):#todo
+ for i in range(await self.config.round_count()):
await self.single_round(i)
await self.conclude_game()
diff --git a/minecrafttrivia/trivia_interface_cog.py b/minecrafttrivia/trivia_interface_cog.py
index b27f789..63553f8 100644
--- a/minecrafttrivia/trivia_interface_cog.py
+++ b/minecrafttrivia/trivia_interface_cog.py
@@ -2,7 +2,7 @@ import typing
import discord
from discord.ext.commands import guild_only
-from redbot.core import commands, Config
+from redbot.core import commands, Config, checks
from redbot.core.bot import Red
from . import utils
@@ -17,6 +17,7 @@ class TriviaInterfaceCog(commands.Cog):
self.config.register_guild(
join_timeout=30,
guess_timeout=60,
+ round_count=10,
total_scores={},
high_scores={},
)
@@ -32,24 +33,68 @@ class TriviaInterfaceCog(commands.Cog):
self.active_games_per_channel[channel.id] = game
return game
- @commands.command(aliases=["mctrivia", "mct"])
+ @commands.group(aliases=["mctrivia", "mct"], invoke_without_command=True)
@guild_only()
- async def minecrafttrivia(self, ctx: commands.GuildContext, action: str = "new"):
+ async def minecrafttrivia(self, ctx: commands.GuildContext):
"""Starts a game of minecraft trivia"""
game = self.get_game(ctx.channel)
- if action == "new":
- if game:
- return await ctx.send("Game already started.")
- game = self.create_game(ctx.bot, ctx.channel)
- await game.start_signup()
- elif action[:4] == "high":
- high_scores = await self.config.guild(ctx.guild).high_scores()
- await ctx.send(embed=discord.Embed(
- title=f"MC Trivia Highscores for {ctx.guild.name}",
- description=utils.format_leaderboard(utils.create_leaderboard(high_scores))))
- elif action[:4] == "lead":
- total_scores = await self.config.guild(ctx.guild).total_scores()
- await ctx.send(embed=discord.Embed(
- title=f"MC Trivia Leaderboard for {ctx.guild.name}",
- description=utils.format_leaderboard(utils.create_leaderboard(total_scores))
- ))
+ if game:
+ return await ctx.send("Game already started.")
+ game = self.create_game(ctx.bot, ctx.channel)
+ await game.start_signup()
+
+ @minecrafttrivia.group(aliases=["config"], invoke_without_command=True)
+ @guild_only()
+ @checks.admin()
+ async def set(self, ctx: commands.GuildContext):
+ await ctx.send("Available config options: join_timeout guess_timeout round_count")
+
+ @set.command(aliases=["join"])
+ @guild_only()
+ @checks.admin()
+ async def join_timeout(self, ctx: commands.GuildContext, to: int = None):
+ c = self.config.guild(ctx.guild)
+ if to:
+ await c.join_timeout.set(to)
+ await ctx.send(f"Set `join_timeout` to `{to}`")
+ else:
+ await ctx.send(f"`join_timeout` is `{await c.join_timeout()}`")
+
+ @set.command(aliases=["guess"])
+ @guild_only()
+ @checks.admin()
+ async def guess_timeout(self, ctx: commands.GuildContext, to: int = None):
+ c = self.config.guild(ctx.guild)
+ if to:
+ await c.guess_timeout.set(to)
+ await ctx.send(f"Set `guess_timeout` to `{to}`")
+ else:
+ await ctx.send(f"`guess_timeout` is `{await c.guess_timeout()}`")
+
+ @set.command(aliases=["rounds"])
+ @guild_only()
+ @checks.admin()
+ async def round_count(self, ctx: commands.GuildContext, to: int = None):
+ c = self.config.guild(ctx.guild)
+ if to:
+ await c.round_count.set(to)
+ await ctx.send(f"Set `round_count` to `{to}`")
+ else:
+ await ctx.send(f"`round_count` is `{await c.round_count()}`")
+
+ @minecrafttrivia.command(aliases=["high"])
+ @guild_only()
+ async def highscore(self, ctx: commands.GuildContext):
+ high_scores = await self.config.guild(ctx.guild).high_scores()
+ await ctx.send(embed=discord.Embed(
+ title=f"MC Trivia Highscores for {ctx.guild.name}",
+ description=utils.format_leaderboard(utils.create_leaderboard(high_scores))))
+
+ @minecrafttrivia.command(aliases=["lead", "total"])
+ @guild_only()
+ async def leaderboard(self, ctx: commands.GuildContext):
+ total_scores = await self.config.guild(ctx.guild).total_scores()
+ await ctx.send(embed=discord.Embed(
+ title=f"MC Trivia Leaderboard for {ctx.guild.name}",
+ description=utils.format_leaderboard(utils.create_leaderboard(total_scores))
+ ))
diff --git a/minecrafttrivia/utils.py b/minecrafttrivia/utils.py
index 8bb4730..89f650d 100644
--- a/minecrafttrivia/utils.py
+++ b/minecrafttrivia/utils.py
@@ -17,7 +17,7 @@ async def get_participants(reactions: typing.List[discord.Reaction]) -> typing.L
def format_leaderboard(points: typing.List[typing.Tuple[int, typing.Tuple[typing.Union[discord.User, int], int]]]) -> str:
- return "\n".join(f"**{rank + 1}.** {user.mention if hasattr(user, 'mention') else '<@' + str(user) + '>'} - {points}" for rank, (user, points) in points)
+ return "\n".join(f"**{rank + 1}.** {user.mention if hasattr(user, 'mention') else '<@' + str(user) + '>'} - {points}" for rank, (user, points) in points[:20])
_T = typing.TypeVar("_T", discord.User, int)