2025-10-04 12:29:01 -04:00
|
|
|
import asyncio
|
|
|
|
|
import os
|
|
|
|
|
import tempfile
|
|
|
|
|
import discord
|
|
|
|
|
from discord.ext import commands
|
2025-10-04 18:43:06 -04:00
|
|
|
import aiohttp
|
2025-10-04 12:29:01 -04:00
|
|
|
import random
|
|
|
|
|
|
|
|
|
|
def mcquote_command():
|
|
|
|
|
@commands.hybrid_command(
|
|
|
|
|
name="mcquote",
|
|
|
|
|
description="Generate a custom Minecraft quote image.",
|
|
|
|
|
)
|
|
|
|
|
@commands.cooldown(1, 10, commands.BucketType.user)
|
|
|
|
|
async def mcquote(self, context, *, text: str = None):
|
2025-10-20 11:57:49 -04:00
|
|
|
if isinstance(context.channel, discord.DMChannel):
|
|
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Error",
|
|
|
|
|
description="This command can only be used in servers.",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
|
|
|
|
interaction = getattr(context, "interaction", None)
|
|
|
|
|
if interaction is not None:
|
|
|
|
|
if not interaction.response.is_done():
|
|
|
|
|
await interaction.response.send_message(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await context.send(embed=embed, ephemeral=True)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if isinstance(context.channel, discord.PartialMessageable):
|
|
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Error",
|
2025-10-20 12:21:43 -04:00
|
|
|
description="The bot needs the `send messages` permission in this channel.",
|
2025-10-20 11:57:49 -04:00
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
|
|
|
|
interaction = getattr(context, "interaction", None)
|
|
|
|
|
if interaction is not None:
|
|
|
|
|
if not interaction.response.is_done():
|
|
|
|
|
await interaction.response.send_message(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await context.send(embed=embed, ephemeral=True)
|
|
|
|
|
return
|
|
|
|
|
|
2025-10-04 12:29:01 -04:00
|
|
|
if not text:
|
2025-10-20 11:57:49 -04:00
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Error",
|
|
|
|
|
description="Please provide text for the Minecraft quote.",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
|
|
|
|
interaction = getattr(context, "interaction", None)
|
|
|
|
|
if interaction is not None:
|
|
|
|
|
if not interaction.response.is_done():
|
|
|
|
|
await interaction.response.send_message(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await context.send(embed=embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if len(text) > 25:
|
2025-10-20 11:57:49 -04:00
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Error",
|
|
|
|
|
description="Text must be 25 characters or less.",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
|
|
|
|
interaction = getattr(context, "interaction", None)
|
|
|
|
|
if interaction is not None:
|
|
|
|
|
if not interaction.response.is_done():
|
|
|
|
|
await interaction.response.send_message(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await context.send(embed=embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
return
|
|
|
|
|
|
2025-10-20 11:57:49 -04:00
|
|
|
processing_embed = discord.Embed(
|
|
|
|
|
title="Minecraft Quote (Processing)",
|
|
|
|
|
description="<a:mariospin:1423677027013103709> Generating quote... This may take a moment.",
|
|
|
|
|
color=0x7289DA,
|
|
|
|
|
)
|
|
|
|
|
processing_embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
2025-10-04 12:29:01 -04:00
|
|
|
interaction = getattr(context, "interaction", None)
|
|
|
|
|
if interaction is not None:
|
|
|
|
|
if not interaction.response.is_done():
|
2025-10-20 11:57:49 -04:00
|
|
|
await interaction.response.send_message(embed=processing_embed, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await interaction.followup.send(embed=processing_embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
else:
|
|
|
|
|
processing_msg = await context.send(embed=processing_embed)
|
|
|
|
|
|
|
|
|
|
quote_text = text.replace(" ", "+")
|
|
|
|
|
random_number = random.randint(1, 39)
|
|
|
|
|
mc_quote_url = f'https://skinmc.net/achievement/{random_number}/Achievement+Unlocked!/{quote_text}'
|
|
|
|
|
|
|
|
|
|
try:
|
2025-10-04 18:43:06 -04:00
|
|
|
async with aiohttp.ClientSession() as session:
|
|
|
|
|
async with session.get(mc_quote_url) as response:
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
content = await response.read()
|
2025-10-04 12:29:01 -04:00
|
|
|
|
|
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as temp_file:
|
2025-10-04 18:43:06 -04:00
|
|
|
temp_file.write(content)
|
2025-10-04 12:29:01 -04:00
|
|
|
temp_file_path = temp_file.name
|
|
|
|
|
|
|
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Minecraft Quote",
|
|
|
|
|
color=0x7289DA,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
embed.set_footer(text=f"Requested by {context.author.name}", icon_url=context.author.display_avatar.url)
|
|
|
|
|
|
|
|
|
|
with open(temp_file_path, 'rb') as f:
|
|
|
|
|
file = discord.File(f, filename="mcquote.png")
|
|
|
|
|
|
2025-10-20 11:57:49 -04:00
|
|
|
interaction = getattr(context, "interaction", None)
|
2025-10-04 12:29:01 -04:00
|
|
|
if interaction is not None:
|
2025-10-20 11:57:49 -04:00
|
|
|
try:
|
2025-10-20 12:21:43 -04:00
|
|
|
await context.channel.send(embed=embed)
|
|
|
|
|
await context.channel.send(file=file)
|
|
|
|
|
try:
|
|
|
|
|
await interaction.delete_original_response()
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
except discord.Forbidden:
|
|
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Permission Error",
|
|
|
|
|
description="The bot needs the `send messages` permission to execute this command.",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
|
|
|
|
return
|
2025-10-04 12:29:01 -04:00
|
|
|
else:
|
2025-10-20 12:21:43 -04:00
|
|
|
try:
|
|
|
|
|
await processing_msg.delete()
|
|
|
|
|
await context.channel.send(embed=embed)
|
|
|
|
|
await context.channel.send(file=file)
|
|
|
|
|
except discord.Forbidden:
|
|
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Permission Error",
|
|
|
|
|
description="The bot needs the `send messages` permission to execute this command.",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
await context.send(embed=embed, ephemeral=True)
|
|
|
|
|
return
|
2025-10-04 12:29:01 -04:00
|
|
|
|
|
|
|
|
os.remove(temp_file_path)
|
2025-10-04 18:43:06 -04:00
|
|
|
except aiohttp.ClientError:
|
2025-10-20 11:57:49 -04:00
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Error",
|
|
|
|
|
description="Failed to generate Minecraft quote. Please try again later.",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
|
|
|
|
interaction = getattr(context, "interaction", None)
|
2025-10-04 12:29:01 -04:00
|
|
|
if interaction is not None:
|
2025-10-20 11:57:49 -04:00
|
|
|
try:
|
|
|
|
|
await interaction.delete_original_response()
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
else:
|
|
|
|
|
await processing_msg.delete()
|
2025-10-20 11:57:49 -04:00
|
|
|
await context.send(embed=embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
except Exception as e:
|
2025-10-20 11:57:49 -04:00
|
|
|
embed = discord.Embed(
|
|
|
|
|
title="Error",
|
|
|
|
|
description=f"An unexpected error occurred: {str(e)}",
|
|
|
|
|
color=0xE02B2B,
|
|
|
|
|
)
|
|
|
|
|
embed.set_author(name="Media", icon_url="https://yes.nighty.works/raw/y5SEZ9.webp")
|
|
|
|
|
|
|
|
|
|
interaction = getattr(context, "interaction", None)
|
2025-10-04 12:29:01 -04:00
|
|
|
if interaction is not None:
|
2025-10-20 11:57:49 -04:00
|
|
|
try:
|
|
|
|
|
await interaction.delete_original_response()
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
await interaction.followup.send(embed=embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
else:
|
|
|
|
|
await processing_msg.delete()
|
2025-10-20 11:57:49 -04:00
|
|
|
await context.send(embed=embed, ephemeral=True)
|
2025-10-04 12:29:01 -04:00
|
|
|
|
2025-10-20 11:57:49 -04:00
|
|
|
return mcquote
|