BetterDiscordAddons/Plugins/DisplayLargeMessages/DisplayLargeMessages.plugin.js

372 lines
15 KiB
JavaScript
Raw Normal View History

2020-04-14 18:27:51 +02:00
//META{"name":"DisplayLargeMessages","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/DisplayLargeMessages","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/DisplayLargeMessages/DisplayLargeMessages.plugin.js"}*//
var DisplayLargeMessages = (_ => {
2020-05-23 11:45:38 +02:00
var encodedMessages, requestedMessages, oldMessages, updateTimeout;
2020-04-14 18:27:51 +02:00
return class DisplayLargeMessages {
getName () {return "DisplayLargeMessages";}
2020-05-23 13:21:27 +02:00
getVersion () {return "1.0.4";}
2020-04-14 18:27:51 +02:00
getAuthor () {return "DevilBro";}
getDescription () {return "Injects the contents of large messages that were sent by discord via 'message.txt'.";}
constructor () {
2020-04-19 14:01:52 +02:00
this.changelog = {
2020-05-23 11:45:38 +02:00
"added":[["Remove injection","You can now revert the on-demand injection after you clicked the inject button in the attachment, via clicking the newly loaded message and choosing 'unload'"]]
2020-04-19 14:01:52 +02:00
};
2020-04-14 18:27:51 +02:00
this.patchedModules = {
2020-04-19 14:01:52 +02:00
before: {
Messages: "render",
},
2020-04-14 18:27:51 +02:00
after: {
2020-04-19 14:01:52 +02:00
Attachment: "default"
2020-04-14 18:27:51 +02:00
}
};
}
initConstructor () {
encodedMessages = {};
2020-04-19 14:01:52 +02:00
requestedMessages = [];
2020-05-23 11:45:38 +02:00
oldMessages = {};
2020-04-19 14:01:52 +02:00
this.css = `
${BDFDB.dotCN._displaylargemessagesinjectbutton} {
2020-05-23 11:45:38 +02:00
color: var(--interactive-normal);
2020-04-19 14:01:52 +02:00
cursor: pointer;
margin-left: 4px;
}
${BDFDB.dotCN._displaylargemessagesinjectbutton}:hover {
2020-05-23 11:45:38 +02:00
color: var(--interactive-hover);
2020-04-19 14:01:52 +02:00
}`;
this.defaults = {
settings: {
onDemand: {value:false, description:"Inject the content of 'message.txt' on demand instead of automatically"}
},
amounts: {
maxFileSize: {value:10, min:0, description:"Max Filesize a fill will be read automatically", note: "in KB / 0 = inject all / ignored in On-Demand"}
}
};
}
getSettingsPanel (collapseStates = {}) {
if (!window.BDFDB || typeof BDFDB != "object" || !BDFDB.loaded || !this.started) return;
let settings = BDFDB.DataUtils.get(this, "settings");
let amounts = BDFDB.DataUtils.get(this, "amounts");
let settingsPanel, settingsItems = [];
for (let key in settings) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
className: BDFDB.disCN.marginbottom8,
type: "Switch",
plugin: this,
keys: ["settings", key],
label: this.defaults.settings[key].description,
value: settings[key],
onChange: _ => {
if (key == "onDemand") BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates);
}
}));
for (let key in amounts) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
className: BDFDB.disCN.marginbottom8,
type: "TextInput",
childProps: {
type: "number"
},
plugin: this,
keys: ["amounts", key],
disabled: key == "maxFileSize" && settings.onDemand,
label: this.defaults.amounts[key].description,
note: this.defaults.amounts[key].note,
basis: "20%",
min: this.defaults.amounts[key].min,
max: this.defaults.amounts[key].max,
value: amounts[key]
}));
return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems);
2020-04-14 18:27:51 +02:00
}
// Legacy
load () {}
start () {
if (!window.BDFDB) window.BDFDB = {myPlugins:{}};
if (window.BDFDB && window.BDFDB.myPlugins && typeof window.BDFDB.myPlugins == "object") window.BDFDB.myPlugins[this.getName()] = this;
let libraryScript = document.querySelector("head script#BDFDBLibraryScript");
if (!libraryScript || (performance.now() - libraryScript.getAttribute("date")) > 600000) {
if (libraryScript) libraryScript.remove();
libraryScript = document.createElement("script");
libraryScript.setAttribute("id", "BDFDBLibraryScript");
libraryScript.setAttribute("type", "text/javascript");
libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.min.js");
libraryScript.setAttribute("date", performance.now());
libraryScript.addEventListener("load", _ => {this.initialize();});
document.head.appendChild(libraryScript);
}
else if (window.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) this.initialize();
this.startTimeout = setTimeout(_ => {
try {return this.initialize();}
catch (err) {console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not initiate plugin! " + err);}
}, 30000);
}
initialize () {
if (window.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) {
if (this.started) return;
BDFDB.PluginUtils.init(this);
2020-04-19 14:01:52 +02:00
BDFDB.ModuleUtils.patch(this, BDFDB.LibraryModules.MessageUtils, "startEditMessage", {before: e => {
let encodedContent = encodedMessages[e.methodArguments[1]];
if (encodedContent != null) e.methodArguments[2] = encodedContent.content;
}});
BDFDB.ModuleUtils.patch(this, BDFDB.LibraryModules.MessageUtils, "editMessage", {before: e => {
let encodedContent = encodedMessages[e.methodArguments[1]];
2020-05-23 11:45:38 +02:00
let oldMessage = oldMessages[e.methodArguments[1]];
2020-04-19 14:01:52 +02:00
if (encodedContent != null) encodedContent.content = e.methodArguments[2].content;
2020-05-23 11:45:38 +02:00
if (oldMessage != null) oldMessage.content = e.methodArguments[2].content;
2020-04-19 14:01:52 +02:00
}});
2020-04-14 18:27:51 +02:00
2020-04-19 14:01:52 +02:00
this.forceUpdateAll();
2020-04-14 18:27:51 +02:00
}
else console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not load BD functions!");
}
stop () {
if (window.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) {
this.stopping = true;
2020-04-19 14:01:52 +02:00
this.forceUpdateAll();
2020-04-14 18:27:51 +02:00
BDFDB.PluginUtils.clear(this);
}
}
// Begin of own functions
2020-04-19 14:01:52 +02:00
onSettingsClosed () {
if (this.SettingsUpdated) {
delete this.SettingsUpdated;
encodedMessages = {};
requestedMessages = [];
this.forceUpdateAll();
}
}
2020-05-23 11:45:38 +02:00
onMessageContextMenu (e) {
if (e.instance.props.message && !requestedMessages.includes(e.instance.props.message.id)) {
let encodedContent = encodedMessages[e.instance.props.message.id];
if (encodedContent) {
let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "devmode-copy-id", group: true});
children.splice(index > -1 ? index : 0, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
label: this.labels.context_uninjectattchment_text,
id: BDFDB.ContextMenuUtils.createItemId(this.name, "uninject-attachment"),
action: _ => {
BDFDB.ContextMenuUtils.close(e.instance);
delete encodedMessages[e.instance.props.message.id];
BDFDB.ModuleUtils.forceAllUpdates(this, ["Messages", "Attachment"]);
}
})
}));
}
}
}
2020-04-14 18:27:51 +02:00
processMessages (e) {
2020-04-19 14:01:52 +02:00
let settings = BDFDB.DataUtils.get(this, "settings");
let amounts = BDFDB.DataUtils.get(this, "amounts");
2020-05-23 11:45:38 +02:00
e.instance.props.channelStream = [].concat(e.instance.props.channelStream);
for (let i in e.instance.props.channelStream) {
let message = e.instance.props.channelStream[i].content;
if (message) {
2020-05-23 14:00:14 +02:00
if (BDFDB.ArrayUtils.is(message.attachments)) this.checkMessage(e.instance, e.instance.props.channelStream[i], message, settings, amounts);
else if (BDFDB.ArrayUtils.is(message)) for (let j in message) {
let childMessage = message[j].content;
if (childMessage && BDFDB.ArrayUtils.is(childMessage.attachments)) this.checkMessage(e.instance, message[j], childMessage, settings, amounts);
2020-04-19 14:01:52 +02:00
}
2020-04-14 18:27:51 +02:00
}
}
}
2020-04-19 14:01:52 +02:00
2020-05-23 14:00:14 +02:00
checkMessage (instance, stream, message, settings, amounts) {
let encodedContent = encodedMessages[message.id];
if (encodedContent != null) {
if (message.content.indexOf(encodedContent.attachment) == -1) {
stream.content.content = (message.content && (message.content + "\n\n") || "") + encodedContent.attachment;
stream.content.attachments = message.attachments.filter(n => n.filename != "message.txt");
}
}
else if (oldMessages[message.id] && Object.keys(message).some(key => !BDFDB.equals(oldMessages[message.id][key], message[key]))) {
stream.content.content = oldMessages[message.id].content;
stream.content.attachments = oldMessages[message.id].attachments;
delete oldMessages[message.id];
}
else if (!settings.onDemand && !requestedMessages.includes(message.id)) for (let attachment of message.attachments) {
if (attachment.filename == "message.txt" && (!amounts.maxFileSize || (amounts.maxFileSize >= attachment.size/1024))) {
requestedMessages.push(message.id);
BDFDB.LibraryRequires.request(attachment.url, (error, response, body) => {
encodedMessages[message.id] = {
content: message.content || "",
attachment: body || ""
};
BDFDB.TimeUtils.clear(updateTimeout);
updateTimeout = BDFDB.TimeUtils.timeout(_ => {BDFDB.ReactUtils.forceUpdate(instance);}, 1000);
});
}
}
}
2020-04-19 14:01:52 +02:00
processAttachment (e) {
if (e.instance.props.filename == "message.txt") {
let settings = BDFDB.DataUtils.get(this, "settings");
let amounts = BDFDB.DataUtils.get(this, "amounts");
if (settings.onDemand || amounts.maxFileSize && (amounts.maxFileSize < e.instance.props.size/1024)) e.returnvalue.props.children.splice(2, 0, BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {
2020-05-23 11:45:38 +02:00
text: this.labels.button_injectattchment_text,
2020-04-19 14:01:52 +02:00
children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Anchor, {
rel: "noreferrer noopener",
target: "_blank",
children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, {
className: BDFDB.disCN._displaylargemessagesinjectbutton,
2020-04-19 14:48:46 +02:00
name: BDFDB.LibraryComponents.SvgIcon.Names.RAW_TEXT,
width: 20,
height: 20
2020-04-19 14:01:52 +02:00
}),
onClick: event => {
BDFDB.ListenerUtils.stopEvent(event);
2020-04-19 14:48:46 +02:00
let target = event.target;
let message = BDFDB.ReactUtils.findValue(target, "message", {up: true});
2020-04-19 14:01:52 +02:00
if (message) BDFDB.LibraryRequires.request(e.instance.props.url, (error, response, body) => {
2020-05-23 11:45:38 +02:00
oldMessages[message.id] = new BDFDB.DiscordObjects.Message(message);
2020-04-19 14:01:52 +02:00
encodedMessages[message.id] = {
content: message.content || "",
attachment: body || ""
};
2020-05-23 11:45:38 +02:00
BDFDB.ModuleUtils.forceAllUpdates(this, "Messages");
2020-04-19 14:01:52 +02:00
});
}
})
}));
}
}
forceUpdateAll () {
BDFDB.ModuleUtils.forceAllUpdates(this);
BDFDB.MessageUtils.rerenderAll();
}
2020-05-23 11:45:38 +02:00
setLabelsByLanguage () {
switch (BDFDB.LanguageUtils.getLanguage().id) {
case "hr": //croatian
return {
context_uninjectattchment_text: "Uklonite učitani sadržaj poruke",
button_injectattchment_text: "Učitajte sadržaj poruke"
};
case "da": //danish
return {
context_uninjectattchment_text: "Fjern indlæst meddelelsesindhold",
button_injectattchment_text: "Indlæs meddelelsesindhold"
};
case "de": //german
return {
context_uninjectattchment_text: "Geladenen Nachrichteninhalt entfernen",
button_injectattchment_text: "Nachrichteninhalt laden"
};
case "es": //spanish
return {
context_uninjectattchment_text: "Eliminar contenido del mensaje cargado",
button_injectattchment_text: "Cargar contenido del mensaje"
};
case "fr": //french
return {
context_uninjectattchment_text: "Supprimer le contenu du message chargé",
button_injectattchment_text: "Charger le contenu du message"
};
case "it": //italian
return {
context_uninjectattchment_text: "Rimuovi il contenuto del messaggio caricato",
button_injectattchment_text: "Carica il contenuto del messaggio"
};
case "nl": //dutch
return {
context_uninjectattchment_text: "Verwijder geladen berichtinhoud",
button_injectattchment_text: "Laad berichtinhoud"
};
case "no": //norwegian
return {
context_uninjectattchment_text: "Fjern lastet meldingens innhold",
button_injectattchment_text: "Last inn meldingens innhold"
};
case "pl": //polish
return {
context_uninjectattchment_text: "Usuń załadowaną treść wiadomości",
button_injectattchment_text: "Załaduj treść wiadomości"
};
case "pt-BR": //portuguese (brazil)
return {
context_uninjectattchment_text: "Remover o conteúdo da mensagem carregada",
button_injectattchment_text: "Carregar conteúdo da mensagem"
};
case "fi": //finnish
return {
context_uninjectattchment_text: "Poista ladattu viestin sisältö",
button_injectattchment_text: "Lataa viestin sisältö"
};
case "sv": //swedish
return {
context_uninjectattchment_text: "Ta bort laddat meddelandeinnehåll",
button_injectattchment_text: "Ladda meddelandets innehåll"
};
case "tr": //turkish
return {
context_uninjectattchment_text: "Yüklenen mesaj içeriğini kaldır",
button_injectattchment_text: "Mesaj içeriğini yükle"
};
case "cs": //czech
return {
context_uninjectattchment_text: "Odebrat načtený obsah zprávy",
button_injectattchment_text: "Načíst obsah zprávy"
};
case "bg": //bulgarian
return {
context_uninjectattchment_text: "Премахнете зареденото съдържание на съобщението",
button_injectattchment_text: "Заредете съдържание на съобщението"
};
case "ru": //russian
return {
context_uninjectattchment_text: "Удалить загруженное содержимое сообщения",
button_injectattchment_text: "Загрузить содержимое сообщения"
};
case "uk": //ukrainian
return {
context_uninjectattchment_text: "Видаліть завантажений вміст повідомлення",
button_injectattchment_text: "Завантажте вміст повідомлення"
};
case "ja": //japanese
return {
context_uninjectattchment_text: "ロードされたメッセージコンテンツを削除する",
button_injectattchment_text: "メッセージの内容を読み込む"
};
case "zh-TW": //chinese (traditional)
return {
context_uninjectattchment_text: "刪除已加載的郵件內容",
button_injectattchment_text: "加載消息內容"
};
case "ko": //korean
return {
context_uninjectattchment_text: "로드 된 메시지 내용 제거",
button_injectattchment_text: "메시지 내용로드"
};
default: //default: english
return {
context_uninjectattchment_text: "Remove loaded message content",
button_injectattchment_text: "Load message content"
};
}
}
2020-04-14 18:27:51 +02:00
}
})();