diff --git a/src/plugins/moyai.ts b/src/plugins/moyai.ts new file mode 100644 index 00000000..7e629fcb --- /dev/null +++ b/src/plugins/moyai.ts @@ -0,0 +1,82 @@ +import definePlugin from "../utils/types"; +import { Devs } from "../utils/constants"; +import { Message } from "discord-types/general"; + +interface IMessageCreate { + type: "MESSAGE_CREATE"; + channelId: string; + isPushNotification: boolean; + optimistic: boolean; + message: Message; +} + +const MOYAI_URL = + "https://github.com/MeguminSama/VencordPlugins/raw/main/plugins/moyai/moyai.mp3"; + +export default definePlugin({ + name: "Moyai", + authors: [Devs.Megu], + description: "🗿🗿🗿🗿🗿🗿🗿🗿", + execute: async (event: IMessageCreate) => { + if (event?.type !== "MESSAGE_CREATE") return; + if (!event.message?.content) return; + if (event.message.state === "SENDING") return; + if (event.optimistic) return; + + const isInGuildChannel = + window.location.pathname.startsWith("/channels/"); + if (!isInGuildChannel) return; + + const channelId = window.location.pathname.split("/")[3]; + if (!channelId || channelId !== event.channelId) return; + + const moyaiCount = messageContainsMoyai(event.message.content); + if (!moyaiCount) return; + + for (let i = 0; i < moyaiCount; i++) { + const audioElement = document.createElement("audio"); + audioElement.src = MOYAI_URL; + audioElement.play(); + await new Promise(resolve => setTimeout(resolve, 300)); + } + }, + patches: [ + { + find: "MESSAGE_CREATE:function(", + replacement: [ + { + match: /MESSAGE_CREATE:function\((\w+)\){/, + replace: + "MESSAGE_CREATE:function($1){Vencord.Plugins.plugins.Moyai.execute($1);", + }, + ], + }, + ], +}); + +const EMOJI_NAME_REGEX = //g; + +function messageContainsMoyai(message: string): number { + // get number of 🗿 in a string + let moyaiCount = (message.match(/🗿/g) || []).length; + + // get number of emojis in message that are called "moyai" or "moai" + const emojiNames = message.matchAll(EMOJI_NAME_REGEX); + + if (emojiNames) { + for (const emojiName of emojiNames) { + if (!emojiName[1]) continue; + let name = emojiName[1]; + + // If emoji starts or ends with (moyai|moai) + if (/^(moyai|moai)/i.test(name) || /(moyai|moai)$/i.test(name)) { + moyaiCount++; + } + } + } + + // Maximum moyai... + if (moyaiCount > 10) moyaiCount = 10; + + return moyaiCount; +}