Files
muzovkant-cogdump/cogs/potd/potd.py
2026-05-04 11:12:03 +00:00

89 lines
2.7 KiB
Python

import logging
import aiohttp
import json
import os
from datetime import date
from discord.ext import commands
import discord
logger = logging.getLogger(__name__)
_config_path = os.path.join(os.path.dirname(__file__), "config.json")
with open(_config_path, encoding="utf-8") as f:
_config = json.load(f)
HEADERS = {
"User-Agent": _config.get("user_agent", "muzovkantBot/1.0"),
"Accept": "application/json",
}
async def fetch_potd(target_date: str):
year, month, day = target_date.split("-")
url = f"https://en.wikipedia.org/api/rest_v1/feed/featured/{year}/{month}/{day}"
async with aiohttp.ClientSession(headers=HEADERS) as session:
async with session.get(url) as r:
if r.status == 404:
logger.warning(f"No featured content for {target_date}")
return None
if r.status != 200:
logger.error(f"Wikimedia REST API returned {r.status}")
return None
data = await r.json()
if "image" not in data:
logger.warning(f"No image in featured content for {target_date}")
return None
image = data["image"]
return {
"title": image.get("title", ""),
"description": image.get("description", {}).get("text", ""),
"url": image["image"]["source"],
"date": target_date,
}
class PotdCog(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
logger.info("POTD cog loaded successfully")
@commands.command(name="potd")
async def potd(self, ctx: commands.Context, target_date: str = None):
if target_date is None:
target_date = date.today().isoformat()
try:
date.fromisoformat(target_date)
except ValueError:
await ctx.send("Invalid date format. Preferred format is YYYY-MM-DD")
return
async with ctx.typing():
try:
potd = await fetch_potd(target_date)
except Exception as e:
logger.error(f"Error occurred while fetching POTD: {e}")
await ctx.send("Failed to retrieve data from Wikipedia")
return
if potd is None:
await ctx.send(f"Picture of the day for `{target_date}` not found")
return
embed = discord.Embed(
title=f"Picture of the Day ({potd['date']})",
description=potd["description"] or potd["title"],
color=0x3498db,
)
embed.set_image(url=potd["url"])
embed.set_footer(text="Source: Wikipedia")
await ctx.send(embed=embed)
async def setup(bot: commands.Bot):
await bot.add_cog(PotdCog(bot))