Compare commits

...
Sign in to create a new pull request.

9 commits
main ... main

Author SHA1 Message Date
b8f77887ac
fix edge case with plugin without a name
Signed-off-by: splatter <splatterxl@outlook.ie>
2025-02-24 01:06:27 +00:00
c4d7b98e72
refactor rendering code
Signed-off-by: splatter <splatterxl@outlook.ie>
2025-02-02 02:04:33 +00:00
788c01e81a
add memory
Signed-off-by: splatter <splatterxl@outlook.ie>
2025-02-01 15:04:42 +00:00
cb617a8ed7 add common issues 2025-01-19 16:53:44 +00:00
f095065fd5
fix merge conflict 2024-10-28 04:59:51 +13:00
808dfc8247
fixes and plugin totals 2024-10-28 04:48:42 +13:00
5c867c19f9 add build number 2024-10-27 15:46:08 +00:00
59c84ebb5d fix bug 2024-10-27 15:32:44 +00:00
585a1035c0 its shiggy season 2024-10-27 15:31:12 +00:00
2 changed files with 154 additions and 94 deletions

240
index.ts
View file

@ -8,13 +8,18 @@ import { ApplicationCommandInputType, Argument, CommandContext } from "@api/Comm
import { gitHash } from "@shared/vencordUserAgent"; import { gitHash } from "@shared/vencordUserAgent";
import { Devs } from "@utils/constants"; import { Devs } from "@utils/constants";
import { sendMessage } from "@utils/discord"; import { sendMessage } from "@utils/discord";
import definePlugin from "@utils/types"; import definePlugin, { Plugin, PluginNative } from "@utils/types";
import { GuildMemberStore, UserStore } from "@webpack/common"; import { GuildMemberStore, UserStore } from "@webpack/common";
import { PluginMeta } from "~plugins"; import { PluginMeta } from "~plugins";
import { isPluginDev, tryOrElse } from "@utils/misc";
import { findByCodeLazy } from "@webpack";
import { getUserSettingLazy } from "../../api/UserSettings.js";
import SettingsPlugin from "../../plugins/_core/settings"; import SettingsPlugin from "../../plugins/_core/settings";
const Native = VencordNative.pluginHelpers.venfetch as PluginNative<typeof import("./native")>;
const clientVersion = () => { const clientVersion = () => {
const version = IS_DISCORD_DESKTOP ? DiscordNative.app.getVersion() : IS_VESKTOP ? VesktopNative.app.getVersion() : null; const version = IS_DISCORD_DESKTOP ? DiscordNative.app.getVersion() : IS_VESKTOP ? VesktopNative.app.getVersion() : null;
// @ts-ignore // @ts-ignore
@ -22,31 +27,35 @@ const clientVersion = () => {
return `${name}${version ? ` v${version}` : ''}`; return `${name}${version ? ` v${version}` : ''}`;
}; };
const uptime = Date.now();
const lines = `\ const COLOR_TEST = '███████████████████████████';
VV VV
VV VV
VV VV const LOGO_WITH_ANSI = `\
VV VV \n\
VVV \tVV VV
CCCCCCC \t VV VV
CC \t VV VV
CC \t VV VV
CC \t VVV
CCCCCCC\ \t CCCCCCC
\t CC
\t CC
\t CC
\t CCCCCCC\
`.split("\n"); `.split("\n");
const sanitised = `\ const LOGO_NO_ANSI = `\
VV VV \n\
VV VV \tVV VV
VV VV \t VV VV
VV VV \t VV VV
VVV \t VV VV
CCCCCCC \t VVV
CC \t CCCCCCC
CC \t CC
CC \t CC
CCCCCCC\ \t CC
\t CCCCCCC\
`.split("\n"); `.split("\n");
// ```ansi // ```ansi
@ -62,23 +71,129 @@ VV VV
// CCCCCCC ███████████████████████████ // CCCCCCC ███████████████████████████
// ```; // ```;
function getEnabledPlugins() { const isApiPlugin = (plugin: Plugin) => plugin.name?.endsWith("API") || plugin.required;
let counter = 0;
let userpluginsCount = 0;
Object.entries(Vencord.Plugins.plugins).forEach(([key, value]) => { function getEnabledPlugins() {
if (value.started) if (PluginMeta[value.name].userPlugin) userpluginsCount++; else counter++; const counters = {
official: {
enabled: 0,
total: 0
},
user: {
enabled: 0,
total: 0
}
};
Object.values(Vencord.Plugins.plugins).filter((plugin) => !isApiPlugin(plugin)).forEach((plugin) => {
if (PluginMeta[plugin.name]?.userPlugin) {
if (plugin.started) counters.user.enabled++;
counters.user.total++;
} else {
if (plugin.started) counters.official.enabled++;
counters.official.total++;
}
}); });
return `${counter} (official)` + (userpluginsCount ? `, ${userpluginsCount} (userplugins)` : ""); return `${counters.official.enabled} / ${counters.official.total} (official)` + (counters.user.total ? `, ${counters.user.enabled} / ${counters.user.total} (userplugins)` : "");
} }
function getDonorStatus() { function getDonorStatus() {
return GuildMemberStore.getMember("1015060230222131221", UserStore.getCurrentUser().id).roles.includes("1042507929485586532"); return GuildMemberStore.getMember("1015060230222131221", UserStore.getCurrentUser().id).roles.includes("1042507929485586532");
} }
function getContribStatus() { function getContribStatus() {
return GuildMemberStore.getMember("1015060230222131221", UserStore.getCurrentUser().id).roles.includes("1026534353167208489"); const userId = UserStore.getCurrentUser().id;
return isPluginDev(userId) || GuildMemberStore.getMember("1015060230222131221", userId).roles.includes("1026534353167208489");
} }
const getVersions = findByCodeLazy("logsUploaded:new Date().toISOString(),");
const ShowCurrentGame = getUserSettingLazy<boolean>("status", "showCurrentGame")!;
export default definePlugin({
name: "venfetch",
description: "neofetch for vencord",
authors: [Devs.nin0dev],
commands: [
{
name: "venfetch",
description: "neofetch for vencord",
inputType: ApplicationCommandInputType.BUILT_IN,
execute: async (args: Argument[], ctx: CommandContext) => {
const commonIssues = {
"NoRPC": Vencord.Plugins.isPluginEnabled("NoRPC"),
"disabled activities": tryOrElse(() => !ShowCurrentGame.getSetting(), false),
"outdated": BUILD_TIMESTAMP < Date.now() - 12096e5,
};
const memory = await Native?.getMemory();
const { username } = UserStore.getCurrentUser();
const versions = getVersions();
const info: Record<string, string | null> = {
version: `${VERSION} ~ ${gitHash}${SettingsPlugin.additionalInfo} - ${Intl.DateTimeFormat(navigator.language, { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}${!IS_STANDALONE ? ` ~ dev` : ""}`,
client: `${t(window.GLOBAL_ENV.RELEASE_CHANNEL)} ~ ${clientVersion()}`,
'Build Number': `${versions.buildNumber} ~ Hash: ${versions.versionHash?.slice(0, 7) ?? 'unknown'}`,
issues: Object.entries(commonIssues).filter(([_, value]) => value).map(([key]) => key).join(", ") || '',
_: null,
// @ts-ignore
platform: navigator.userAgentData?.platform ? `${navigator.userAgentData?.platform} (${navigator.platform})` : navigator.platform,
plugins: getEnabledPlugins(),
uptime: `${~~((Date.now() - window.GLOBAL_ENV.HTML_TIMESTAMP) / 1000)}s`,
memory: memory ? `${humanFileSize(memory.heapUsed)} / ${humanFileSize(memory.heapTotal)}` : '',
__: null,
donor: getDonorStatus() ? "yes" : "no",
contributor: getContribStatus() ? "yes" : "no",
___: null,
// electron web context, want to get total memory usage
};
const computed: [string, string | null][] = Object.entries(info).filter(([key, value]) => value === null || value!.length).map(([key, value]) => [key, value]);
let str = "";
const MAGIC_NUMBER = 25;
str += `${LOGO_WITH_ANSI[0]}${" ".repeat(MAGIC_NUMBER - LOGO_NO_ANSI[0].length)}${username}\n`;
for (let i = 1; i < computed.length + 1; i++) {
const logoLine = LOGO_WITH_ANSI[i];
const line = computed[i - 1];
if (logoLine) {
str += logoLine;
str += " ".repeat(MAGIC_NUMBER - 3 - LOGO_NO_ANSI[i].length);
} else {
str += " ".repeat(MAGIC_NUMBER);
}
const [key, value] = line;
if (!key.startsWith("_") && value) {
str += `${key[0].toUpperCase()}${key.slice(1)}: ${value}`;
}
str += '\n';
}
str += `${" ".repeat(MAGIC_NUMBER)}${COLOR_TEST}\n`;
sendMessage(ctx.channel.id, {
content: `\`\`\`ansi\n${str}\n\`\`\``
});
return;
}
}
]
});
const t = (e: string) => e.length > 0 ? e[0].toUpperCase() + e.slice(1) : "";
function humanFileSize(bytes, si = false, dp = 1) { function humanFileSize(bytes, si = false, dp = 1) {
const thresh = si ? 1000 : 1024; const thresh = si ? 1000 : 1024;
@ -100,66 +215,3 @@ function humanFileSize(bytes, si = false, dp = 1) {
return bytes.toFixed(dp) + " " + units[u]; 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() - uptime) / 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[0].toUpperCase() + e.slice(1);

8
native.ts Normal file
View file

@ -0,0 +1,8 @@
export function getMemory() {
const memory = process.memoryUsage();
return {
heapUsed: memory.heapUsed,
heapTotal: memory.heapTotal
};
}