calendar / to ! prefix
This commit is contained in:
1 parent
9c4fb421dd
commit
d944064091
1 file changed
+20
-18
+20
-18
@@ -6,7 +6,6 @@ from datetime import datetime, timezone, timedelta
|
|||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import discord
|
import discord
|
||||||
from discord import app_commands
|
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
|
||||||
from .calendar_data import COUNTRY_TZ
|
from .calendar_data import COUNTRY_TZ
|
||||||
@@ -21,11 +20,6 @@ FIRESTORE_CALENDAR = (
|
|||||||
DATE_RE = re.compile(r"^\d{2}-\d{2}-\d{4}$")
|
DATE_RE = re.compile(r"^\d{2}-\d{2}-\d{4}$")
|
||||||
TIME_RE = re.compile(r"^\d{2}:\d{2}$")
|
TIME_RE = re.compile(r"^\d{2}:\d{2}$")
|
||||||
|
|
||||||
# Default timezone: South Africa (UTC+2)
|
|
||||||
DEFAULT_COUNTRY = "South Africa"
|
|
||||||
DEFAULT_TITLE = "Demo Review"
|
|
||||||
|
|
||||||
|
|
||||||
def _find_offset(country: str) -> float | None:
|
def _find_offset(country: str) -> float | None:
|
||||||
"""Look up a country's UTC offset. Case-insensitive fuzzy match."""
|
"""Look up a country's UTC offset. Case-insensitive fuzzy match."""
|
||||||
c = country.strip().lower()
|
c = country.strip().lower()
|
||||||
@@ -141,23 +135,31 @@ class BookModal(discord.ui.Modal, title="Book an Event"):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BookButton(discord.ui.View):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(timeout=300)
|
||||||
|
|
||||||
|
@discord.ui.button(label="Book an Event", style=discord.ButtonStyle.primary, emoji="📅")
|
||||||
|
async def open_modal(self, interaction: discord.Interaction, _button):
|
||||||
|
await interaction.response.send_modal(BookModal())
|
||||||
|
|
||||||
|
|
||||||
class Calendar(commands.Cog):
|
class Calendar(commands.Cog):
|
||||||
"""Book events via a popup form."""
|
"""Book events via a popup form."""
|
||||||
|
|
||||||
def __init__(self, bot: commands.Bot) -> None:
|
def __init__(self, bot: commands.Bot) -> None:
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@app_commands.command(name="book", description="Open a form to add a calendar event")
|
@commands.command(name="book")
|
||||||
async def book_cmd(self, interaction: discord.Interaction) -> None:
|
async def book_cmd(self, ctx: commands.Context) -> None:
|
||||||
await interaction.response.send_modal(BookModal())
|
"""Send a button that opens the booking form."""
|
||||||
|
await ctx.reply("Click below to book an event:", view=BookButton())
|
||||||
@app_commands.command(name="unbook", description="Remove an event")
|
|
||||||
@app_commands.describe(date="Date (DD-MM-YYYY)", title="Exact title to remove")
|
|
||||||
async def unbook_cmd(self, interaction: discord.Interaction, date: str, title: str) -> None:
|
|
||||||
await interaction.response.defer(ephemeral=True)
|
|
||||||
|
|
||||||
|
@commands.command(name="unbook")
|
||||||
|
async def unbook_cmd(self, ctx: commands.Context, date: str = "", *, title: str = "") -> None:
|
||||||
|
"""Remove an event. Usage: !unbook DD-MM-YYYY Title"""
|
||||||
if not DATE_RE.match(date) or not title.strip():
|
if not DATE_RE.match(date) or not title.strip():
|
||||||
return await interaction.followup.send("Usage: /unbook date:20-07-2026 title:Demo Review")
|
return await ctx.reply("Usage: `!unbook 20-07-2026 Demo Review`")
|
||||||
|
|
||||||
day, month, year = date.split("-")
|
day, month, year = date.split("-")
|
||||||
iso_date = f"{year}-{month}-{day}"
|
iso_date = f"{year}-{month}-{day}"
|
||||||
@@ -166,7 +168,7 @@ class Calendar(commands.Cog):
|
|||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as session:
|
||||||
async with session.get(FIRESTORE_CALENDAR) as resp:
|
async with session.get(FIRESTORE_CALENDAR) as resp:
|
||||||
if resp.status != 200:
|
if resp.status != 200:
|
||||||
return await interaction.followup.send("Could not fetch events.")
|
return await ctx.reply("Could not fetch events.")
|
||||||
data = await resp.json()
|
data = await resp.json()
|
||||||
|
|
||||||
for doc in data.get("documents", []):
|
for doc in data.get("documents", []):
|
||||||
@@ -181,9 +183,9 @@ class Calendar(commands.Cog):
|
|||||||
break
|
break
|
||||||
|
|
||||||
if deleted:
|
if deleted:
|
||||||
await interaction.followup.send(f"Removed **{title}** from {date}.")
|
await ctx.reply(f"Removed **{title}** from {date}.")
|
||||||
else:
|
else:
|
||||||
await interaction.followup.send(f"No event **{title}** found on {date}.")
|
await ctx.reply(f"No event **{title}** found on {date}.")
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: commands.Bot) -> None:
|
async def setup(bot: commands.Bot) -> None:
|
||||||
|
|||||||
Reference in new issue
Block a user