143 lines
6.4 KiB
JavaScript
143 lines
6.4 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
|
|
)
|
|
|
|
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")
|
|
}
|
|
}
|
|
})()
|