From 78ef5bf37920d217aae5c5acb504c9cbdf4cf2a5 Mon Sep 17 00:00:00 2001 From: Mirco Wittrien Date: Mon, 11 Nov 2019 15:13:59 +0100 Subject: [PATCH] Update ForceImagePreviews.plugin.js --- .../ForceImagePreviews.plugin.js | 162 +++++++++--------- 1 file changed, 77 insertions(+), 85 deletions(-) diff --git a/Plugins/ForceImagePreviews/ForceImagePreviews.plugin.js b/Plugins/ForceImagePreviews/ForceImagePreviews.plugin.js index e77e14c7a3..ee2b1c1a58 100644 --- a/Plugins/ForceImagePreviews/ForceImagePreviews.plugin.js +++ b/Plugins/ForceImagePreviews/ForceImagePreviews.plugin.js @@ -3,7 +3,7 @@ class ForceImagePreviews { getName () {return "ForceImagePreviews";} - getVersion () {return "1.1.3";} + getVersion () {return "1.1.4";} getAuthor () {return "DevilBro";} @@ -11,11 +11,7 @@ class ForceImagePreviews { constructor () { this.changelog = { - "fixed":[["Light Theme Update","Fixed bugs for the Light Theme Update, which broke 99% of my plugins"]] - }; - - this.patchModules = { - "Message":"componentDidMount" + "improved":[["New Library Structure & React","Restructured my Library and switched to React rendering instead of DOM manipulation"]] }; } @@ -47,8 +43,19 @@ class ForceImagePreviews { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { if (this.started) return; BDFDB.PluginUtils.init(this); - - BDFDB.ModuleUtils.forceAllUpdates(this); + + BDFDB.ModuleUtils.patch(this, BDFDB.ModuleUtils.findByName("MessageAccessories").prototype, "render", {before: e => { + if (e.thisObject.props.message.content) { + let message = new BDFDB.DiscordObjects.Message(e.thisObject.props.message); + for (let word of e.thisObject.props.message.content.split(/\n|\s|\r|\t|\0/g)) if (word.indexOf("https://") > -1 || word.indexOf("http://") > -1) { + word = word.indexOf("<") == 0 && word.indexOf(">") == word.length-1 ? word.slice(1,-1) : word; + if (!this.isEmbedded(message.embeds, word)) this.injectEmbed(e.thisObject, message.embeds, word); + } + e.thisObject.props.message = message; + } + }}); + + BDFDB.ReactUtils.forceUpdate(BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.app), {name:"MessageAccessories", all:true, noCopies:true, unlimited:true})); } else console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not load BD functions!"); } @@ -56,92 +63,77 @@ class ForceImagePreviews { stop () { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { this.stopping = true; - - BDFDB.DOMUtils.remove(".FIP-embed"); + + BDFDB.ReactUtils.forceUpdate(BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.app), {name:"MessageAccessories", all:true, noCopies:true, unlimited:true})); + BDFDB.PluginUtils.clear(this); } } // begin of own functions - - processMessage (instance, wrapper, returnvalue) { - if (instance.props.message) { - let accessory = wrapper.querySelector(BDFDB.dotCN.messageaccessory); - if (accessory) { - let links = []; - for (let word of instance.props.message.content.split(/\n|\s|\r|\t|\0/g)) { - if (word.indexOf("https://") > -1 || word.indexOf("http://") > -1) { - if (word.indexOf("<") == 0 && word.indexOf(">") == word.length-1) links.push({src:word.slice(1,-1),embedded:false}); - else if (!accessory.querySelector(`${BDFDB.dotCN.embedimage}[href="${this.parseSrc(word)}"]`) && !accessory.querySelector(`${BDFDB.dotCN.embedtitlelink}[href="${this.parseSrc(word)}"]`)) { - links.push({src:word,embedded:false}); - } - else links.push({src:word,embedded:true}); - } - } - if (links.length > 0) this.addItemToAccessory(null, links, accessory); - } - } - } - - addItemToAccessory (previmage, links, accessory) { - let item = links.shift(); - if (!item) return; - else if (item.embedded) this.addItemToAccessory(item, links, accessory); - else { - let itemsrc = this.parseSrc(item.src); - BDFDB.LibraryRequires.request(itemsrc, (error, response, result) => { - if (response && response.headers["content-type"] && response.headers["content-type"].indexOf("image") > -1) { - let imagethrowaway = document.createElement("img"); - imagethrowaway.src = itemsrc; - imagethrowaway.onload = () => { - let width = imagethrowaway.naturalWidth > 400 ? 400 : imagethrowaway.naturalWidth; - let height = Math.round(width*(imagethrowaway.naturalHeight/imagethrowaway.naturalWidth)); - if (height > 300) { - width = Math.round(width*(300/height)); - height = 300; - } - let checkedsrc = itemsrc.indexOf("imgur.com/") > -1 ? ("imgur.com/" + itemsrc.split("/")[3].split(".")[0]) : itemsrc; - if (!accessory.querySelector(`${BDFDB.dotCN.embedimage}[href*="${checkedsrc}"],${BDFDB.dotCN.embedgifv}[href*="${checkedsrc}"]`)) { - let embed = BDFDB.DOMUtils.create(`
`); - this.insertEmbed(embed, previmage, links, accessory); - } - this.addItemToAccessory(item, links, accessory); - }; - } - else if (response && response.headers["server"] && response.headers["server"].toLowerCase().indexOf("youtube") > -1 && result.indexOf("yt-user-info") > -1) { - if (!accessory.querySelector(`${BDFDB.dotCN.embedtitlelink}[href="${itemsrc}"]`)) { - result = result.replace(/[\r|\n|\t]|[\s]{2,}/g, ""); - let width = 400; - let height = Math.round(width*(result.split('
`); - BDFDB.ListenerUtils.addToChildren(embed, "click", BDFDB.dotCN.iconplay, () => { - let videowrapper = embed.querySelector(BDFDB.dotCN.embedvideo); - BDFDB.DOMUtils.remove(videowrapper.childNodes); - videowrapper.appendChild(BDFDB.DOMUtils.create(``)); + + injectEmbed (instance, embeds, link) { + BDFDB.LibraryRequires.request(link, (error, response, result) => { + if (response && response.headers["content-type"] && response.headers["content-type"].indexOf("image") > -1) { + let imagethrowaway = document.createElement("img"); + imagethrowaway.src = link; + imagethrowaway.onload = () => { + if (!this.isEmbedded(embeds, link)) { + embeds.push({ + image: { + url: link, + proxyURL: link, + height: imagethrowaway.naturalHeight, + width: imagethrowaway.naturalWidth + }, + type: "image", + url: link }); - this.insertEmbed(embed, previmage, links, accessory); + BDFDB.ReactUtils.forceUpdate(instance); } - this.addItemToAccessory(item, links, accessory); + }; + } + else if (response && response.headers["server"] && response.headers["server"].toLowerCase().indexOf("youtube") > -1 && result.indexOf("yt-user-info") > -1) { + if (!this.isEmbedded(embeds, link)) { + result = result.replace(/[\r|\n|\t]|[\s]{2,}/g, ""); + let width = result.split(new RegExp(BDFDB.StringUtils.regEscape('')[1].split('<')[0], + url: `https://www.youtube.com${result.split(new RegExp(BDFDB.StringUtils.regEscape('