Files
WheatlyBot/cogs/react_roles.py
2025-03-30 17:34:47 +10:00

88 lines
3.6 KiB
Python

import os
import uuid
import discord
from discord.ext import commands
from data import react_roles as db_react_roles
from react_roles import react_roles as rr
from util.console import console, panel, track_iterable as track
GUILD_IDS = [int(os.getenv("DEV_GUILD_ID"))]
# Description of the reaction message cache
reaction_message_descriptions_cache = {}
async def check_server_instantiated(ctx: discord.ApplicationContext):
"""
Check if the server has been instantiated.
"""
if not db_react_roles.guild_exists(ctx.guild.id):
await ctx.send("Server not instantiated. Please run the `/instantiate_server` command first.")
return False
return True
class ReactRoles(commands.Cog):
def __init__(self, bot):
self.bot = bot
### COMMANDS ###
# Command to create a new reaction role message
@commands.slash_command(name="new_reaction_message", description="Create a new reaction message", guild_ids=GUILD_IDS)
@commands.has_permissions(manage_roles=True)
async def new_reaction_message(self, ctx: discord.ApplicationContext, description: str, thumbnail_url: str = None):
# Check if server has been instantiated
await check_server_instantiated(ctx)
# Since we can't get the message ID until we send the message, but need to display in the message itself
# some kind of unique identifier, we will create a UUID to display in the message, send the message, and then
# add it all to the database.
# Send Message to Channel - Must happen first so that we can get the message ID for the database
unique_id = str(uuid.uuid4())
embed = rr.generate_reaction_message_embed(description, thumbnail_url, unique_id)
message = await ctx.channel.send(embed=embed)
# Add the reaction_message to the database
db_react_roles.check_and_add_reaction_message(unique_id, ctx.guild.id, ctx.channel.id, message.id, description, thumbnail_url)
# Ensure the message was put in the database correctly, otherwise delete the message
if not db_react_roles.reaction_message_exists(ctx.guild.id, ctx.channel.id, message.id):
await message.delete()
await ctx.respond("Failed to create the reaction message. Please try again.", ephemeral=True)
return
await ctx.respond(f"Reaction message created successfully!", ephemeral=True)
@commands.slash_command(name="delete_reaction_message", description="Delete a reaction message", guild_ids=GUILD_IDS)
@commands.has_permissions(manage_roles=True)
async def delete_reaction_message(self, ctx: discord.ApplicationContext,
reaction_role_id: str):
# Check if server has been instantiated
await check_server_instantiated(ctx)
# Check if the message ID is in the database
message = db_react_roles.get_reaction_message_by_uuid(reaction_role_id)
if not message:
await ctx.respond("That Reaction Role ID does not exist", ephemeral=True)
return
if message[2] != ctx.guild.id:
await ctx.respond("That Reaction Role ID does not exist in this server", ephemeral=True)
return
# Delete the message from the channel
channel = message[3]
message = await self.bot.get_channel(channel).fetch_message(int(message_id))
await message.delete()
# Delete the message from the database
db_react_roles.delete_reaction_message_from_db(int(message_id))
# Send confirmation message
await ctx.respond(f"Reaction message deleted successfully!", ephemeral=True)
def setup(bot):
bot.add_cog(ReactRoles(bot))