diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 225f513..fb384e7 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -2,32 +2,33 @@ name: Build and deploy
on:
push:
- branches: [main]
+ branches: [main, master]
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
- permissions:
- contents: write
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v2
- name: Prepare environment
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v2
with:
- node-version: "22"
+ node-version: 22
+
+ - run: npm install --global pnpm
- name: Install deps
- run: npm install
+ run: pnpm m i
- name: Build plugin(s)
- run: npm run build
+ run: node ./build.mjs
- # Foolproof feature:
- # - Copies over README so that the root of the deployed website shows it
- # - Changes 404 page to README so that you don't get lost while clicking links
- # If you remove this step then you should probably remove the enable_jekyll option in the next one
- name: Copy additional files
run: |
cp README.md dist/README.md
@@ -35,13 +36,9 @@ jobs:
printf -- "> **Note:** You accessed a link that returned a 404, probably by clicking one of the plugin links. You're supposed to copy the link address and add it into Vendetta.\n\n" >> dist/404.md
cat README.md >> dist/404.md
- # Documentation: https://github.com/peaceiris/actions-gh-pages
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
- # Makes it so the md files in the previous step get processed by GitHub Pages
enable_jekyll: true
- # This creates the CNAME file required to host GitHub Pages on a custom domain
- # cname: example.com
diff --git a/plugins/Commands/settings.tsx b/plugins/Commands/settings.tsx
index 209797f..49e1642 100644
--- a/plugins/Commands/settings.tsx
+++ b/plugins/Commands/settings.tsx
@@ -40,6 +40,7 @@ if (!storage.enabledCommands) {
konoself: true,
konosend: true,
firstmessage: true,
+ sysinfo: true,
};
}
@@ -190,6 +191,16 @@ export default function Settings() {
/>
+ {/* System Commands */}
+
+ handleCommandToggle("sysinfo", v)}
+ />
+
+
{/* Credits */}
@@ -200,6 +211,7 @@ export default function Settings() {
subLabel="by btmc727 & Rico040"
/>
+
{/* About */}
diff --git a/plugins/Commands/src/commands/sysinfo.ts b/plugins/Commands/src/commands/sysinfo.ts
index b046bba..ce42d25 100644
--- a/plugins/Commands/src/commands/sysinfo.ts
+++ b/plugins/Commands/src/commands/sysinfo.ts
@@ -1,120 +1,191 @@
import { findByProps } from "@vendetta/metro";
import { getDebugInfo } from "@vendetta/debug";
import { ReactNative } from "@vendetta/metro/common";
-import { NativeModules } from "@vendetta/metro/common/ReactNative";
+import { storage } from "@vendetta/plugin";
+const MessageActions = findByProps("sendMessage");
const messageUtil = findByProps("sendBotMessage", "sendMessage", "receiveMessage");
-// Hardware info function
-const hwinfo = () => {
- const { cpuCoreCount, cpuPercentage, memory } = findByProps("memory");
- const cpuPerc = cpuPercentage.toFixed(2) + "%";
- const memUsage = parseFloat((memory / 1000).toPrecision(3)) + " MB";
- const { type, details } = Object.values(
- findByProps("useNetInfo").fetch(),
- ).filter((i) => i?.type)[0];
- let netInfo = "";
- const networkMap = {
- wifi: "WiFi",
- ethernet: "Ethernet",
- other: "Unknown",
- bluetooth: "Bluetooth",
- wimax: "WiMAX",
- vpn: "VPN",
- cellular: details.cellularGeneration?.toUpperCase() || "Cellular",
- };
- netInfo = networkMap[type] ?? type;
- return { cpuCoreCount, cpuPerc, memUsage, netInfo };
-};
-
-// Device info function
-const deviceInfo = () => {
+// Device info helper
+function getDeviceInfo() {
let { height, width, scale } = ReactNative.Dimensions.get("screen");
height *= scale;
width *= scale;
- return {
- width,
- height,
- };
-};
+ return { width, height };
+}
-// Discord info function
-const discordinfo = () => {
- return (
- NativeModules.InfoDictionaryManager ?? NativeModules.RTNClientInfoManager
- );
-};
-
-// Generate debug info
-const genDebug = () => {
+// Hardware info helper
+function getHardwareInfo() {
try {
- const { cpuCoreCount, cpuPerc, memUsage, netInfo } = hwinfo();
+ const hwProps = findByProps("memory");
+ if (!hwProps) return { cpuCoreCount: "N/A", cpuPerc: "N/A", memUsage: "N/A", netInfo: "N/A" };
+
+ const { cpuCoreCount, cpuPercentage, memory } = hwProps;
+ const cpuPerc = cpuPercentage ? cpuPercentage.toFixed(2) + "%" : "N/A";
+ const memUsage = memory ? parseFloat((memory / 1000).toPrecision(3)) + " MB" : "N/A";
+
+ let netInfo = "N/A";
+ try {
+ const netInfoModule = findByProps("useNetInfo");
+ if (netInfoModule) {
+ const networkData = Object.values(netInfoModule.fetch()).filter((i: any) => i?.type)[0] as any;
+ if (networkData) {
+ const { type, details } = networkData;
+ const networkMap: Record = {
+ wifi: "WiFi",
+ ethernet: "Ethernet",
+ other: "Unknown",
+ bluetooth: "Bluetooth",
+ wimax: "WiMAX",
+ vpn: "VPN",
+ cellular: details?.cellularGeneration?.toUpperCase() || "Cellular",
+ };
+ netInfo = networkMap[type] ?? type;
+ }
+ }
+ } catch (e) {
+ console.warn("Network info unavailable:", e);
+ }
+
+ return { cpuCoreCount, cpuPerc, memUsage, netInfo };
+ } catch (e) {
+ console.warn("Hardware info unavailable:", e);
+ return { cpuCoreCount: "N/A", cpuPerc: "N/A", memUsage: "N/A", netInfo: "N/A" };
+ }
+}
- const { ReleaseChannel: discordBranch } = discordinfo();
+// Discord info helper
+function getDiscordInfo() {
+ try {
+ const { NativeModules } = ReactNative;
+ const discordInfo = NativeModules.InfoDictionaryManager ?? NativeModules.RTNClientInfoManager;
+ return discordInfo || {};
+ } catch (e) {
+ console.warn("Discord info unavailable:", e);
+ return {};
+ }
+}
+
+// Generate system info
+function generateSystemInfo() {
+ try {
+ const { cpuCoreCount, cpuPerc, memUsage, netInfo } = getHardwareInfo();
+ const discordInfo = getDiscordInfo();
const { vendetta, discord, react, hermes, os, device } = getDebugInfo();
- const { version: HermesRelease, bytecodeVersion: HermesBytecode } = hermes;
- const { version: ReactVersion, nativeVersion: RNVersion } = react;
- const { name: osName, version: osVersion, sdk: osSdk } = os;
+
+ const { version: HermesRelease, bytecodeVersion: HermesBytecode } = hermes || {};
+ const { version: ReactVersion, nativeVersion: RNVersion } = react || {};
+ const { name: osName, version: osVersion, sdk: osSdk } = os || {};
const {
manufacturer: deviceManufacturer,
brand: deviceBrand,
model: deviceModel,
codename: deviceCodename,
- } = device;
- const { version: vendettaVersion } = vendetta;
- const { version: discordVersion, build: discordBuild } = discord;
+ } = device || {};
+ const { version: vendettaVersion } = vendetta || {};
+ const { version: discordVersion, build: discordBuild } = discord || {};
+ const { ReleaseChannel: discordBranch } = discordInfo;
- const deviceName =
- osName == "iOS" ? deviceCodename : `${deviceBrand} ${deviceModel}`;
-
- const { width, height } = deviceInfo();
+ const deviceName = osName == "iOS" ? deviceCodename : `${deviceBrand} ${deviceModel}`;
+ const { width, height } = getDeviceInfo();
let output = {
Device: {
- Device: deviceName,
- Model: deviceModel,
- Manufacturer: deviceManufacturer,
- Brand: deviceBrand,
- Display: width + "x" + height,
+ Device: deviceName || "Unknown",
+ Model: deviceModel || "Unknown",
+ Manufacturer: deviceManufacturer || "Unknown",
+ Brand: deviceBrand || "Unknown",
+ Display: `${width}x${height}`,
},
Hardware: {
- "CPU Cores": cpuCoreCount,
+ "CPU Cores": cpuCoreCount || "N/A",
Network: netInfo,
},
Software: {
- OS: osName,
- Version: osVersion,
+ OS: osName || "Unknown",
+ Version: osVersion || "Unknown",
},
Discord: {
- Branch: discordBranch,
- Version: discordVersion,
- Build: discordBuild,
- Vendetta: vendettaVersion,
+ Branch: discordBranch || "Unknown",
+ Version: discordVersion || "Unknown",
+ Build: discordBuild || "Unknown",
+ Vendetta: vendettaVersion || "Unknown",
"CPU Usage": cpuPerc,
"Memory Usage": memUsage,
},
React: {
- Version: ReactVersion,
- "Hermes Bytecode": HermesBytecode,
- Hermes: HermesRelease,
- Native: RNVersion,
+ Version: ReactVersion || "Unknown",
+ "Hermes Bytecode": HermesBytecode || "Unknown",
+ Hermes: HermesRelease || "Unknown",
+ Native: RNVersion || "Unknown",
},
};
- if (window.enmity) {
- output.Discord.Enmity = window.enmity.version;
+
+ // Add additional mod versions if available
+ if ((window as any).enmity) {
+ output.Discord.Enmity = (window as any).enmity.version;
}
- if (window.aliucord) {
- output.Discord.Aliucord = window.aliucord.version;
+ if ((window as any).aliucord) {
+ output.Discord.Aliucord = (window as any).aliucord.version;
}
if (osSdk) {
output.Software["SDK Version"] = osSdk;
}
+
return output;
} catch (e) {
- console.error(e);
+ console.error("Error generating system info:", e);
throw e;
}
-};
+}
+
+// Initialize storage defaults
+const categories = ["device", "hardware", "software", "discord", "react", "ephemeral"];
+for (const cat of categories) {
+ if (storage[cat] === undefined) storage[cat] = true;
+}
+
+// Command execution function
+function sysinfoCommand(args: any[], ctx: any) {
+ try {
+ let output = ["__System Information__\n"];
+ const data = generateSystemInfo();
+
+ Object.keys(data).forEach((option) => {
+ const permit = storage[option.toLowerCase()];
+ const slasharg = args.find((i) => i.name == option.toLowerCase());
+ const slashval = slasharg?.value ?? permit;
+
+ if ((slashval || permit) && !(permit && !slashval)) {
+ output.push(`[**${option}**]`);
+ Object.keys(data[option as keyof typeof data]).forEach((subOption) => {
+ output.push(`> ${subOption}: ${(data[option as keyof typeof data] as any)[subOption]}`);
+ });
+ }
+ });
+
+ const epermit = storage["ephemeral"];
+ const ephemeral = args.find((i) => i.name == "ephemeral")?.value ?? epermit;
+
+ if ((ephemeral || epermit) && !(epermit && !ephemeral)) {
+ messageUtil.sendBotMessage(ctx.channel.id, output.join("\n"));
+ return { type: 4 };
+ } else {
+ const fixNonce = Date.now().toString();
+ MessageActions.sendMessage(
+ ctx.channel.id,
+ { content: output.join("\n") },
+ void 0,
+ { nonce: fixNonce }
+ );
+ return { type: 4 };
+ }
+ } catch (e) {
+ console.error("[Sysinfo] Error:", e);
+ messageUtil.sendBotMessage(ctx.channel.id, "Failed to generate system information. Please try again.");
+ return { type: 4 };
+ }
+}
export const sysinfoCommand = {
name: "sysinfo",
@@ -127,100 +198,19 @@ export const sysinfoCommand = {
displayName: "ephemeral",
description: "Keep sysinfo ephemeral (default: true)",
displayDescription: "Keep sysinfo ephemeral (default: true)",
- type: 5, // BOOLEAN type
+ type: 5,
required: false,
},
- {
- name: "device",
- displayName: "device",
- description: "Display the device section",
- displayDescription: "Display the device section",
- type: 5, // BOOLEAN type
+ ...categories.slice(0, -1).map((cat) => ({
+ name: cat,
+ displayName: cat,
+ description: `Display the ${cat} section. Set default in settings.`,
+ displayDescription: `Display the ${cat} section. Set default in settings.`,
+ type: 5,
required: false,
- },
- {
- name: "hardware",
- displayName: "hardware",
- description: "Display the hardware section",
- displayDescription: "Display the hardware section",
- type: 5, // BOOLEAN type
- required: false,
- },
- {
- name: "software",
- displayName: "software",
- description: "Display the software section",
- displayDescription: "Display the software section",
- type: 5, // BOOLEAN type
- required: false,
- },
- {
- name: "discord",
- displayName: "discord",
- description: "Display the discord section",
- displayDescription: "Display the discord section",
- type: 5, // BOOLEAN type
- required: false,
- },
- {
- name: "react",
- displayName: "react",
- description: "Display the react section",
- displayDescription: "Display the react section",
- type: 5, // BOOLEAN type
- required: false,
- },
+ })),
],
- execute: async (args: any, ctx: any) => {
- try {
- const options = new Map(args.map((option: any) => [option.name, option]));
-
- // Default settings - show all sections by default
- const defaultSettings = {
- device: true,
- hardware: true,
- software: true,
- discord: true,
- react: true,
- ephemeral: true,
- };
-
- let output = ["__System Information__\n"];
- const data = genDebug();
-
- Object.keys(data).forEach((section) => {
- const sectionKey = section.toLowerCase();
- const argValue = options.get(sectionKey)?.value;
- const shouldShow = argValue !== undefined ? argValue : defaultSettings[sectionKey];
-
- if (shouldShow) {
- output.push(`[**${section}**]`);
- Object.keys(data[section]).forEach((subOption) => {
- output.push(`> ${subOption}: ${data[section][subOption]}`);
- });
- }
- });
-
- const ephemeralArg = options.get("ephemeral")?.value;
- const isEphemeral = ephemeralArg !== undefined ? ephemeralArg : defaultSettings.ephemeral;
-
- if (isEphemeral) {
- messageUtil.sendBotMessage(ctx.channel.id, output.join("\n"));
- return { type: 4 };
- } else {
- return {
- type: 4,
- data: {
- content: output.join("\n")
- }
- };
- }
- } catch (error) {
- console.error("[Sysinfo] Error:", error);
- messageUtil.sendBotMessage(ctx.channel.id, "Failed to generate system information. Please try again.");
- return { type: 4 };
- }
- },
+ execute: sysinfoCommand,
applicationId: "-1",
inputType: 1,
type: 1,