zappyzep/backend/src/utils/resolveMessageTarget.ts
2020-08-06 01:10:40 +03:00

58 lines
1.5 KiB
TypeScript

import { disableInlineCode, isSnowflake } from "../utils";
import { getChannelIdFromMessageId } from "../data/getChannelIdFromMessageId";
import { PluginData, TypeConversionError } from "knub";
import { TextChannel } from "eris";
const channelAndMessageIdRegex = /^(\d+)[\-\/](\d+)$/;
const messageLinkRegex = /^https:\/\/(?:\w+\.)?discord(?:app)?\.com\/channels\/\d+\/(\d+)\/(\d+)$/i;
export interface MessageTarget {
channel: TextChannel;
messageId: string;
}
export async function resolveMessageTarget(pluginData: PluginData<any>, value: string) {
const result = await (async () => {
if (isSnowflake(value)) {
const channelId = await getChannelIdFromMessageId(value);
if (!channelId) {
return null;
}
return {
channelId,
messageId: value,
};
}
const channelAndMessageIdMatch = value.match(channelAndMessageIdRegex);
if (channelAndMessageIdMatch) {
return {
channelId: channelAndMessageIdMatch[1],
messageId: channelAndMessageIdMatch[2],
};
}
const messageLinkMatch = value.match(messageLinkRegex);
if (messageLinkMatch) {
return {
channelId: messageLinkMatch[1],
messageId: messageLinkMatch[2],
};
}
})();
if (!result) {
return null;
}
const channel = pluginData.guild.channels.get(result.channelId);
if (!channel || !(channel instanceof TextChannel)) {
return null;
}
return {
channel,
messageId: result.messageId,
};
}