ReverseImageSearch now uses patching instead of observing

This commit is contained in:
Mirco Wittrien 2019-01-03 11:30:54 +01:00
parent 23abc5a702
commit 8b034a36e4
2 changed files with 93 additions and 93 deletions

View File

@ -47,7 +47,7 @@ class GoogleSearchReplace {
getDescription () {return "Replaces the default Google Text Search with a selection menu of several search engines.";} getDescription () {return "Replaces the default Google Text Search with a selection menu of several search engines.";}
getVersion () {return "1.1.5";} getVersion () {return "1.1.6";}
getAuthor () {return "DevilBro";} getAuthor () {return "DevilBro";}
@ -121,37 +121,50 @@ class GoogleSearchReplace {
this.messageContextSubMenuMarkup = this.messageContextSubMenuMarkup.replace("REPLACE_submenu_disabled_text", this.labels.submenu_disabled_text); this.messageContextSubMenuMarkup = this.messageContextSubMenuMarkup.replace("REPLACE_submenu_disabled_text", this.labels.submenu_disabled_text);
} }
onNativeContextMenu (instance, menu) {
if (instance.props && instance.props.type == "NATIVE_TEXT" && instance.props.value && !menu.querySelector(".reverseimagesearch-item")) {
let searchinstance = BDFDB.getOwnerInstance({node:menu,props:["handleSearchWithGoogle"]});
if (searchinstance && searchinstance._reactInternalFiber && searchinstance._reactInternalFiber.return && searchinstance._reactInternalFiber.return.stateNode) {
this.appendItem(instance, searchinstance._reactInternalFiber.return.stateNode, instance.props.value);
}
}
}
onMessageContextMenu (instance, menu) { onMessageContextMenu (instance, menu) {
if (instance.props && instance.props.message && instance.props.channel && instance.props.target && !menu.querySelector(".googlereplacesearch-item")) { if (instance.props && instance.props.message && instance.props.channel && instance.props.target && !menu.querySelector(".googlereplacesearch-item")) {
let text = document.getSelection().toString(); let text = document.getSelection().toString();
let searchinstance = BDFDB.getOwnerInstance({node:menu,props:["handleSearchWithGoogle"]}); let searchinstance = BDFDB.getOwnerInstance({node:menu,props:["handleSearchWithGoogle"]});
if (text && searchinstance && searchinstance._reactInternalFiber && searchinstance._reactInternalFiber.return && searchinstance._reactInternalFiber.return.stateNode) { if (text && searchinstance && searchinstance._reactInternalFiber && searchinstance._reactInternalFiber.return && searchinstance._reactInternalFiber.return.stateNode) {
$(this.messageContextEntryMarkup).appendTo(searchinstance._reactInternalFiber.return.stateNode) this.appendItem(instance, searchinstance._reactInternalFiber.return.stateNode, text);
.on("mouseenter", (e) => {
let messageContextSubMenu = $(this.messageContextSubMenuMarkup)[0];
let engines = BDFDB.getAllData(this, "engines");
$(messageContextSubMenu)
.on("click", ".GRS-item", (e2) => {
instance._reactInternalFiber.return.memoizedProps.closeContextMenu();
let engine = e2.currentTarget.getAttribute("engine");
if (engine == "_all") {
for (let key in engines) {
if (key != "_all" && engines[key]) {
window.open(this.defaults.engines[key].url.replace(this.textUrlReplaceString, encodeURIComponent(text)), "_blank");
}
}
}
else window.open(this.defaults.engines[engine].url.replace(this.textUrlReplaceString, encodeURIComponent(text)), "_blank");
});
for (let key in engines) if (!engines[key]) BDFDB.removeEles(messageContextSubMenu.querySelector("[engine='" + key + "']"));
if (messageContextSubMenu.querySelector(".GRS-item")) BDFDB.removeEles(messageContextSubMenu.querySelector(".alldisabled-item"));
BDFDB.appendSubMenu(e.currentTarget, messageContextSubMenu);
});
searchinstance._reactInternalFiber.return.stateNode.firstElementChild.style.setProperty("display", "none", "important");
} }
} }
} }
appendItem (instance, target, text) {
$(this.messageContextEntryMarkup).appendTo(target)
.on("mouseenter", (e) => {
let messageContextSubMenu = $(this.messageContextSubMenuMarkup)[0];
let engines = BDFDB.getAllData(this, "engines");
$(messageContextSubMenu)
.on("click", ".GRS-item", (e2) => {
instance._reactInternalFiber.return.memoizedProps.closeContextMenu();
let engine = e2.currentTarget.getAttribute("engine");
if (engine == "_all") {
for (let key in engines) {
if (key != "_all" && engines[key]) {
window.open(this.defaults.engines[key].url.replace(this.textUrlReplaceString, encodeURIComponent(text)), "_blank");
}
}
}
else window.open(this.defaults.engines[engine].url.replace(this.textUrlReplaceString, encodeURIComponent(text)), "_blank");
});
for (let key in engines) if (!engines[key]) BDFDB.removeEles(messageContextSubMenu.querySelector("[engine='" + key + "']"));
if (messageContextSubMenu.querySelector(".GRS-item")) BDFDB.removeEles(messageContextSubMenu.querySelector(".alldisabled-item"));
BDFDB.appendSubMenu(e.currentTarget, messageContextSubMenu);
});
target.firstElementChild.style.setProperty("display", "none", "important");
}
setLabelsByLanguage () { setLabelsByLanguage () {
switch (BDFDB.getDiscordLanguage().id) { switch (BDFDB.getDiscordLanguage().id) {
case "hr": //croatian case "hr": //croatian

View File

@ -30,13 +30,13 @@ class ReverseImageSearch {
this.messageContextSubMenuMarkup = this.messageContextSubMenuMarkup =
`<div class="${BDFDB.disCN.contextmenu} reverseImageSearchSubMenu"> `<div class="${BDFDB.disCN.contextmenu} reverseimagesearch-submenu">
<div class="${BDFDB.disCN.contextmenuitemgroup}"> <div class="${BDFDB.disCN.contextmenuitemgroup}">
<div class="${BDFDB.disCN.contextmenuitem} alldisabled-item ${BDFDB.disCN.contextmenuitemdisabled}"> <div class="${BDFDB.disCN.contextmenuitem} alldisabled-item ${BDFDB.disCN.contextmenuitemdisabled}">
<span class="DevilBro-textscrollwrapper" speed=3><div class="DevilBro-textscroll">REPLACE_submenu_disabled_text</div></span> <span class="DevilBro-textscrollwrapper" speed=3><div class="DevilBro-textscroll">REPLACE_submenu_disabled_text</div></span>
<div class="${BDFDB.disCN.contextmenuhint}"></div> <div class="${BDFDB.disCN.contextmenuhint}"></div>
</div> </div>
${Object.keys(this.defaults.engines).map((key, i) => `<div engine="${key}" class="${BDFDB.disCN.contextmenuitem} RIS-item"><span>${this.defaults.engines[key].name}</span><div class="${BDFDB.disCN.contextmenuhint}"></div></div>`).join("")} ${Object.keys(this.defaults.engines).map((key, i) => `<div engine="${key}" class="${BDFDB.disCN.contextmenuitem} RIS-item"><span class="DevilBro-textscrollwrapper" speed=3><div class="DevilBro-textscroll">${this.defaults.engines[key].name}</div></span><div class="${BDFDB.disCN.contextmenuhint}"></div></div>`).join("")}
</div> </div>
</div>`; </div>`;
} }
@ -45,14 +45,14 @@ class ReverseImageSearch {
getDescription () {return "Adds a reverse image search option to the context menu.";} getDescription () {return "Adds a reverse image search option to the context menu.";}
getVersion () {return "3.3.9";} getVersion () {return "3.4.0";}
getAuthor () {return "DevilBro";} getAuthor () {return "DevilBro";}
getSettingsPanel () { getSettingsPanel () {
if (!this.started || typeof BDFDB !== "object") return; if (!this.started || typeof BDFDB !== "object") return;
var engines = BDFDB.getAllData(this, "engines"); let engines = BDFDB.getAllData(this, "engines");
var settingshtml = `<div class="${this.getName()}-settings DevilBro-settings"><div class="${BDFDB.disCNS.titledefault + BDFDB.disCNS.title + BDFDB.disCNS.size18 + BDFDB.disCNS.height24 + BDFDB.disCNS.weightnormal + BDFDB.disCN.marginbottom8}">${this.getName()}</div><div class="DevilBro-settings-inner">`; let settingshtml = `<div class="${this.getName()}-settings DevilBro-settings"><div class="${BDFDB.disCNS.titledefault + BDFDB.disCNS.title + BDFDB.disCNS.size18 + BDFDB.disCNS.height24 + BDFDB.disCNS.weightnormal + BDFDB.disCN.marginbottom8}">${this.getName()}</div><div class="DevilBro-settings-inner">`;
settingshtml += `<div class="${BDFDB.disCNS.flex + BDFDB.disCNS.flex2 + BDFDB.disCNS.horizontal + BDFDB.disCNS.horizontal2 + BDFDB.disCNS.directionrow + BDFDB.disCNS.justifystart + BDFDB.disCNS.aligncenter + BDFDB.disCNS.nowrap + BDFDB.disCN.marginbottom8}" style="flex: 1 1 auto;"><h3 class="${BDFDB.disCNS.titledefault + BDFDB.disCNS.title + BDFDB.disCNS.marginreset + BDFDB.disCNS.weightmedium + BDFDB.disCNS.size16 + BDFDB.disCNS.height24 + BDFDB.disCN.flexchild}" style="flex: 0 0 auto;">Search Engines:</h3></div><div class="DevilBro-settings-inner-list">`; settingshtml += `<div class="${BDFDB.disCNS.flex + BDFDB.disCNS.flex2 + BDFDB.disCNS.horizontal + BDFDB.disCNS.horizontal2 + BDFDB.disCNS.directionrow + BDFDB.disCNS.justifystart + BDFDB.disCNS.aligncenter + BDFDB.disCNS.nowrap + BDFDB.disCN.marginbottom8}" style="flex: 1 1 auto;"><h3 class="${BDFDB.disCNS.titledefault + BDFDB.disCNS.title + BDFDB.disCNS.marginreset + BDFDB.disCNS.weightmedium + BDFDB.disCNS.size16 + BDFDB.disCNS.height24 + BDFDB.disCN.flexchild}" style="flex: 0 0 auto;">Search Engines:</h3></div><div class="DevilBro-settings-inner-list">`;
for (let key in engines) { for (let key in engines) {
settingshtml += `<div class="${BDFDB.disCNS.flex + BDFDB.disCNS.flex2 + BDFDB.disCNS.horizontal + BDFDB.disCNS.horizontal2 + BDFDB.disCNS.directionrow + BDFDB.disCNS.justifystart + BDFDB.disCNS.aligncenter + BDFDB.disCNS.nowrap + BDFDB.disCN.marginbottom8}" style="flex: 1 1 auto;"><h3 class="${BDFDB.disCNS.titledefault + BDFDB.disCNS.title + BDFDB.disCNS.marginreset + BDFDB.disCNS.weightmedium + BDFDB.disCNS.size16 + BDFDB.disCNS.height24 + BDFDB.disCN.flexchild}" style="flex: 1 1 auto;">${this.defaults.engines[key].name}</h3><div class="${BDFDB.disCNS.flexchild + BDFDB.disCNS.switchenabled + BDFDB.disCNS.switch + BDFDB.disCNS.switchvalue + BDFDB.disCNS.switchsizedefault + BDFDB.disCNS.switchsize + BDFDB.disCN.switchthemedefault}" style="flex: 0 0 auto;"><input type="checkbox" value="${key}" class="${BDFDB.disCNS.switchinnerenabled + BDFDB.disCN.switchinner}"${engines[key] ? " checked" : ""}></div></div>`; settingshtml += `<div class="${BDFDB.disCNS.flex + BDFDB.disCNS.flex2 + BDFDB.disCNS.horizontal + BDFDB.disCNS.horizontal2 + BDFDB.disCNS.directionrow + BDFDB.disCNS.justifystart + BDFDB.disCNS.aligncenter + BDFDB.disCNS.nowrap + BDFDB.disCN.marginbottom8}" style="flex: 1 1 auto;"><h3 class="${BDFDB.disCNS.titledefault + BDFDB.disCNS.title + BDFDB.disCNS.marginreset + BDFDB.disCNS.weightmedium + BDFDB.disCNS.size16 + BDFDB.disCNS.height24 + BDFDB.disCN.flexchild}" style="flex: 1 1 auto;">${this.defaults.engines[key].name}</h3><div class="${BDFDB.disCNS.flexchild + BDFDB.disCNS.switchenabled + BDFDB.disCNS.switch + BDFDB.disCNS.switchvalue + BDFDB.disCNS.switchsizedefault + BDFDB.disCNS.switchsize + BDFDB.disCN.switchthemedefault}" style="flex: 0 0 auto;"><input type="checkbox" value="${key}" class="${BDFDB.disCNS.switchinnerenabled + BDFDB.disCN.switchinner}"${engines[key] ? " checked" : ""}></div></div>`;
@ -60,7 +60,7 @@ class ReverseImageSearch {
settingshtml += `</div>`; settingshtml += `</div>`;
settingshtml += `</div></div>`; settingshtml += `</div></div>`;
var settingspanel = $(settingshtml)[0]; let settingspanel = $(settingshtml)[0];
BDFDB.initElements(settingspanel); BDFDB.initElements(settingspanel);
@ -74,7 +74,7 @@ class ReverseImageSearch {
load () {} load () {}
start () { start () {
var libraryScript = null; let libraryScript = null;
if (typeof BDFDB !== "object" || typeof BDFDB.isLibraryOutdated !== "function" || BDFDB.isLibraryOutdated()) { if (typeof BDFDB !== "object" || typeof BDFDB.isLibraryOutdated !== "function" || BDFDB.isLibraryOutdated()) {
libraryScript = document.querySelector('head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]'); libraryScript = document.querySelector('head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]');
if (libraryScript) libraryScript.remove(); if (libraryScript) libraryScript.remove();
@ -91,23 +91,6 @@ class ReverseImageSearch {
initialize () { initialize () {
if (typeof BDFDB === "object") { if (typeof BDFDB === "object") {
BDFDB.loadMessage(this); BDFDB.loadMessage(this);
var observer = null;
observer = new MutationObserver((changes, _) => {
changes.forEach(
(change, i) => {
if (change.addedNodes) {
change.addedNodes.forEach((node) => {
if (node.nodeType == 1 && node.className.includes(BDFDB.disCN.contextmenu)) {
this.onContextMenu(node);
}
});
}
}
);
});
BDFDB.addObserver(this, BDFDB.dotCN.appmount, {name:"messageContextObserver",instance:observer}, {childList: true});
} }
else { else {
console.error(this.getName() + ": Fatal Error: Could not load BD functions!"); console.error(this.getName() + ": Fatal Error: Could not load BD functions!");
@ -128,64 +111,68 @@ class ReverseImageSearch {
} }
updateSettings (settingspanel) { updateSettings (settingspanel) {
var settings = {}; let settings = {};
for (var input of settingspanel.querySelectorAll(BDFDB.dotCN.switchinner)) { for (let input of settingspanel.querySelectorAll(BDFDB.dotCN.switchinner)) {
settings[input.value] = input.checked; settings[input.value] = input.checked;
} }
BDFDB.saveAllData(settings, this, "engines"); BDFDB.saveAllData(settings, this, "engines");
} }
onContextMenu (context) { onNativeContextMenu (instance, menu) {
if (!context || !context.tagName || !context.parentElement || context.querySelector(".reverseimagesearch-item")) return; if (instance.props && instance.props.type == "NATIVE_IMAGE" && instance.props.href && !menu.querySelector(".reverseimagesearch-item")) {
var url = BDFDB.getKeyInformation({"node":context, "key":"src"}); this.appendItem(instance, menu, instance.props.href);
if (url) { }
if (url.indexOf("discordapp.com/assets/") == -1) { }
if (url.indexOf("https://images-ext-1.discordapp.net/external/") > -1) {
if (url.split("/https/").length != 1) { onMessageContextMenu (instance, menu) {
url = "https://" + url.split("/https/")[url.split("/https/").length-1]; if (instance.props && instance.props.message && instance.props.channel && instance.props.target && !menu.querySelector(".reverseimagesearch-item")) {
if (instance.props.attachment) {
this.appendItem(instance, menu, instance.props.attachment.url);
}
if (instance.props.target.tagName == "A") {
menu.style.setProperty("display","none","important");
require("request")(instance.props.target.href, (error, response, result) => {
if (response && response.headers["content-type"] && response.headers["content-type"].indexOf("image") != -1) {
this.appendItem(instance, menu, instance.props.target.href);
} }
else if (url.split("/http/").length != 1) { menu.style.removeProperty("display");
url = "http://" + url.split("/http/")[url.split("/http/").length-1]; BDFDB.updateContextPosition(menu);
} });
}
$(context).append(this.messageContextEntryMarkup)
.on("mouseenter", ".reverseimagesearch-item", (e) => {
this.createContextSubMenu(url, e, context);
});
BDFDB.updateContextPosition(context);
} }
} }
} }
createContextSubMenu (imageurl, e, context) { appendItem (instance, menu, url) {
var messageContextSubMenu = $(this.messageContextSubMenuMarkup); if (instance && menu && url) {
if (url.indexOf("discordapp.com/assets/") == -1) {
messageContextSubMenu if (url.indexOf("https://images-ext-1.discordapp.net/external/") > -1) {
.on("click", ".RIS-item", (e2) => { if (url.split("/https/").length != 1) url = "https://" + url.split("/https/")[url.split("/https/").length-1];
$(context).hide(); else if (url.split("/http/").length != 1) url = "http://" + url.split("/http/")[url.split("/http/").length-1];
var engine = e2.currentTarget.getAttribute("engine");
if (engine == "_all") {
var engines = BDFDB.getAllData(this, "engines");
for (let key in engines) {
if (key != "_all" && engines[key]) window.open(this.defaults.engines[key].url.replace(this.imgUrlReplaceString, encodeURIComponent(imageurl)), "_blank");
}
} }
else { $(menu)
window.open(this.defaults.engines[engine].url.replace(this.imgUrlReplaceString, encodeURIComponent(imageurl)), "_blank"); .append(this.messageContextEntryMarkup)
} .on("mouseenter", ".reverseimagesearch-item", (e) => {
}); let messageContextSubMenu = $(this.messageContextSubMenuMarkup)[0];
let engines = BDFDB.getAllData(this, "engines");
var engines = BDFDB.getAllData(this, "engines"); $(messageContextSubMenu)
for (let key in engines) { .on("click", ".RIS-item", (e2) => {
if (!engines[key]) messageContextSubMenu.find("[engine='" + key + "']").remove(); instance._reactInternalFiber.return.memoizedProps.closeContextMenu();
let engine = e2.currentTarget.getAttribute("engine");
if (engine == "_all") {
for (let key in engines) {
if (key != "_all" && engines[key]) {
window.open(this.defaults.engines[key].url.replace(this.imgUrlReplaceString, encodeURIComponent(url)), "_blank");
}
}
}
else window.open(this.defaults.engines[engine].url.replace(this.imgUrlReplaceString, encodeURIComponent(url)), "_blank");
});
for (let key in engines) if (!engines[key]) BDFDB.removeEles(messageContextSubMenu.querySelector("[engine='" + key + "']"));
if (messageContextSubMenu.querySelector(".RIS-item")) BDFDB.removeEles(messageContextSubMenu.querySelector(".alldisabled-item"));
BDFDB.appendSubMenu(e.currentTarget, messageContextSubMenu);
});
}
} }
if (messageContextSubMenu.find(".RIS-item").length > 0) {
messageContextSubMenu.find(".alldisabled-item").remove();
}
BDFDB.appendSubMenu(e.currentTarget, messageContextSubMenu);
} }
setLabelsByLanguage () { setLabelsByLanguage () {