From 9bcc42b020f995109f002ca7c8ebaff3adb6c72f Mon Sep 17 00:00:00 2001 From: Taken Date: Fri, 12 Jan 2024 17:59:20 +0100 Subject: [PATCH] Updated import --- src/commands/snipe.ts | 75 ++++++++++++++++++++++++ src/events/server/messages/snipecache.ts | 37 ++++++++++++ src/schemas/snipeCacheSchema.ts | 11 ++++ src/utils/Client.ts | 2 +- src/utils/Types.ts | 8 +++ 5 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/commands/snipe.ts create mode 100644 src/events/server/messages/snipecache.ts create mode 100644 src/schemas/snipeCacheSchema.ts create mode 100644 src/utils/Types.ts diff --git a/src/commands/snipe.ts b/src/commands/snipe.ts new file mode 100644 index 0000000..53a3e12 --- /dev/null +++ b/src/commands/snipe.ts @@ -0,0 +1,75 @@ +import { GuildMember, SlashCommandBuilder } from "discord.js" +import snipeCacheSchema from "../schemas/snipeCacheSchema" +import Command from "../interfaces/Command" +import { color } from "../../config/options.json" +import { SnipeCache } from "../utils/Types" + +export = { + name: "snipe", + description: "Snipes the last deleted message of a user", + type: "slash", + public: true, + dev: false, + + data: new SlashCommandBuilder() + .setName("snipe") + .setDescription("Snipes the last deleted message of a user") + .addUserOption(option => + option + .setName("user") + .setDescription("The user to snipe") + .setRequired(true)) + .setDMPermission(false), + + async execute(interaction) { + await interaction.deferReply() + const member = interaction.options.getMember("user") as GuildMember + const snipeCache = await snipeCacheSchema.find({ + userid: member.user.id, + channelid: interaction.channel!.id + }) + const embedColor = Number(color.replace("#", "0x")) + const messages: string[] = [] + + if (!snipeCache.length) { + await interaction.editReply({ + embeds: [{ + description: "No messages to snipe", + color: embedColor + }] + }) + return + } + + let i = 1 + for (const msg of snipeCache) { + const data: SnipeCache = msg.data + if (!data.attachments.length) { + messages.push(`**Message #${i}:** ${data.content}\n`) + } else { + messages.push(`**Message #${i}:** ${data.content}`) + messages.push(`**Attachments:** ${data.attachments.join(", ")}\n`) + } + i++ + } + + await interaction.editReply({ + embeds: [{ + author: { + name: member.user.username, + icon_url: member.user.avatarURL() || undefined + }, + description: messages.join("\n"), + thumbnail: { + url: member.user.avatarURL() || "" + }, + color: embedColor, + footer: { + text: "ID: " + member.user.id, + icon_url: interaction.guild!.iconURL() || undefined + }, + timestamp: new Date().toISOString() + }] + }) + } +} as Command \ No newline at end of file diff --git a/src/events/server/messages/snipecache.ts b/src/events/server/messages/snipecache.ts new file mode 100644 index 0000000..bcd0bc2 --- /dev/null +++ b/src/events/server/messages/snipecache.ts @@ -0,0 +1,37 @@ +import { ChannelType, Message } from "discord.js" +import { Event } from "../../../interfaces" +import snipeCacheSchema from "../../../schemas/snipeCacheSchema" +import mongoose from "mongoose" +import { SnipeCache } from "../../../utils/Types" +import env from "../../../utils/Env" + +export = { + name: "snipecache", + description: "Logs messages for the snipe command", + type: "event", + event: "messageDelete", + + async execute(message: Message) { + if (message.channel.type !== ChannelType.GuildText) return + if (message.author.bot) return + if (message.author.id !== env.prod.dev) return + + const msg: SnipeCache = { + author: message.author.id, + content: message.content, + channel: message.channel.id, + createdAt: message.createdTimestamp, + deletedAt: Date.now(), + attachments: message.attachments.map(a => a.url) || [], + } + + const snipeCache = new snipeCacheSchema({ + _id: new mongoose.Types.ObjectId, + userid: message.author.id, + channelid: message.channel.id, + data: msg, + }) + + await snipeCache.save() + } +} as Event \ No newline at end of file diff --git a/src/schemas/snipeCacheSchema.ts b/src/schemas/snipeCacheSchema.ts new file mode 100644 index 0000000..410e61c --- /dev/null +++ b/src/schemas/snipeCacheSchema.ts @@ -0,0 +1,11 @@ +import { model, Schema } from "mongoose" + +const snipeCacheSchema = new Schema({ + _id: Schema.Types.ObjectId, + userid: { type: String, required: true }, + channelid: { type: String, required: true }, + data: { type: Object, required: true }, + date: { type: Date, default: Date.now(), expires: 600 } +}) + +export default model("snipeCache", snipeCacheSchema, "snipeCache") \ No newline at end of file diff --git a/src/utils/Client.ts b/src/utils/Client.ts index ff81027..20af18d 100644 --- a/src/utils/Client.ts +++ b/src/utils/Client.ts @@ -5,7 +5,7 @@ import { Button } from "../interfaces" import { Modal } from "../interfaces" import { Autocomplete } from "../interfaces" import env from "./Env" -import { autoDeployCommands } from "./Autodeploy" +import autoDeployCommands from "./Autodeploy" import { loadAllEvents } from "./Events" export class ExtendedClient extends Client { diff --git a/src/utils/Types.ts b/src/utils/Types.ts new file mode 100644 index 0000000..2cbf5e8 --- /dev/null +++ b/src/utils/Types.ts @@ -0,0 +1,8 @@ +export type SnipeCache = { + author: string + content: string + channel: string + createdAt: number + deletedAt: number + attachments: string[] +} \ No newline at end of file