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:
152
bot/cogs/moderation/snipe.txt
Normal file
152
bot/cogs/moderation/snipe.txt
Normal 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
|
||||
Reference in New Issue
Block a user