From fe8ffe19162b079c2c8e3427e14172d08ecf9ca7 Mon Sep 17 00:00:00 2001 From: Eth L <40714786+TildeEthDoUsPart@users.noreply.github.com> Date: Mon, 9 Mar 2026 22:34:40 +0100 Subject: [PATCH 1/3] fix(sekaiStickers): proper newline spacing in added text (#894) Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> Co-authored-by: creations --- .../sekaiStickers/Components/SekaiStickersModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/equicordplugins/sekaiStickers/Components/SekaiStickersModal.tsx b/src/equicordplugins/sekaiStickers/Components/SekaiStickersModal.tsx index 609319afd..1037b96a8 100644 --- a/src/equicordplugins/sekaiStickers/Components/SekaiStickersModal.tsx +++ b/src/equicordplugins/sekaiStickers/Components/SekaiStickersModal.tsx @@ -23,7 +23,7 @@ export default function SekaiStickersModal({ modalProps, settings }: { modalProp const [curve, setCurve] = React.useState(false); const [isImgLoaded, setImgLoaded] = React.useState(false); const [position, setPosition] = React.useState<{ x: number, y: number; }>({ x: characters[character].defaultText.x, y: characters[character].defaultText.y }); - const [spaceSize, setSpaceSize] = React.useState(1); + const [spaceSize, setSpaceSize] = React.useState(36); let canvast!: HTMLCanvasElement; const img = new Image(); img.crossOrigin = "anonymous"; From 6eff8135221c3054a13cdc1cab258a72b6b24b1d Mon Sep 17 00:00:00 2001 From: Key Date: Mon, 9 Mar 2026 21:36:34 +0000 Subject: [PATCH 2/3] Ghosted: add max inactive time for dms (#897) --- src/equicordplugins/ghosted/Boo.tsx | 9 ++++++--- src/equicordplugins/ghosted/index.tsx | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/equicordplugins/ghosted/Boo.tsx b/src/equicordplugins/ghosted/Boo.tsx index f0b4425bc..b86a7e9d8 100644 --- a/src/equicordplugins/ghosted/Boo.tsx +++ b/src/equicordplugins/ghosted/Boo.tsx @@ -98,6 +98,9 @@ export function Boo({ channel }: { channel: Channel; }) { }); const [isCleared, setIsCleared] = useState(false); + const lastMessageTimestampMs = lastMessage ? new Date(lastMessage.timestamp).getTime() : 0; + const isInactive = !!lastMessage && settings.store.maxInactiveTimeMs > 0 && Number.isFinite(lastMessageTimestampMs) && Date.now() - lastMessageTimestampMs > settings.store.maxInactiveTimeMs; + useEffect(() => { if (!lastMessage || !currentUserId) return; @@ -167,7 +170,7 @@ export function Boo({ channel }: { channel: Channel; }) { } // if exempted or bot (if setting enabled), remove from ghost tracking - if (isExempted || (settings.store.ignoreBots && lastMessage.author.bot)) { + if (isExempted || (settings.store.ignoreBots && lastMessage.author.bot) || isInactive) { if (countedChannels.has(id)) { countedChannels.delete(id); setBooCount(getBooCount() - 1); @@ -187,9 +190,9 @@ export function Boo({ channel }: { channel: Channel; }) { setBooCount(getBooCount() + 1); } } - }, [state.isCurrentUser, state.isDataProcessed, id, lastMessage?.id]); + }, [state.isCurrentUser, state.isDataProcessed, id, lastMessage?.id, isInactive]); - if (!state.isDataProcessed || !currentUserId || !lastMessage || state.isCurrentUser || isChannelExempted(channel) || isCleared || (settings.store.ignoreBots && lastMessage.author.bot)) + if (!state.isDataProcessed || !currentUserId || !lastMessage || state.isCurrentUser || isChannelExempted(channel) || isCleared || (settings.store.ignoreBots && lastMessage.author.bot) || isInactive) return null; if (!settings.store.showDmIcons) return null; diff --git a/src/equicordplugins/ghosted/index.tsx b/src/equicordplugins/ghosted/index.tsx index 845a34f6b..921970696 100644 --- a/src/equicordplugins/ghosted/index.tsx +++ b/src/equicordplugins/ghosted/index.tsx @@ -52,6 +52,18 @@ export const settings = definePluginSettings({ description: "Ignore DMs from bots", default: true, restartNeeded: false + }, + maxInactiveTimeMs: { + type: OptionType.SELECT, + description: "Only ghost DMs active within this timeframe", + options: [ + { label: "No limit", value: 0, default: true }, + { label: "1 hour", value: 60 * 60 * 1000 }, + { label: "1 day", value: 24 * 60 * 60 * 1000 }, + { label: "1 week", value: 7 * 24 * 60 * 60 * 1000 }, + { label: "1 month", value: 30 * 24 * 60 * 60 * 1000 }, + ], + restartNeeded: false } }); From 7c2d0b2aec9a3ac177e8db64e61d89a78abb9a69 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:48:57 -0400 Subject: [PATCH 3/3] richpresence: migration --- src/equicordplugins/richPresence/migration.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/equicordplugins/richPresence/migration.ts b/src/equicordplugins/richPresence/migration.ts index 1101c2ff8..49f35b2ba 100644 --- a/src/equicordplugins/richPresence/migration.ts +++ b/src/equicordplugins/richPresence/migration.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { Settings } from "@api/Settings"; +import { migratePluginSettings, Settings } from "@api/Settings"; import { Logger } from "@utils/Logger"; import { settings, SettingsStore } from "./settings"; @@ -97,6 +97,8 @@ function setStoreValue(key: SettingsKey, value: boolean | string | number) { export function migrateOldSettings() { if (Settings.plugins.RichPresence._migrated) return; + migratePluginSettings("RichPresence", "AudioBookShelfRichPresence", "GensokyoRadioRPC", "JellyfinRichPresence", "ListenBrainzRPC", "StatsfmPresence", "TosuRPC"); + for (const migration of migrations) { const oldSettings = Settings.plugins[migration.oldPlugin]; if (!oldSettings) continue;