From 3bf81ee0fad4c650fb343c70f5fab2f18f795fb1 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Wed, 22 Feb 2023 03:42:19 +0000 Subject: [PATCH] make each notification type toggleable --- src/plugins/relationshipNotifier.ts | 123 +++++++++++++++++++++++----- 1 file changed, 104 insertions(+), 19 deletions(-) diff --git a/src/plugins/relationshipNotifier.ts b/src/plugins/relationshipNotifier.ts index 75ea739d..d973f158 100644 --- a/src/plugins/relationshipNotifier.ts +++ b/src/plugins/relationshipNotifier.ts @@ -17,8 +17,9 @@ */ import { showNotification } from "@api/Notifications"; +import { definePluginSettings } from "@api/settings"; import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; +import definePlugin, { OptionType } from "@utils/types"; import { FluxDispatcher, UserUtils } from "@webpack/common"; import { User } from "discord-types/general"; @@ -42,6 +43,100 @@ interface RelationshipPayload { }; } +const settings = definePluginSettings({ + friend: { + type: OptionType.SELECT, + description: "Show a notification when a friend is added or removed", + options: [{ + label: "Friend added and removed", + value: "ALL", + default: true, + }, { + label: "Only When added", + value: "CREATE", + }, { + label: "Only when removed", + value: "REMOVE", + }, { + label: "No notifications", + value: "NONE", + }] + }, + outgoingRequest: { + type: OptionType.SELECT, + description: "Show a notification when you send or cancel a friend request", + options: [{ + label: "Request sent and cancelled", + value: "ALL", + default: true, + }, { + label: "Only when sent", + value: "CREATE", + }, { + label: "Only when cancelled", + value: "REMOVE", + }, { + label: "No notifications", + value: "NONE", + }] + }, + incomingRequest: { + type: OptionType.SELECT, + description: "Show a notification when an incoming request is received or cancelled", + options: [{ + label: "Request received and cancelled", + value: "ALL", + default: true, + }, { + label: "Only when received", + value: "CREATE", + }, { + label: "Only when cancelled", + value: "REMOVE", + }, { + label: "No notifications", + value: "NONE", + }] + }, + block: { + type: OptionType.SELECT, + description: "Show a notification when you block or unblock a user", + options: [{ + label: "Blocked and Unblocked", + value: "ALL", + default: true, + }, { + label: "Only when blocking", + value: "CREATE", + }, { + label: "Only when unblocking", + value: "REMOVE", + }, { + label: "No notifications", + value: "NONE", + }] + }, +}); + +export default definePlugin({ + name: "RelationshipNotifier", + authors: [Devs.Megu], + description: "Receive notifications for friend requests, removals, blocks, etc.", + settings, + + start() { + FluxDispatcher.subscribe("RELATIONSHIP_ADD", onRelationshipUpdate); + FluxDispatcher.subscribe("RELATIONSHIP_UPDATE", onRelationshipUpdate); + FluxDispatcher.subscribe("RELATIONSHIP_REMOVE", onRelationshipRemove); + }, + + stop() { + FluxDispatcher.unsubscribe("RELATIONSHIP_ADD", onRelationshipUpdate); + FluxDispatcher.unsubscribe("RELATIONSHIP_UPDATE", onRelationshipUpdate); + FluxDispatcher.unsubscribe("RELATIONSHIP_REMOVE", onRelationshipRemove); + } +}); + async function onRelationshipUpdate({ relationship }: RelationshipPayload) { if (!relationship.id) return; const user = await UserUtils.fetchUser(relationship.id); @@ -56,6 +151,7 @@ async function onRelationshipUpdate({ relationship }: RelationshipPayload) { switch (relationship.type) { case RelationshipType.FRIEND: { + if (!["ALL", "CREATE"].includes(settings.store.friend)) break; showNotification({ title: "Friend Added", body: `${user.username} is now your friend.`, @@ -65,6 +161,7 @@ async function onRelationshipUpdate({ relationship }: RelationshipPayload) { break; } case RelationshipType.PENDING_INCOMING: { + if (!["ALL", "CREATE"].includes(settings.store.incomingRequest)) break; showNotification({ title: "Friend Request Received", body: `${user.username} sent you a friend request.`, @@ -74,6 +171,7 @@ async function onRelationshipUpdate({ relationship }: RelationshipPayload) { break; } case RelationshipType.PENDING_OUTGOING: { + if (!["ALL", "CREATE"].includes(settings.store.outgoingRequest)) break; showNotification({ title: "Friend Request Sent", body: `You sent a friend request to ${user.username}`, @@ -83,6 +181,7 @@ async function onRelationshipUpdate({ relationship }: RelationshipPayload) { break; } case RelationshipType.BLOCKED: { + if (!["ALL", "CREATE"].includes(settings.store.block)) break; showNotification({ title: "User Blocked", body: `You just blocked ${user.username}`, @@ -108,6 +207,7 @@ async function onRelationshipRemove({ relationship }: RelationshipPayload) { switch (relationship.type) { case RelationshipType.FRIEND: { + if (!["ALL", "REMOVE"].includes(settings.store.friend)) break; showNotification({ title: "Friend Removed", body: `${user.username} is no longer on your friends list.`, @@ -117,6 +217,7 @@ async function onRelationshipRemove({ relationship }: RelationshipPayload) { break; } case RelationshipType.PENDING_INCOMING: { + if (!["ALL", "REMOVE"].includes(settings.store.incomingRequest)) break; showNotification({ title: "Friend Request Cancelled", body: `${user.username} cancelled their friend request.`, @@ -126,6 +227,7 @@ async function onRelationshipRemove({ relationship }: RelationshipPayload) { break; } case RelationshipType.PENDING_OUTGOING: { + if (!["ALL", "REMOVE"].includes(settings.store.outgoingRequest)) break; showNotification({ title: "Friend Request Cancelled", body: `You cancelled your friend request to ${user.username}`, @@ -135,6 +237,7 @@ async function onRelationshipRemove({ relationship }: RelationshipPayload) { break; } case RelationshipType.BLOCKED: { + if (!["ALL", "REMOVE"].includes(settings.store.block)) break; showNotification({ title: "User Unblocked", body: `You just unblocked ${user.username}`, @@ -145,21 +248,3 @@ async function onRelationshipRemove({ relationship }: RelationshipPayload) { } } } - -export default definePlugin({ - name: "RelationshipNotifier", - authors: [Devs.Megu], - description: "Receive notifications for friend requests, removals, blocks, etc.", - - start() { - FluxDispatcher.subscribe("RELATIONSHIP_ADD", onRelationshipUpdate); - FluxDispatcher.subscribe("RELATIONSHIP_UPDATE", onRelationshipUpdate); - FluxDispatcher.subscribe("RELATIONSHIP_REMOVE", onRelationshipRemove); - }, - - stop() { - FluxDispatcher.unsubscribe("RELATIONSHIP_ADD", onRelationshipUpdate); - FluxDispatcher.unsubscribe("RELATIONSHIP_UPDATE", onRelationshipUpdate); - FluxDispatcher.unsubscribe("RELATIONSHIP_REMOVE", onRelationshipRemove); - } -});