diff --git a/index.ts b/index.ts index 9d34bcf..e13cf38 100644 --- a/index.ts +++ b/index.ts @@ -8,13 +8,18 @@ import { ApplicationCommandInputType, Argument, CommandContext } from "@api/Comm import { gitHash } from "@shared/vencordUserAgent"; import { Devs } from "@utils/constants"; import { sendMessage } from "@utils/discord"; -import definePlugin from "@utils/types"; +import definePlugin, { Plugin, PluginNative } from "@utils/types"; import { GuildMemberStore, UserStore } from "@webpack/common"; 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"; +const Native = VencordNative.pluginHelpers.venfetch as PluginNative; + const clientVersion = () => { const version = IS_DISCORD_DESKTOP ? DiscordNative.app.getVersion() : IS_VESKTOP ? VesktopNative.app.getVersion() : null; // @ts-ignore @@ -22,31 +27,35 @@ const clientVersion = () => { return `${name}${version ? ` v${version}` : ''}`; }; -const uptime = Date.now(); -const lines = `\ -VV VV - VV VV - VV VV - VV VV - VVV - CCCCCCC - CC - CC - CC - CCCCCCC\ +const COLOR_TEST = '███████████████████████████'; + + +const LOGO_WITH_ANSI = `\ +\n\ +\tVV VV +\t VV VV +\t VV VV +\t VV VV +\t VVV +\t CCCCCCC +\t CC +\t CC +\t CC +\t CCCCCCC\ `.split("\n"); -const sanitised = `\ -VV VV - VV VV - VV VV - VV VV - VVV - CCCCCCC - CC - CC - CC - CCCCCCC\ +const LOGO_NO_ANSI = `\ +\n\ +\tVV VV +\t VV VV +\t VV VV +\t VV VV +\t VVV +\t CCCCCCC +\t CC +\t CC +\t CC +\t CCCCCCC\ `.split("\n"); // ```ansi @@ -62,23 +71,129 @@ VV VV // CCCCCCC ███████████████████████████ // ```; -function getEnabledPlugins() { - let counter = 0; - let userpluginsCount = 0; +const isApiPlugin = (plugin: Plugin) => plugin.name?.endsWith("API") || plugin.required; - Object.entries(Vencord.Plugins.plugins).forEach(([key, value]) => { - if (value.started) if (PluginMeta[value.name].userPlugin) userpluginsCount++; else counter++; +function getEnabledPlugins() { + 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() { return GuildMemberStore.getMember("1015060230222131221", UserStore.getCurrentUser().id).roles.includes("1042507929485586532"); } 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("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 = { + 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) { const thresh = si ? 1000 : 1024; @@ -100,66 +215,3 @@ function humanFileSize(bytes, si = false, dp = 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 = { - 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); diff --git a/native.ts b/native.ts new file mode 100644 index 0000000..7095bc2 --- /dev/null +++ b/native.ts @@ -0,0 +1,8 @@ + +export function getMemory() { + const memory = process.memoryUsage(); + return { + heapUsed: memory.heapUsed, + heapTotal: memory.heapTotal + }; +}