aboutsummaryrefslogtreecommitdiff
path: root/minecrafttrivia/trivia_interface_cog.py
blob: 63553f813fc8430cd964e4a7f6075bbe6aca74ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import typing

import discord
from discord.ext.commands import guild_only
from redbot.core import commands, Config, checks
from redbot.core.bot import Red

from . import utils
from .game import OngoingGame, CraftingGame, GamePhase


class TriviaInterfaceCog(commands.Cog):
	def __init__(self, *args, **kwargs):
		super().__init__(*args, **kwargs)
		self.config = Config.get_conf(self, identifier=262200644)
		self.config.register_global(version=0)
		self.config.register_guild(
			join_timeout=30,
			guess_timeout=60,
			round_count=10,
			total_scores={},
			high_scores={},
		)
		self.active_games_per_channel: typing.Dict[int, OngoingGame] = {}

	def get_game(self, channel: discord.TextChannel) -> typing.Optional[OngoingGame]:
		game = channel.id in self.active_games_per_channel and self.active_games_per_channel[channel.id]
		if game and game.phase != GamePhase.FINISHED:
			return game

	def create_game(self, bot: Red, channel: discord.TextChannel) -> OngoingGame:
		game = CraftingGame(bot, self.config, channel)
		self.active_games_per_channel[channel.id] = game
		return game

	@commands.group(aliases=["mctrivia", "mct"], invoke_without_command=True)
	@guild_only()
	async def minecrafttrivia(self, ctx: commands.GuildContext):
		"""Starts a game of minecraft trivia"""
		game = self.get_game(ctx.channel)
		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))
		))