Update configuration and README for improved setup and security; disable default API and emoji sync, and enhance Discord permission checks in API routes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
TheOnlyMace
2026-07-21 16:00:52 +02:00
commit fdfc8de44d
925 changed files with 75254 additions and 0 deletions

View File

@@ -0,0 +1,152 @@
import discord
from utils.emoji import DELETE, DELETE_ALT1, FORWARD, REWIND
from discord.ext import commands
from datetime import datetime
from utils.Tools import *
class SnipeView(discord.ui.View):
def __init__(self, bot, snipes, user_id):
super().__init__(timeout=120)
self.bot = bot
self.snipes = snipes
self.index = 0
self.user_id = user_id
self.update_buttons()
# def update_buttons(self):
# self.first_button.disabled = self.index == 0 or len(self.snipes) == 1
# self.prev_button.disabled = self.index == 0 or len(self.snipes) == 1
# self.next_button.disabled = self.index == len(self.snipes) - 1 or len(self.snipes) == 1
# self.last_button.disabled = self.index == len(self.snipes) - 1 or len(self.snipes) == 1
# async def send_snipe_embed(self, interaction: discord.Interaction):
# snipe = self.snipes[self.index]
# embed = discord.Embed(color=0xFF0000)
# embed.set_author(name=f"Deleted Message {self.index + 1}/{len(self.snipes)}", icon_url=snipe['author_avatar'])
# uid = snipe['author_id']
# display_name = snipe['author_name']
# embed.description = (
# f"**Author:** **[{display_name}](https://discord.com/users/{uid})**\n"
# f" **Author ID:** `{snipe['author_id']}`\n"
# f" **Author Mention:** <@{snipe['author_id']}>\n"
# f"**Deleted:** <t:{snipe['deleted_at']}:R>\n"
# )
# if snipe['content']:
# embed.add_field(name=f"{DELETE} **Content:**", value=snipe['content'])
# if snipe['attachments']:
# attachment_links = "\n".join([f"[{attachment['name']}]({attachment['url']})" for attachment in snipe['attachments']])
# embed.add_field(name="**Attachments:**", value=attachment_links)
# embed.set_footer(text=f"Total Deleted Messages: {len(self.snipes)} | Requested by {interaction.user}", icon_url=interaction.user.avatar.url)
# await interaction.response.edit_message(embed=embed, view=self)
#async def interaction_check(self, interaction: discord.Interaction) -> bool:
# return interaction.user.id == self.user_id
# @discord.ui.button(emoji=FORWARD, style=discord.ButtonStyle.secondary, custom_id="first")
# async def first_button(self, interaction: discord.Interaction, button: discord.ui.Button):
# self.index = 0
# self.update_buttons()
# await self.send_snipe_embed(interaction)
#@discord.ui.button(emoji=REWIND, style=discord.ButtonStyle.secondary, custom_id="previous")
# async def prev_button(self, interaction: discord.Interaction, button: discord.ui.Button):
# if self.index > 0:
# self.index -= 1
# self.update_buttons()
# await self.send_snipe_embed(interaction)
# @discord.ui.button(emoji=DELETE, style=discord.ButtonStyle.danger, custom_id="delete")
# async def delete_button(self, interaction: discord.Interaction, button: discord.ui.Button):
# await interaction.message.delete()
# @discord.ui.button(emoji=FORWARD, style=discord.ButtonStyle.secondary, custom_id="next")
# async def next_button(self, interaction: discord.Interaction, button: discord.ui.Button):
# if self.index < len(self.snipes) - 1:
# self.index += 1
# self.update_buttons()
# await self.send_snipe_embed(interaction)
# @discord.ui.button(emoji=REWIND, style=discord.ButtonStyle.secondary, custom_id="last")
# async def last_button(self, interaction: discord.Interaction, button: discord.ui.Button):
# self.index = len(self.snipes) - 1
# self.update_buttons()
# await self.send_snipe_embed(interaction)
#async def on_timeout(self):
# for child in self.children:
# child.disabled = True
# await self.message.edit(view=self)
class Snipe(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.snipes = {}
@commands.Cog.listener()
async def on_message_delete(self, message):
if not message.guild or message.author.bot:
return
if message.channel.id not in self.snipes:
self.snipes[message.channel.id] = []
if len(self.snipes[message.channel.id]) >= 10:
self.snipes[message.channel.id].pop(0)
attachments = []
if message.attachments:
attachments = [{'name': attachment.filename, 'url': attachment.url} for attachment in message.attachments]
self.snipes[message.channel.id].insert(0, {
'author_name': message.author.name,
'author_avatar': message.author.display_avatar.url,
'author_id': message.author.id,
'content': message.content or None,
'deleted_at': int(datetime.utcnow().timestamp()),
'attachments': attachments
})
@commands.hybrid_command(name='snipe', help="Shows the recently deleted messages in the channel.")
@blacklist_check()
@ignore_check()
@commands.cooldown(1, 3, commands.BucketType.user)
@commands.has_permissions(manage_messages=True)
async def snipe(self, ctx):
channel_snipes = self.snipes.get(ctx.channel.id, [])
if not channel_snipes:
await ctx.send("No recently deleted messages found in this channel.")
return
first_snipe = channel_snipes[0]
embed = discord.Embed(color=0xFF0000)
embed.set_author(name="Last Deleted Message", icon_url=first_snipe['author_avatar'])
uid = first_snipe['author_id']
display_name = first_snipe['author_name']
embed.description = (
f" **Author:** **[{display_name}](https://discord.com/users/{uid})**\n"
f"**Author ID:** `{first_snipe['author_id']}`\n"
f"**Author Mention:** <@{first_snipe['author_id']}>\n"
f" **Deleted:** <t:{first_snipe['deleted_at']}:R>\n"
)
if first_snipe['content']:
embed.add_field(name=f"{DELETE_ALT1} **Content:**", value=first_snipe['content'])
if first_snipe['attachments']:
attachment_links = "\n".join([f"[{attachment['name']}]({attachment['url']})" for attachment in first_snipe['attachments']])
embed.add_field(name="**Attachments:**", value=attachment_links)
embed.set_footer(text=f"Total Deleted Messages: {len(channel_snipes)} | Requested by {ctx.author}", icon_url=ctx.author.avatar.url)
view = SnipeView(self.bot, channel_snipes, ctx.author.id)
if len(channel_snipes) > 1:
message = await ctx.send(embed=embed, view=view)
view.message = message
# else:
# view.first_button.disabled = True
# view.prev_button.disabled = True
# view.next_button.disabled = True
# view.last_button.disabled = True
message = await ctx.send(embed=embed, view=view)
view.message = message