diff --git a/src/plugins/onePingPerDM/index.ts b/src/plugins/onePingPerDM/index.ts index 47502ebe..e69620ae 100644 --- a/src/plugins/onePingPerDM/index.ts +++ b/src/plugins/onePingPerDM/index.ts @@ -4,20 +4,44 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; -import { ChannelStore, ReadStateStore } from "@webpack/common"; -import { Message } from "discord-types/general"; +import definePlugin, { OptionType } from "@utils/types"; +import { ChannelStore, ReadStateStore, UserStore } from "@webpack/common"; +import { MessageJSON } from "discord-types/general"; const enum ChannelType { DM = 1, GROUP_DM = 3 } +const settings = definePluginSettings({ + channelToAffect: { + type: OptionType.SELECT, + description: "Select the type of DM for the plugin to affect", + options: [ + { label: "Both", value: "both_dms", default: true }, + { label: "User DMs", value: "user_dm" }, + { label: "Group DMs", value: "group_dm" }, + ] + }, + allowMentions: { + type: OptionType.BOOLEAN, + description: "Receive audio pings for @mentions", + default: false, + }, + allowEveryone: { + type: OptionType.BOOLEAN, + description: "Receive audio pings for @everyone and @here in group DMs", + default: false, + }, +}); + export default definePlugin({ name: "OnePingPerDM", description: "If unread messages are sent by a user in DMs multiple times, you'll only receive one audio ping. Read the messages to reset the limit", authors: [Devs.ProffDea], + settings, patches: [{ find: ".getDesktopType()===", replacement: [{ @@ -29,11 +53,19 @@ export default definePlugin({ replace: "sound:!$self.isPrivateChannelRead(arguments[0]?.message)?undefined:$1" }] }], - isPrivateChannelRead(message: Message) { + isPrivateChannelRead(message: MessageJSON) { const channelType = ChannelStore.getChannel(message.channel_id)?.type; if (channelType !== ChannelType.DM && channelType !== ChannelType.GROUP_DM) { return false; } + if ( + (channelType === ChannelType.DM && settings.store.channelToAffect === "group_dm") || + (channelType === ChannelType.GROUP_DM && settings.store.channelToAffect === "user_dm") || + (settings.store.allowMentions && message.mentions.some(m => m.id === UserStore.getCurrentUser().id)) || + (settings.store.allowEveryone && message.mention_everyone) + ) { + return true; + } return ReadStateStore.getOldestUnreadMessageId(message.channel_id) === message.id; }, });