From ee24439795df84f2a226d1b915d8037b074436e9 Mon Sep 17 00:00:00 2001 From: megumin Date: Thu, 8 Dec 2022 22:53:12 +0000 Subject: [PATCH] feat(plugin): sort friend requests by date received (#280) --- src/plugins/sortFriendRequests.tsx | 74 ++++++++++++++++++++++++++++++ src/utils/types.ts | 1 + src/webpack/common.tsx | 5 +- src/webpack/patchWebpack.ts | 1 + 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/plugins/sortFriendRequests.tsx diff --git a/src/plugins/sortFriendRequests.tsx b/src/plugins/sortFriendRequests.tsx new file mode 100644 index 0000000..b9732af --- /dev/null +++ b/src/plugins/sortFriendRequests.tsx @@ -0,0 +1,74 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2022 Vendicated and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import { Flex } from "@components/Flex"; +import { Devs } from "@utils/constants"; +import definePlugin, { OptionType } from "@utils/types"; +import { RelationshipStore } from "@webpack/common"; +import { User } from "discord-types/general"; +import { Settings } from "Vencord"; + +export default definePlugin({ + name: "SortFriendRequests", + authors: [Devs.Megu], + description: "Sorts friend requests by date of receipt", + + patches: [{ + find: ".PENDING_INCOMING||", + replacement: [{ + match: /\.sortBy\(\(function\((\w)\){return \w{1,3}\.comparator}\)\)/, + // If the row type is 3 or 4 (pendinng incoming or outgoing), sort by date of receipt + // Otherwise, use the default comparator + replace: (_, row) => `.sortBy((function(${row}) { + return ${row}.type === 3 || ${row}.type === 4 + ? -Vencord.Plugins.plugins.SortFriendRequests.getSince(${row}.user) + : ${row}.comparator + }))` + }, { + predicate: () => Settings.plugins.SortFriendRequests.showDates, + match: /(user:(\w{1,3}),.{10,30}),subText:(\w{1,3}),(.{10,30}userInfo}\))/, + // Show dates in the friend request list + replace: (_, pre, user, subText, post) => `${pre}, + subText: Vencord.Plugins.plugins.SortFriendRequests.makeSubtext(${subText}, ${user}), + ${post}` + }] + }], + + getSince(user: User) { + return new Date(RelationshipStore.getSince(user.id)); + }, + + makeSubtext(text: string, user: User) { + const since = this.getSince(user); + return ( + + {text} + {!isNaN(since.getTime()) && Received — {since.toDateString()}} + + ); + }, + + options: { + showDates: { + type: OptionType.BOOLEAN, + description: "Show dates on friend requests", + default: false, + restartNeeded: true + } + } +}); diff --git a/src/utils/types.ts b/src/utils/types.ts index 4e230fe..fd8f02b 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -27,6 +27,7 @@ export default function definePlugin

(p: P & Record string); + predicate?(): boolean; } export interface Patch { diff --git a/src/webpack/common.tsx b/src/webpack/common.tsx index 56846c2..0a5fd7d 100644 --- a/src/webpack/common.tsx +++ b/src/webpack/common.tsx @@ -52,7 +52,10 @@ export let UserStore: Stores.UserStore; export let SelectedChannelStore: Stores.SelectedChannelStore; export let SelectedGuildStore: any; export let ChannelStore: Stores.ChannelStore; -export let RelationshipStore: Stores.RelationshipStore; +export let RelationshipStore: Stores.RelationshipStore & { + /** Get the date (as a string) that the relationship was created */ + getSince(userId: string): string; +}; export const Forms = {} as { FormTitle: Components.FormTitle; diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 273a062..8f11b63 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -137,6 +137,7 @@ function patchPush() { // @ts-ignore we change all patch.replacement to array in plugins/index for (const replacement of patch.replacement) { + if (replacement.predicate && !replacement.predicate()) continue; const lastMod = mod; const lastCode = code;