Rework core integration: validated capability layer, docs, and session state

This commit is contained in:
Fisto
2026-09-11 14:09:04 +02:00
parent 2a15f057df
commit e62d3007d8
33 changed files with 1897 additions and 612 deletions
+1 -67
View File
@@ -4,8 +4,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { openPrivateChannel, sendMessage } from "@vencord/types/utils";
import { ChannelStore, GuildStore, MessageStore, SettingsRouter, UserStore } from "@vencord/types/webpack/common";
import { SettingsRouter } from "@vencord/types/webpack/common";
import { IpcCommands } from "shared/IpcEvents";
import { openScreenSharePicker } from "./components/ScreenSharePicker";
@@ -53,68 +52,3 @@ onIpcCommand(IpcCommands.NAVIGATE_SETTINGS, () => {
onIpcCommand(IpcCommands.GET_LANGUAGES, () => navigator.languages);
onIpcCommand(IpcCommands.SCREEN_SHARE_PICKER, data => openScreenSharePicker(data.screens, data.skipPicker));
/* Veskslop puppet handlers */
onIpcCommand(IpcCommands.STATE_GET, () => {
const user = UserStore.getCurrentUser();
const guilds = GuildStore.getGuildsArray().map(guild => {
const channels = Object.values(ChannelStore.getMutableBasicGuildChannelsForGuild(guild.id)).map(channel => ({
id: channel.id,
name: channel.name,
type: channel.type
}));
return { id: guild.id, name: guild.name, channels };
});
return { user: { id: user.id, username: user.username }, guilds };
});
onIpcCommand(IpcCommands.MESSAGE_SEND, async (data: { channelId?: string; content?: string }) => {
if (!data?.channelId || typeof data.content !== "string") {
throw new Error("message:send requires { channelId, content }");
}
await sendMessage(data.channelId, { content: data.content }, false);
return { channelId: data.channelId, sent: true };
});
onIpcCommand(IpcCommands.MESSAGE_READ, (data: { channelId?: string; limit?: number }) => {
if (!data?.channelId) throw new Error("message:read requires { channelId }");
const limit = Math.min(Math.max(data.limit ?? 20, 1), 100);
const messages = MessageStore.getMessages(data.channelId)?._array ?? [];
return {
channelId: data.channelId,
cached: messages.length,
messages: messages.slice(-limit).map(message => ({
id: message.id,
author: { id: message.author.id, username: message.author.username },
content: message.content,
timestamp: message.timestamp
}))
};
});
onIpcCommand(IpcCommands.DM_SEND, async (data: { userId?: string; content?: string }) => {
if (!data?.userId || typeof data.content !== "string") {
throw new Error("dm:send requires { userId, content }");
}
let channelId = ChannelStore.getDMFromUserId(data.userId);
if (!channelId) {
openPrivateChannel(data.userId);
for (let i = 0; i < 20 && !channelId; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
channelId = ChannelStore.getDMFromUserId(data.userId);
}
}
if (!channelId) throw new Error(`No DM channel for user ${data.userId} yet`);
await sendMessage(channelId, { content: data.content }, false);
return { userId: data.userId, channelId, sent: true };
});