146 lines
4.7 KiB
TypeScript
146 lines
4.7 KiB
TypeScript
import { registerCommand } from "@vendetta/commands";
|
|
import { findByProps } from "@vendetta/metro";
|
|
import { url } from "@vendetta/metro/common";
|
|
import { storage } from "@vendetta/plugin";
|
|
|
|
const messageUtil = findByProps(
|
|
"sendBotMessage",
|
|
"sendMessage",
|
|
"receiveMessage",
|
|
);
|
|
const APIUtils = findByProps("getAPIBaseURL", "get");
|
|
let commands = [];
|
|
|
|
export const onLoad = () => {
|
|
if (!storage?.enabledCommands?.firstmessage) return;
|
|
|
|
commands.push(
|
|
registerCommand({
|
|
name: "firstmessage",
|
|
displayName: "firstmessage",
|
|
description: "Tired of scrolling to first message?",
|
|
displayDescription: "Tired of scrolling to first message?",
|
|
type: 1,
|
|
inputType: 1,
|
|
applicationId: "-1",
|
|
options: [
|
|
{
|
|
name: "user",
|
|
displayName: "user",
|
|
description:
|
|
"Target user to get their first message in this server/dm",
|
|
displayDescription:
|
|
"Target user to get their first message in this server/dm",
|
|
type: 6,
|
|
required: false,
|
|
},
|
|
{
|
|
name: "channel",
|
|
displayName: "channel",
|
|
description: "Target channel to get first message of",
|
|
displayDescription: "Target channel to get first message of",
|
|
type: 7,
|
|
required: false,
|
|
},
|
|
{
|
|
name: "send",
|
|
displayName: "send",
|
|
description: "Whether to send the resulting url",
|
|
displayDescription: "Whether to send the resulting url",
|
|
type: 5,
|
|
required: false,
|
|
},
|
|
],
|
|
async execute(args, ctx) {
|
|
const user = args.find((o: any) => o.name === "user")?.value;
|
|
const channel = args.find((o: any) => o.name === "channel")?.value;
|
|
const send = args.find((o: any) => o.name === "send")?.value;
|
|
|
|
const guildId = ctx.guild?.id;
|
|
const channelId = ctx.channel.id;
|
|
const isDM = ctx.channel.type === 1;
|
|
|
|
let result = "https://discord.com/channels/";
|
|
|
|
try {
|
|
// Handle DM error cases first
|
|
if (isDM && (channel || (user && channel))) {
|
|
messageUtil.sendBotMessage(
|
|
channelId,
|
|
"This combination cannot be used in DMs!",
|
|
);
|
|
return { type: 4 };
|
|
}
|
|
|
|
if (!user && !channel) {
|
|
if (isDM) {
|
|
const message = await getFirstDMMessage(channelId);
|
|
result += `@me/${channelId}/${message.id}`;
|
|
} else {
|
|
const message = await getFirstGuildMessage(guildId);
|
|
result += `${guildId}/${message.channel_id}/${message.id}`;
|
|
}
|
|
} else if (user) {
|
|
if (isDM) {
|
|
const message = await getFirstDMMessage(channelId, user);
|
|
result += `@me/${channelId}/${message.id}`;
|
|
} else {
|
|
const message = await getFirstGuildMessage(guildId, user);
|
|
result += `${guildId}/${message.channel_id}/${message.id}`;
|
|
}
|
|
} else if (channel) {
|
|
const message = await getFirstGuildMessage(guildId, null, channel);
|
|
result += `${guildId}/${channel}/${message.id}`;
|
|
} else {
|
|
const message = await getFirstGuildMessage(guildId, user, channel);
|
|
result += `${guildId}/${channel}/${message.id}`;
|
|
}
|
|
|
|
if (send) {
|
|
messageUtil.sendBotMessage(channelId, result);
|
|
return { type: 4 };
|
|
} else {
|
|
return url.openDeeplink(result);
|
|
}
|
|
} catch (error) {
|
|
messageUtil.sendBotMessage(
|
|
channelId,
|
|
"Failed to fetch the first message. Please try again.",
|
|
);
|
|
return { type: 4 };
|
|
}
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
export const onUnload = () => {
|
|
for (const unregisterCommands of commands) unregisterCommands();
|
|
};
|
|
|
|
const getFirstGuildMessage = async (
|
|
guildId: number,
|
|
userId?: number,
|
|
channelId?: number,
|
|
) => {
|
|
const userParam = userId ? `&author_id=${userId}` : "";
|
|
const channelParam = channelId ? `&channel_id=${channelId}` : "";
|
|
const minIdParam = userId ? "" : `&min_id=0`;
|
|
return (
|
|
await APIUtils.get({
|
|
url: `/guilds/${guildId}/messages/search`,
|
|
query: `include_nsfw=true${userParam}${channelParam}${minIdParam}&sort_by=timestamp&sort_order=asc&offset=0`,
|
|
})
|
|
).body.messages[0][0];
|
|
};
|
|
|
|
const getFirstDMMessage = async (dmId: number, userId?: number) => {
|
|
const userParam = userId ? `&author_id=${userId}` : "";
|
|
const minIdParam = userId ? "" : `&min_id=0`;
|
|
return (
|
|
await APIUtils.get({
|
|
url: `/channels/${dmId}/messages/search`,
|
|
query: `&sort_by=timestamp&sort_order=asc&offset=0${userParam}${minIdParam}`,
|
|
})
|
|
).body.messages[0][0];
|
|
};
|