From f7b8c13a3412b14198edfe6bf58ea6d1db5873ab Mon Sep 17 00:00:00 2001 From: nin0dev Date: Thu, 8 Aug 2024 15:10:03 -0400 Subject: [PATCH] ungeneralized plugin --- index.tsx | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 97 insertions(+), 7 deletions(-) diff --git a/index.tsx b/index.tsx index 55f9ad4..27e3868 100644 --- a/index.tsx +++ b/index.tsx @@ -5,7 +5,7 @@ import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { cache } from "@webpack"; -import { Constants, Forms, MessageStore, Parser, RestAPI, useEffect, UserStore, useState } from "@webpack/common"; +import { Button, Constants, Forms, MessageStore, Parser, RestAPI, Toasts, useEffect, UserStore, useState } from "@webpack/common"; import { Message } from "discord-types/general"; const DATA_STORE_KEY = "huskchart"; @@ -81,8 +81,11 @@ const UserData = () => { return ( <> - User stats { collapsed ? collapse(false) : collapse(true); }}>[{collapsed ? "View all" : "Collapse"}] + User stats {data.length > 6 && { collapsed ? collapse(false) : collapse(true); }}>[{collapsed ? "View all" : "Collapse"}]}
+ { + data.length === 0 && Nothing to see here. + } { data && data.map(user => <> { @@ -112,9 +115,72 @@ const UserData = () => { ); }; +const ChannelData = () => { + const [data, setData] = useState([]); + const [collapsed, collapse] = useState(true); + + useEffect(() => { + const fetchData = async () => { + const rawHusks: Husk[] = await DataStore.get(DATA_STORE_KEY) || []; + const unsortedHuskCountPerChannel: SortedHusk[] = []; + for (const husk of rawHusks) { + let shouldAddInitialHusk = true; + for (const [i, hc] of unsortedHuskCountPerChannel.entries()) { + const unsortedHusker: SortedHusk = hc; + if (unsortedHusker.id == husk.channelId) { + unsortedHuskCountPerChannel[i].count++; + shouldAddInitialHusk = false; + } + } + if (!shouldAddInitialHusk) continue; + unsortedHuskCountPerChannel.push({ id: husk.channelId, count: 1 }); + } + const sortedHuskers = unsortedHuskCountPerChannel.sort((a, b) => b.count - a.count); + // @ts-ignore EXPLODEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + setData(sortedHuskers); + }; + fetchData(); + }, []); + + return ( + <> + Channel stats {data.length > 6 && { collapsed ? collapse(false) : collapse(true); }}>[{collapsed ? "View all" : "Collapse"}]} +
+ { + data.length === 0 && Nothing to see here. + } + { + data && data.map(channel => <> + { + collapsed && <> + { + data.indexOf(channel) < 6 && +
+ {/* @ts-ignore */} + {Parser.parse(`<#${channel.id}>`)} with {channel.count} {channel.count > 1 ? "husks" : "husk"} +
+ } + + } + { + !collapsed && <> + { +
+ {/* @ts-ignore */} + {Parser.parse(`<#${channel.id}>`)} with {channel.count} {channel.count > 1 ? "husks" : "husk"} +
+ } + + } + ) + } +
+ + ); +}; export default definePlugin({ - name: "HuskChart", - description: "See how much you've been husked, and by who", + name: "ReactionTracker", + description: "See how much you've been reacted with a specific emoji, and by who", authors: [Devs.nin0dev], flux: { async MESSAGE_REACTION_ADD(event) { @@ -137,15 +203,39 @@ export default definePlugin({ } }, settings: definePluginSettings({ + emojiToTrack: { + type: OptionType.STRING, + description: "The emoji to track (type its name, any emoji containing that name will be tracked)", + default: "husk", + placeholder: "emojiname (no :)" + }, buttons: { type: OptionType.COMPONENT, - description: "User stats", - component: (aaa) => ( + description: "stats", + component: () => ( <> - + ) + }, + clearAll: { + type: OptionType.COMPONENT, + description: "clear", + component: () => ( + + ) } }) });