Implemented #7
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from datetime import datetime
|
||||
from typing import Dict, List, Any
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from bson.errors import InvalidId
|
||||
@@ -64,13 +65,17 @@ class Event(Cog):
|
||||
|
||||
await validate_event_validity(ctx, name, start_date, end_date, guild_timezone)
|
||||
|
||||
processed_media: List[Dict[str, Any]] = (
|
||||
[] if thumbnail is None else await self.bot.process_attachments([thumbnail])
|
||||
)
|
||||
|
||||
event: PycordEvent = await self.bot.create_event(
|
||||
name=name,
|
||||
guild_id=guild.id,
|
||||
creator_id=ctx.author.id,
|
||||
starts=start_date.astimezone(ZoneInfo("UTC")),
|
||||
ends=end_date.astimezone(ZoneInfo("UTC")),
|
||||
thumbnail_id=thumbnail.id if thumbnail else None,
|
||||
thumbnail=processed_media[0] if thumbnail else None,
|
||||
)
|
||||
|
||||
# TODO Make a nice message
|
||||
@@ -138,12 +143,16 @@ class Event(Cog):
|
||||
|
||||
await validate_event_validity(ctx, name, start_date, end_date, guild_timezone)
|
||||
|
||||
processed_media: List[Dict[str, Any]] = (
|
||||
[] if thumbnail is None else await self.bot.process_attachments([thumbnail])
|
||||
)
|
||||
|
||||
await pycord_event.update(
|
||||
self.bot.cache,
|
||||
starts=start_date,
|
||||
ends=end_date,
|
||||
name=pycord_event.name if name is None else name,
|
||||
thumbnail_id=pycord_event.thumbnail_id if thumbnail is None else thumbnail.id,
|
||||
thumbnail=pycord_event.thumbnail if thumbnail is None else processed_media[0],
|
||||
)
|
||||
|
||||
# TODO Make a nice message
|
||||
|
@@ -1,5 +1,10 @@
|
||||
from discord import ApplicationContext, Cog, option, slash_command
|
||||
from typing import List
|
||||
|
||||
from bson import ObjectId
|
||||
from bson.errors import InvalidId
|
||||
from discord import ApplicationContext, Cog, option, slash_command, File
|
||||
|
||||
from classes import PycordEvent, PycordUser, PycordGuild, PycordEventStage
|
||||
from classes.pycord_bot import PycordBot
|
||||
|
||||
|
||||
@@ -16,7 +21,64 @@ class Guess(Cog):
|
||||
)
|
||||
@option("answer", description="An answer to the current stage")
|
||||
async def command_guess(self, ctx: ApplicationContext, answer: str) -> None:
|
||||
await ctx.respond("Not implemented.")
|
||||
guild: PycordGuild = await self.bot.find_guild(ctx.guild.id)
|
||||
|
||||
if not guild.is_configured():
|
||||
# TODO Make a nice message
|
||||
await ctx.respond("Guild is not configured.")
|
||||
return
|
||||
|
||||
user: PycordUser = await self.bot.find_user(ctx.author)
|
||||
|
||||
if user.current_event_id is None or user.current_stage_id is None:
|
||||
# TODO Make a nice message
|
||||
await ctx.respond("You have no ongoing events.")
|
||||
return
|
||||
|
||||
try:
|
||||
event: PycordEvent = await self.bot.find_event(event_id=user.current_event_id)
|
||||
stage: PycordEventStage = await self.bot.find_event_stage(user.current_stage_id)
|
||||
except (InvalidId, RuntimeError):
|
||||
# TODO Make a nice message
|
||||
await ctx.respond(
|
||||
"Your event could not be found. Please, report this issue to the event's management."
|
||||
)
|
||||
return
|
||||
|
||||
if answer.lower() != stage.answer.lower():
|
||||
# TODO Make a nice message
|
||||
await ctx.respond("Provided answer is wrong.")
|
||||
return
|
||||
|
||||
next_stage_index = stage.sequence + 1
|
||||
next_stage_id: ObjectId | None = (
|
||||
None if len(event.stage_ids) < next_stage_index + 1 else event.stage_ids[next_stage_index]
|
||||
)
|
||||
|
||||
if next_stage_id is None:
|
||||
# TODO Make a nice message
|
||||
user.completed_event_ids.append(event._id)
|
||||
|
||||
await user._set(
|
||||
self.bot.cache,
|
||||
current_event_id=None,
|
||||
current_stage_id=None,
|
||||
completed_event_ids=user.completed_event_ids,
|
||||
)
|
||||
|
||||
await ctx.respond("Event is completed.")
|
||||
return
|
||||
|
||||
next_stage: PycordEventStage = await self.bot.find_event_stage(next_stage_id)
|
||||
|
||||
files: List[File] | None = next_stage.get_media_files()
|
||||
|
||||
await ctx.respond(
|
||||
f"Provided answer is correct! Next stage...\n\n{next_stage.question}",
|
||||
files=files,
|
||||
)
|
||||
|
||||
await user.set_event_stage(next_stage._id, cache=self.bot.cache)
|
||||
|
||||
|
||||
def setup(bot: PycordBot) -> None:
|
||||
|
@@ -1,3 +1,5 @@
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from bson.errors import InvalidId
|
||||
from discord import ApplicationContext, Cog, option, slash_command
|
||||
from discord.utils import basic_autocomplete
|
||||
@@ -47,9 +49,10 @@ class Register(Cog):
|
||||
|
||||
await user.event_register(pycord_event._id, cache=self.bot.cache)
|
||||
|
||||
# TODO Text channel must be created and updated
|
||||
|
||||
await ctx.respond("Ok.")
|
||||
# TODO Make a nice message
|
||||
await ctx.respond(
|
||||
f"You are now registered for the event **{pycord_event.name}**.\n\nNew channel will be created for you and further instructions will be provided as soon as the event starts <t:{int((pycord_event.starts.replace(tzinfo=ZoneInfo('UTC'))).timestamp())}:R>. Good luck!"
|
||||
)
|
||||
|
||||
|
||||
def setup(bot: PycordBot) -> None:
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from datetime import datetime
|
||||
from typing import List, Dict, Any
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from bson.errors import InvalidId
|
||||
@@ -14,11 +15,11 @@ from modules.utils import autocomplete_active_events, autocomplete_event_stages
|
||||
async def validate_event_status(
|
||||
ctx: ApplicationContext,
|
||||
event: PycordEvent,
|
||||
) -> None:
|
||||
) -> bool:
|
||||
if event.is_cancelled:
|
||||
# TODO Make a nice message
|
||||
await ctx.respond("This event was cancelled.")
|
||||
return
|
||||
return False
|
||||
|
||||
if (
|
||||
event.starts.replace(tzinfo=ZoneInfo("UTC"))
|
||||
@@ -27,7 +28,9 @@ async def validate_event_status(
|
||||
):
|
||||
# TODO Make a nice message
|
||||
await ctx.respond("Ongoing events cannot be modified.")
|
||||
return
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class Stage(Cog):
|
||||
@@ -75,7 +78,12 @@ class Stage(Cog):
|
||||
await ctx.respond("Event was not found.")
|
||||
return
|
||||
|
||||
await validate_event_status(ctx, pycord_event)
|
||||
if not (await validate_event_status(ctx, pycord_event)):
|
||||
return
|
||||
|
||||
processed_media: List[Dict[str, Any]] = (
|
||||
[] if media is None else await self.bot.process_attachments([media])
|
||||
)
|
||||
|
||||
event_stage: PycordEventStage = await self.bot.create_event_stage(
|
||||
event=pycord_event,
|
||||
@@ -85,7 +93,7 @@ class Stage(Cog):
|
||||
creator_id=ctx.author.id,
|
||||
question=question,
|
||||
answer=answer,
|
||||
media=[] if media is None else [media.id],
|
||||
media=[] if media is None else processed_media,
|
||||
)
|
||||
|
||||
# TODO Make a nice message
|
||||
@@ -140,7 +148,8 @@ class Stage(Cog):
|
||||
await ctx.respond("Event was not found.")
|
||||
return
|
||||
|
||||
await validate_event_status(ctx, pycord_event)
|
||||
if not (await validate_event_status(ctx, pycord_event)):
|
||||
return
|
||||
|
||||
try:
|
||||
event_stage: PycordEventStage = await self.bot.find_event_stage(stage)
|
||||
@@ -154,11 +163,15 @@ class Stage(Cog):
|
||||
await ctx.respond("Stage sequence out of range.")
|
||||
return
|
||||
|
||||
processed_media: List[Dict[str, Any]] = (
|
||||
[] if media is None else await self.bot.process_attachments([media])
|
||||
)
|
||||
|
||||
if not (question is None and answer is None and media is None and remove_media is False):
|
||||
await event_stage.update(
|
||||
question=event_stage.question if question is None else question,
|
||||
answer=event_stage.answer if answer is None else answer,
|
||||
media=[] if remove_media else (event_stage.media if media is None else [media.id]),
|
||||
media=([] if remove_media else (event_stage.media if media is None else processed_media)),
|
||||
)
|
||||
|
||||
if order is not None and order - 1 != event_stage.sequence:
|
||||
@@ -207,7 +220,8 @@ class Stage(Cog):
|
||||
await ctx.respond("Event was not found.")
|
||||
return
|
||||
|
||||
await validate_event_status(ctx, pycord_event)
|
||||
if not (await validate_event_status(ctx, pycord_event)):
|
||||
return
|
||||
|
||||
try:
|
||||
event_stage: PycordEventStage = await self.bot.find_event_stage(stage)
|
||||
|
Reference in New Issue
Block a user