This repository has been archived on 2025-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
kernel-powercord-plugin-dow.../renderer.js
2022-06-15 11:35:53 -04:00

135 lines
5.9 KiB
JavaScript

/// <reference path="../webpack/types.d.ts" />
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
)
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")
}
}
})()