diff --git a/UserpluginInstallButton.tsx b/UserpluginInstallButton.tsx new file mode 100644 index 0000000..0bb50c4 --- /dev/null +++ b/UserpluginInstallButton.tsx @@ -0,0 +1,19 @@ +import { Button, ChannelStore } from "@webpack/common"; +import { Message } from "discord-types/general"; +import { CLONE_LINK_REGEX, clonePlugin } from "."; + +const WHITELISTED_SHARE_CHANNELS = ["1256395889354997771", "1032200195582197831", "1301947896601509900"]; + +export default function UserpluginInstallButton({ props }: any) { + const message: Message = props.message; + if (!WHITELISTED_SHARE_CHANNELS.includes(ChannelStore.getChannel(message.channel_id).parent_id) && !WHITELISTED_SHARE_CHANNELS.includes(message.channel_id)) + return; + const gitLink = (props.message.content as string).match(CLONE_LINK_REGEX); + if (!gitLink) return; + return ; +} diff --git a/index.tsx b/index.tsx index c15f8f8..701d409 100644 --- a/index.tsx +++ b/index.tsx @@ -1,27 +1,34 @@ import { Notices } from "@api/index"; import { addAccessory } from "@api/MessageAccessories"; import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; -import { Button, ChannelStore, Forms } from "@webpack/common"; +import definePlugin, { PluginNative } from "@utils/types"; +import { Button, ChannelStore, Forms, Toasts } from "@webpack/common"; import { Message } from "discord-types/general"; +import { clone } from "lodash"; +import UserpluginInstallButton from "./UserpluginInstallButton"; -const WHITELISTED_SHARE_CHANNELS = ["1256395889354997771", "1032200195582197831"]; -const CLONE_LINK_REGEX = /(https:\/\/(?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org)\/[a-zA-Z0-9]+\/[a-zA-Z0-9]+(?:\.git)?(?:\/)?)/; +export const CLONE_LINK_REGEX = /https:\/\/(?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org)\/(?!user-attachments)(?:[a-zA-Z0-9]|-)+\/((?:[a-zA-Z0-9]|-)+)(?:\.git)?(?:\/)?/; -function UserpluginInstallButton({ props }: any) { - const message: Message = props.message; - if (!WHITELISTED_SHARE_CHANNELS.includes(ChannelStore.getChannel(message.channel_id).parent_id) && !WHITELISTED_SHARE_CHANNELS.includes(message.channel_id)) - return; - const gitLink = (props.message.content as string).match(CLONE_LINK_REGEX); - if (!gitLink) return; - return ; +// @ts-ignore +const Native = VencordNative.pluginHelpers.UserpluginInstaller as PluginNative; + +export async function clonePlugin(gitLink: RegExpMatchArray) { + Toasts.show({ + message: "Cloning plugin...", + id: Toasts.genId(), + type: Toasts.Type.MESSAGE + }); + try { + const clonedRepo = await Native.cloneRepo(gitLink[0], `${VesktopNative.fileManager.getVencordDir().replace("\\", "/")}/../src/userplugins/${gitLink[1]}`); + } + catch (e) { + Toasts.pop(); + return Toasts.show({ + message: "Something bad has happened while cloning the plugin, try again later and make sure that the plugin link is valid.", + id: Toasts.genId(), + type: Toasts.Type.FAILURE + }); + } } export default definePlugin({ diff --git a/native.ts b/native.ts new file mode 100644 index 0000000..af6de52 --- /dev/null +++ b/native.ts @@ -0,0 +1,15 @@ +import { exec, spawn } from "child_process"; +import { IpcMainInvokeEvent } from "electron"; + +export async function cloneRepo(_: IpcMainInvokeEvent, repo: string, clonePath: string): Promise { + return new Promise((resolve, reject) => { + exec(`git clone ${repo} ${clonePath}`, (error, stdout, stderr) => { + if (error) { + return reject( + stderr + ); + } + resolve(null); + }); + }); +}