venfetch-fork/index.ts
Sqaaakoi 89ee3fba97 fixes and plugin totals (#3)
excludes API plugins like /vencord-plugins

contributor shows if you arent in the vencord server

remove duplicate Date.now() call just use the one provided by Discord itself (might be slightly different? does it matter?)

Reviewed-on: https://git.nin0.dev///userplugins/venfetch/pulls/3
Co-authored-by: Sqaaakoi <sqaaakoi-git@sqaaakoi.xyz>
Co-committed-by: Sqaaakoi <sqaaakoi-git@sqaaakoi.xyz>
2024-10-27 11:56:54 -04:00

177 lines
6.9 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Vencord, a Discord client mod
* Copyright (c) 2024 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { ApplicationCommandInputType, Argument, CommandContext } from "@api/Commands";
import { gitHash } from "@shared/vencordUserAgent";
import { Devs } from "@utils/constants";
import { sendMessage } from "@utils/discord";
import definePlugin, { Plugin } from "@utils/types";
import { GuildMemberStore, UserStore } from "@webpack/common";
import plugins, { PluginMeta } from "~plugins";
import SettingsPlugin from "../../plugins/_core/settings";
import { isPluginDev } from "@utils/misc";
const clientVersion = () => {
const version = IS_DISCORD_DESKTOP ? DiscordNative.app.getVersion() : IS_VESKTOP ? VesktopNative.app.getVersion() : null;
// @ts-ignore
const name = IS_DISCORD_DESKTOP ? "Desktop" : IS_VESKTOP ? "Vesktop" : typeof unsafeWindow !== "undefined" ? "UserScript" : "Web";
return `${name}${version ? ` v${version}` : ''}`;
};
const lines = `\
VV VV
VV VV
VV VV
VV VV
VVV
CCCCCCC
CC
CC
CC
CCCCCCC\
`.split("\n");
const sanitised = `\
VV VV
VV VV
VV VV
VV VV
VVV
CCCCCCC
CC
CC
CC
CCCCCCC\
`.split("\n");
// ```ansi
// VV VV thepotatofamine
// VV VV ---------------
// VV VV Version: v1.10.5 • 88e8fa7e (Dev) - 25 Oct 2024
// VV VV Client: canary ~ Vesktop v1.5.3
// VVV Platform: MacIntel
// CCCCCCC Plugin Count: 119
// CC Uptime: 1997s
// CC Donor: yes
// CC
// CCCCCCC ███████████████████████████
// ```;
const isApiPlugin = (plugin: Plugin) => plugin.name.endsWith("API") || plugin.required;
function getEnabledPlugins() {
let counter = 0;
let total = 0;
let userpluginsCount = 0;
let totalUserplugins = 0;
Object.values(plugins).filter((plugin) => !isApiPlugin(plugin)).forEach((plugin) => {
if (PluginMeta[plugin.name].userPlugin) {
if (plugin.started) userpluginsCount++;
totalUserplugins++;
} else {
if (plugin.started) counter++;
total++;
};
});
return `${counter}/${total} (official)` + (totalUserplugins ? `, ${userpluginsCount}/${totalUserplugins} (userplugins)` : "");
}
function getDonorStatus() {
return GuildMemberStore.getMember("1015060230222131221", UserStore.getCurrentUser().id).roles.includes("1042507929485586532");
}
function getContribStatus() {
const userId = UserStore.getCurrentUser().id;
return isPluginDev(userId) || GuildMemberStore.getMember("1015060230222131221", userId).roles.includes("1026534353167208489");
}
function humanFileSize(bytes, si = false, dp = 1) {
const thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) {
return bytes + " B";
}
const units = si
? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
: ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
let u = -1;
const r = 10 ** dp;
do {
bytes /= thresh;
++u;
} while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
return bytes.toFixed(dp) + " " + units[u];
}
export default definePlugin({
name: "venfetch",
description: "neofetch for vencord",
authors: [Devs.nin0dev],
commands: [
{
name: "venfetch",
description: "neofetch for vencord",
inputType: ApplicationCommandInputType.BUILT_IN,
execute: (args: Argument[], ctx: CommandContext) => {
const { username } = UserStore.getCurrentUser();
const info: Record<string, string | null> = {
version: `${VERSION} ~ ${gitHash}${SettingsPlugin.additionalInfo} - ${Intl.DateTimeFormat(navigator.language, { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}`,
client: `${t(window.GLOBAL_ENV.RELEASE_CHANNEL)} ~ ${clientVersion()}`,
// @ts-ignore
platform: navigator.userAgentData?.platform ?? navigator.platform,
plugins: getEnabledPlugins(),
uptime: `${~~((Date.now() - window.GLOBAL_ENV.HTML_TIMESTAMP) / 1000)}s`,
// TODO: pr to vencord real and add to vencordnative
// memory: `${humanFileSize(VencordNative.memoryUsage().heapUsed)} / ${humanFileSize(VencordNative.memoryUsage().heapTotal)}`,
_: null,
donor: getDonorStatus() ? "yes" : "no",
contributor: getContribStatus() ? "yes" : null,
__: null,
__COLOR_TEST__: "███████████████████████████"
// electron web context, want to get total memory usage
};
const computed: [string, string | null][] = Object.entries(info).map(([key, value]) => [key, value]);
let str = "";
str += `${lines[0]}${" ".repeat(25 - lines[0].length)}${username}\n`;
for (let i = 1; i < computed.length + 1; i++) {
const line = computed[i - 1];
if (lines[i]) {
str += `${lines[i]}`;
if (line && line[1] !== null && line[0] !== "__COLOR_TEST__") str += `${" ".repeat(25 - sanitised[i].length)}${t(line[0])}: ${line[1]}\n`;
else if (line[0] === "__COLOR_TEST__") str += line[0] + "\n"; else str += "\n";
} else {
if (line && line[1] !== null && line[0] !== "__COLOR_TEST__") str += `${" ".repeat(25)}${t(line[0])}: ${line[1]}\n`;
else if (line[0] === "__COLOR_TEST__") str += `${" ".repeat(25)}${line[1]}\n`; else str += "\n";
}
}
sendMessage(ctx.channel.id, {
content: `\`\`\`ansi\n${str}\n\`\`\``
});
return;
}
}
]
});
const t = (e: string) => e.length > 0 ? e[0].toUpperCase() + e.slice(1) : "";