BD-js/plugins/SocialMediaLinkConverter.pl...

178 lines
5.3 KiB
JavaScript

/**
* @name SocialMediaLinkConverter
* @author Nears
* @description Changes Twitter, TikTok, Bsky, Threads, Reddit and Instagram links to their respective modified formats for proper embedding when shared on Discord.
* @donate https://ko-fi.com/royriver
* @source https://github.com/RoyRiv3r/SocialMediaLinkConverter.plugin.js
* @updateURL https://raw.githubusercontent.com/RoyRiv3r/SocialMediaLinkConverter.plugin.js/main/SocialMediaLinkConverter.plugin.js
* @version 0.0.8
*/
class SocialMediaLinkConverter {
constructor() {
this.settings = {
convertTwitter: true,
convertTikTok: true,
convertInstagram: true,
convertBsky: true,
convertThreads: true,
convertReddit: true,
};
this.conversionRules = [
{
id: "convertTwitter",
regex: /https:\/\/(twitter\.com|x\.com)\//g,
replacement: "https://fxtwitter.com/",
},
{
id: "convertTikTok",
regex: /https:\/\/www\.tiktok\.com\//g,
replacement: "https://www.vxtiktok.com/",
},
{
id: "convertInstagram",
regex: /https:\/\/www\.instagram\.com\//g,
replacement: "https://www.ddinstagram.com/",
},
{
id: "convertBsky",
regex: /https:\/\/bsky\.app\//g,
replacement: "https://bsyy.app/",
},
{
id: "convertThreads",
regex: /https:\/\/(www\.)?threads\.net\//g,
replacement: "https://www.vxthreads.net/",
},
{
id: "convertReddit",
regex: /https:\/\/(www\.|new\.)?reddit\.com\//g,
replacement: "https://www.rxddit.com/",
},
];
this.defaultConfig = this.conversionRules.map((rule) => ({
type: "switch",
id: rule.id,
note: `Convert ${rule.id.replace("convert", "")} links from original to ${
rule.replacement.match(/https?:\/\/(www\.)?([^\/]+)/)[2]
} format`,
value: true,
}));
}
load() {
this.settings =
BdApi.loadData("SocialMediaLinkConverter", "settings") || this.settings;
}
start() {
this.patchSendMessage();
this.patchUploadFiles();
}
stop() {
BdApi.Patcher.unpatchAll("SocialMediaLinkConverter");
}
patchSendMessage() {
const MessageActions = BdApi.findModuleByProps("sendMessage");
BdApi.Patcher.before(
"SocialMediaLinkConverter",
MessageActions,
"sendMessage",
(_, args) => {
let [channelId, message, messageId] = args;
this.conversionRules.forEach((rule) => {
if (this.settings[rule.id]) {
message.content = message.content.replace(
rule.regex,
rule.replacement
);
}
});
args[1] = message;
}
);
}
patchUploadFiles() {
const MessageActions = BdApi.findModuleByProps("uploadFiles");
BdApi.Patcher.before(
"SocialMediaLinkConverter",
MessageActions,
"uploadFiles",
(_, props) => {
if (props[0].parsedMessage && props[0].parsedMessage.content) {
this.conversionRules.forEach((rule) => {
if (this.settings[rule.id]) {
props[0].parsedMessage.content =
props[0].parsedMessage.content.replace(
rule.regex,
rule.replacement
);
}
});
}
}
);
}
getSettingsPanel() {
const panel = document.createElement("div");
this.defaultConfig.forEach((setting, index) => {
if (setting.type === "switch") {
const switchElement = this.createToggle(
setting.id.replace("convert", ""),
setting.note,
this.settings[setting.id],
(checked) => {
this.settings[setting.id] = checked;
BdApi.saveData(
"SocialMediaLinkConverter",
"settings",
this.settings
);
}
);
panel.appendChild(switchElement);
switchElement.querySelector(".toggle-note").style.color = "#FFFFFF";
if (index < this.defaultConfig.length - 1) {
const separator = document.createElement("hr");
separator.style.margin = "10px 0";
panel.appendChild(separator);
}
}
});
return panel;
}
createToggle(name, note, isChecked, onChange) {
const toggleContainer = document.createElement("div");
toggleContainer.className = "toggle-container";
const toggleNote = document.createElement("div");
toggleNote.className = "toggle-note";
toggleNote.textContent = note;
toggleContainer.appendChild(toggleNote);
const toggleLabel = document.createElement("label");
toggleLabel.className = "toggle";
toggleContainer.appendChild(toggleLabel);
const toggleInput = document.createElement("input");
toggleInput.type = "checkbox";
toggleInput.checked = isChecked;
toggleInput.onchange = (e) => onChange(e.target.checked);
toggleLabel.appendChild(toggleInput);
const toggleSlider = document.createElement("span");
toggleSlider.className = "slider round";
toggleLabel.appendChild(toggleSlider);
const toggleName = document.createElement("span");
toggleName.className = "toggle-name";
toggleName.textContent = name;
toggleContainer.appendChild(toggleName);
return toggleContainer;
}
}
module.exports = SocialMediaLinkConverter;