mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-07 05:42:55 -04:00
This commit is contained in:
parent
dc24a32d6a
commit
7a0df3bcf0
3 changed files with 175 additions and 0 deletions
|
@ -106,6 +106,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
|
||||||
- Meow by Samwich
|
- Meow by Samwich
|
||||||
- MessageBurst by port
|
- MessageBurst by port
|
||||||
- MessageColors by Hen
|
- MessageColors by Hen
|
||||||
|
- MessageFetchTimer by GroupXyz
|
||||||
- MessageLinkTooltip by Kyuuhachi
|
- MessageLinkTooltip by Kyuuhachi
|
||||||
- MessageLoggerEnhanced by Aria
|
- MessageLoggerEnhanced by Aria
|
||||||
- MessageTranslate by Samwich
|
- MessageTranslate by Samwich
|
||||||
|
|
170
src/equicordplugins/messageFetchTimer/index.tsx
Normal file
170
src/equicordplugins/messageFetchTimer/index.tsx
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a Discord client mod
|
||||||
|
* Copyright (c) 2025 Vendicated and contributors
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { ChatBarButton, ChatBarButtonFactory } from "@api/ChatButtons";
|
||||||
|
import { definePluginSettings } from "@api/Settings";
|
||||||
|
import { EquicordDevs } from "@utils/constants";
|
||||||
|
import { getCurrentChannel } from "@utils/discord";
|
||||||
|
import definePlugin, { OptionType } from "@utils/types";
|
||||||
|
import { FluxDispatcher, React } from "@webpack/common";
|
||||||
|
|
||||||
|
interface FetchTiming {
|
||||||
|
channelId: string;
|
||||||
|
startTime: number;
|
||||||
|
endTime?: number;
|
||||||
|
duration?: number;
|
||||||
|
timestamp?: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
let currentFetch: FetchTiming | null = null;
|
||||||
|
let currentChannelId: string | null = null;
|
||||||
|
const channelTimings: Map<string, { time: number; timestamp: Date; }> = new Map();
|
||||||
|
|
||||||
|
const settings = definePluginSettings({
|
||||||
|
showIcon: {
|
||||||
|
type: OptionType.BOOLEAN,
|
||||||
|
description: "Show fetch time icon in message bar",
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
showMs: {
|
||||||
|
type: OptionType.BOOLEAN,
|
||||||
|
description: "Show milliseconds in timing",
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
iconColor: {
|
||||||
|
type: OptionType.STRING,
|
||||||
|
description: "Icon color (CSS color value)",
|
||||||
|
default: "#00d166",
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const FetchTimeButton: ChatBarButtonFactory = ({ isMainChat }) => {
|
||||||
|
const { showMs, iconColor } = settings.use(["showMs", "iconColor"]);
|
||||||
|
|
||||||
|
if (!isMainChat || !settings.store.showIcon || !currentChannelId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const channelData = channelTimings.get(currentChannelId);
|
||||||
|
if (!channelData) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { time, timestamp } = channelData;
|
||||||
|
const displayTime = showMs ? `${Math.round(time)}ms` : `${Math.round(time / 1000)}s`;
|
||||||
|
|
||||||
|
if (!showMs && Math.round(time / 1000) === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const timeAgo = formatTimeAgo(timestamp);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ChatBarButton
|
||||||
|
tooltip={`Messages loaded in ${Math.round(time)}ms (${timeAgo})`}
|
||||||
|
onClick={() => { }}
|
||||||
|
>
|
||||||
|
<div style={{
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
gap: "4px"
|
||||||
|
}}>
|
||||||
|
<svg
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="currentColor"
|
||||||
|
>
|
||||||
|
<path d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z" />
|
||||||
|
</svg>
|
||||||
|
<span style={{
|
||||||
|
fontSize: "12px",
|
||||||
|
color: iconColor,
|
||||||
|
fontWeight: "500"
|
||||||
|
}}>
|
||||||
|
{displayTime}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</ChatBarButton>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
function formatTimeAgo(timestamp: Date): string {
|
||||||
|
const now = new Date();
|
||||||
|
const diff = now.getTime() - timestamp.getTime();
|
||||||
|
const seconds = Math.floor(diff / 1000);
|
||||||
|
const minutes = Math.floor(seconds / 60);
|
||||||
|
const hours = Math.floor(minutes / 60);
|
||||||
|
const days = Math.floor(hours / 24);
|
||||||
|
|
||||||
|
if (days > 0) {
|
||||||
|
return `${days} day${days > 1 ? "s" : ""} ago`;
|
||||||
|
} else if (hours > 0) {
|
||||||
|
return `${hours} hour${hours > 1 ? "s" : ""} ago`;
|
||||||
|
} else if (minutes > 0) {
|
||||||
|
return `${minutes} minute${minutes > 1 ? "s" : ""} ago`;
|
||||||
|
} else {
|
||||||
|
return "just now";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleChannelSelect(data: any) {
|
||||||
|
if (data.channelId && data.channelId !== currentChannelId) {
|
||||||
|
currentChannelId = data.channelId;
|
||||||
|
currentFetch = {
|
||||||
|
channelId: data.channelId,
|
||||||
|
startTime: performance.now()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMessageLoad(data: any) {
|
||||||
|
if (!currentFetch || data.channelId !== currentFetch.channelId) return;
|
||||||
|
|
||||||
|
const existing = channelTimings.get(currentFetch.channelId);
|
||||||
|
if (existing) return;
|
||||||
|
|
||||||
|
const endTime = performance.now();
|
||||||
|
const duration = endTime - currentFetch.startTime;
|
||||||
|
|
||||||
|
channelTimings.set(currentFetch.channelId, {
|
||||||
|
time: duration,
|
||||||
|
timestamp: new Date()
|
||||||
|
});
|
||||||
|
|
||||||
|
currentFetch = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default definePlugin({
|
||||||
|
name: "MessageFetchTimer",
|
||||||
|
description: "Shows how long it took to fetch messages for the current channel",
|
||||||
|
authors: [EquicordDevs.GroupXyz],
|
||||||
|
settings,
|
||||||
|
|
||||||
|
start() {
|
||||||
|
FluxDispatcher.subscribe("CHANNEL_SELECT", handleChannelSelect);
|
||||||
|
FluxDispatcher.subscribe("LOAD_MESSAGES_SUCCESS", handleMessageLoad);
|
||||||
|
FluxDispatcher.subscribe("MESSAGE_CREATE", handleMessageLoad);
|
||||||
|
|
||||||
|
const currentChannel = getCurrentChannel();
|
||||||
|
if (currentChannel) {
|
||||||
|
currentChannelId = currentChannel.id;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
FluxDispatcher.unsubscribe("CHANNEL_SELECT", handleChannelSelect);
|
||||||
|
FluxDispatcher.unsubscribe("LOAD_MESSAGES_SUCCESS", handleMessageLoad);
|
||||||
|
FluxDispatcher.unsubscribe("MESSAGE_CREATE", handleMessageLoad);
|
||||||
|
|
||||||
|
currentFetch = null;
|
||||||
|
channelTimings.clear();
|
||||||
|
currentChannelId = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
renderChatBarButton: FetchTimeButton,
|
||||||
|
});
|
|
@ -1078,6 +1078,10 @@ export const EquicordDevs = Object.freeze({
|
||||||
name: "bbgaming25k",
|
name: "bbgaming25k",
|
||||||
id: 851222385528274964n,
|
id: 851222385528274964n,
|
||||||
},
|
},
|
||||||
|
GroupXyz: {
|
||||||
|
name: "GroupXyz",
|
||||||
|
id: 950033410229944331n
|
||||||
|
},
|
||||||
} satisfies Record<string, Dev>);
|
} satisfies Record<string, Dev>);
|
||||||
|
|
||||||
// iife so #__PURE__ works correctly
|
// iife so #__PURE__ works correctly
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue