pc-redirect/index.js
milky 9a4639194e
♻️ Cleaned up
Signed-off-by: milky <op@gfy.lol>
2022-07-16 13:13:14 -07:00

136 lines
4.9 KiB
JavaScript

/* Copyright (C) 2020 TaiAurori (Gabriel Sylvain) - All Rights Reserved
* You may use, distribute and modify this code under the
* terms of the MIT license.
* Basically, you can change and redistribute this code
* but this copyright notice must remain unmodified.
*/
let settings;
const { Plugin } = require("powercord/entities");
const { inject, uninject } = require("powercord/injector");
const { getModule, React } = require("powercord/webpack");
const { findInReactTree } = require("powercord/util");
const { clipboard } = getModule(["clipboard"], false) || {};
const Settings = require("./Settings");
const services = require("./services.js");
const redirectLinkColor = "#0091ff"
module.exports = class EmbedRedirect extends Plugin {
startPlugin() {
settings = this.settings;
powercord.api.settings.registerSettings(this.entityID, {
category: this.entityID,
label: this.manifest.name,
render: Settings
});
this.initInject();
}
trimLink(link) {
let trimmed = link
if (trimmed.startsWith("https://") || trimmed.startsWith("http://")) trimmed = trimmed.split("://")[1]
if (trimmed.endsWith("/")) trimmed = trimmed.slice(0, trimmed.length - 1)
if (trimmed.includes("/")) trimmed = trimmed.split("/")[0]
trimmed = trimmed.trim() // trimmed x1000
return trimmed
}
async initInject() {
inject("embed-redirect", (await getModule(["MessageAccessories"])), "default", (args, res) => {
res.props.message.embeds = res.props.message.embeds.map((embed) => {
services.forEach((s) => {
if (settings.get(s.name.toLowerCase() + "Active", true)) {
if (s.embedMatches(embed)) {
s.replaceEmbed(embed, settings)
}
}
})
return embed
})
return res;
})
let Anchor = await getModule(m => m.default?.displayName === "Anchor")
inject("embed-redirect-link", Anchor, "default", (args, res) => {
if (res.props.href) {
let trimmed = this.trimLink(res.props.href)
if (trimmed in services.guide) {
let service = services[services.guide[trimmed]]
if (service) {
if (settings.get(service.name.toLowerCase() + "LinkActive", true)) {
service.replaceLink(res, settings)
}
}
}
}
return res
})
Anchor.default.displayName = "Anchor"
inject("embed-redirect-textbox-link", (await getModule(m => m.default?.displayName === "SlateChannelTextArea")).default.prototype, "render", (args, res) => {
if (settings.get("enableCosmetics", true)) {
setTimeout(() => { // yes this is a dumb workaround, no i dont care
let inputItems = res.props.children[1].ref.current.children[0]?.children[0]?.children[0]?.children
if (inputItems) {
for (let item in inputItems) {
if (!isNaN(new Number(item).valueOf())) {
if (inputItems[item].children[0].className.includes("fakeLink")) {
let trimmed = this.trimLink(inputItems[item].children[0].children[0].innerText)
if (trimmed in services.guide) {
let service = services[services.guide[trimmed]]
if (service) {
if (settings.get(service.name.toLowerCase() + "LinkActive", true)) {
inputItems[item].children[0].children[0].style.color = redirectLinkColor
}
}
}
}
}
}
}
}, 0)
}
return res
})
const Menu = await getModule(['MenuGroup', 'MenuItem'])
const MessageContextMenu = await getModule(m => m.default && m.default.displayName == 'MessageContextMenu')
inject('embed-redirect-context-menu', MessageContextMenu, 'default', (args, res) => {
if (args[0].target.tagName.toLowerCase() == "a" && args[0].target.getAttribute("originallink")) {
if (!findInReactTree(res, e => e.props && e.props.id == 'copy-redirected-link')) {
let copyLink = findInReactTree(res, e => e.props && e.props.id == 'copy-native-link');
let openLink = findInReactTree(res, e => e.props && e.props.id == 'open-native-link');
let copyLinkGroup = findInReactTree(res, e => e.props && e.props.children && e.props.children[0] && e.props.children[0].props && e.props.children[0].props.id == 'copy-native-link');
if (copyLink) {
(copyLinkGroup ? copyLinkGroup : res).props.children.splice((copyLinkGroup ? 1 : 2), 0,
React.createElement(Menu.MenuItem,
{
action: () => { clipboard.copy(args[0].target.getAttribute("href")) },
id: 'copy-redirected-link',
label: 'Copy Redirected Link'
}
)
)
copyLink.props.action = () => { clipboard.copy(args[0].target.getAttribute("originallink")) }
openLink.props.action = () => { window.open(args[0].target.getAttribute("originallink")) }
}
}
}
return res
})
MessageContextMenu.default.displayName = 'MessageContextMenu'
}
pluginWillUnload() {
powercord.api.settings.unregisterSettings(this.entityID);
uninject("embed-redirect");
uninject("embed-redirect-link");
uninject("embed-redirect-context-menu");
uninject("embed-redirect-textbox-link");
};
};