/// export default new (class PluginDownloader { async start() { const pluginLog = (msg, logFunc = console.info) => logFunc(`%c[${this.constructor.name}] `, "color:#14bbaa", msg) pluginLog("Started successfully") await Webpack.whenReady const { React } = Webpack.common const MiniPopover = Webpack.findByDisplayName("MiniPopover", { default: true, }) const Toasts = Object.assign( {}, ...Webpack.getByProps("showToast", "createToast", { bulk: true, }) ) const Tooltip = Webpack.findByDisplayName("Tooltip") const funcCopy = MiniPopover.default MiniPopover.default = (...args) => { const props = args[0].children.at?.(-1) ? args[0].children.at(-1).props : null const isPluginChannel = props.channel.id == "755005584322854972" const isThemeChannel = props.channel.id == "755005710323941386" const Button = () => { const [disabled, setDisabled] = React.useState(false) const gitURL = props.message.content.match( /((git@|http(s)?:\/\/)([\w\.@]+)(\/|:))([\w,\-,\_]+)\/([\w,\-,\_]+)(.git){0,1}((\/){0,1})/ ) return [ React.createElement( Tooltip, { position: "top", text: isPluginChannel ? "Install Plugin" : "Install Theme", }, (args) => React.createElement( MiniPopover.Button, { ...args, disabled: disabled, onClick: async () => { setDisabled(true) const { reloadMessage, error } = await window.download( gitURL, isPluginChannel ) isPluginChannel ? powercord.pluginManager.enablePlugin( gitURL[7] ) : powercord.styleManager.enableTheme( gitURL[7] ) if (reloadMessage) { Toasts.showToast( Toasts.createToast( `Successfully installed plugin/theme! ${ reloadMessage ? `${reloadMessage}.` : "" }`, Toasts.ToastType.SUCCESS ) ) pluginLog( `Successfully installed plugin/theme! ${ reloadMessage ? `${reloadMessage}.` : "" }` ) } else { Toasts.showToast( Toasts.createToast( "Failed to install plugin/theme, check console for error.", Toasts.ToastType.ERROR ) ) pluginLog( `Plugin/theme installation failed: ${error}`, console.error ) setDisabled(false) } }, }, React.createElement( "svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", class: "bi bi-arrow-down-circle-fill", viewBox: "0 0 16 16", }, React.createElement("path", { d: "M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z", }) ) ) ), React.createElement(MiniPopover.Separator), ] } if ( props?.message && props.channel && (isPluginChannel || isThemeChannel) ) args[0].children.unshift(React.createElement(Button)) return funcCopy.apply(this, args) } Object.assign(MiniPopover.default, funcCopy) pluginLog("Patched, ready to download plugins!") this.stop = () => { MiniPopover.default = funcCopy pluginLog("Stopped successfully") } } })()