Release BETA v.19

This commit is contained in:
chylex 2020-04-01 21:48:20 +02:00
parent e9827d6adc
commit f575c759b2
4 changed files with 73 additions and 40 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
// ==UserScript== // ==UserScript==
// @name Discord History Tracker // @name Discord History Tracker
// @version BETA v.18 // @version BETA v.19
// @license MIT // @license MIT
// @namespace https://chylex.com // @namespace https://chylex.com
// @homepageURL https://dht.chylex.com/ // @homepageURL https://dht.chylex.com/
@ -13,15 +13,30 @@
const start = function(){ const start = function(){
var DISCORD = (function(){ var DISCORD = (function(){
var getTopMessageViewElement = function(){ var getMessageContainerElement = function(){
let view = DOM.queryReactClass("messages"); return document.querySelector("[data-ref-id='messages']");
};
var getMessageScrollerElement = function(){
return getMessageContainerElement().closest("[class*='scroller']");
};
var checkTopSpecialMessageElement = function(view, cls){
cls = `${cls}-`;
const selector = `[class*="${cls}"]`;
if (view && view.children.length){ for(let child of view.children){
let topClass = view.children[0].getAttribute("class"); let childClass = child.className;
return topClass.includes("placeholder") || topClass.includes("privateChannelPlaceholder-") ? view.children[1] : view.children[0];
if (childClass.includes(cls) || child.querySelector(selector)){
return true;
}
else if (childClass.includes("message-")){
break;
}
} }
return null; return false;
}; };
var observerTimer = 0, waitingForCleanup = 0; var observerTimer = 0, waitingForCleanup = 0;
@ -32,13 +47,13 @@ var DISCORD = (function(){
*/ */
setupMessageUpdateCallback: function(callback){ setupMessageUpdateCallback: function(callback){
var onTimerFinished = function(){ var onTimerFinished = function(){
let topEle = getTopMessageViewElement(); let view = getMessageContainerElement();
if (!topEle){ if (!view){
restartTimer(500); restartTimer(500);
} }
else if (!topEle.getAttribute("class").includes("loadingMore-")){ else if (!checkTopSpecialMessageElement(view, "loadingMore")){
let messages = DOM.queryReactClass("messages").children.length; let messages = getMessageContainerElement().children.length;
if (messages < 100){ if (messages < 100){
waitingForCleanup = 0; waitingForCleanup = 0;
@ -53,12 +68,12 @@ var DISCORD = (function(){
waitingForCleanup = 6; waitingForCleanup = 6;
DOM.setTimer(() => { DOM.setTimer(() => {
let view = DOM.queryReactClass("messages"); let view = getMessageScrollerElement();
view.scrollTop = view.scrollHeight/2; view.scrollTop = view.scrollHeight/2;
}, 1); }, 1);
} }
callback(topEle.getAttribute("class").includes("hasMore-")); callback(checkTopSpecialMessageElement(view, "hasMore"));
restartTimer(200); restartTimer(200);
} }
} }
@ -132,7 +147,7 @@ var DISCORD = (function(){
}; };
} }
else{ else{
channelListEle = document.querySelector("div[class*='sidebar'] > div[class*='container']"); channelListEle = document.querySelector("div[class*='sidebar'] > nav[class*='container']");
var channel = channelListEle.querySelector("div[class*='scrollerWrap'] > div[class*='scroller'] [class*='modeSelected']").parentElement; var channel = channelListEle.querySelector("div[class*='scrollerWrap'] > div[class*='scroller'] [class*='modeSelected']").parentElement;
var props = DISCORD.getReactProps(channel); var props = DISCORD.getReactProps(channel);
@ -157,6 +172,7 @@ var DISCORD = (function(){
return obj.channel.length === 0 ? null : obj; return obj.channel.length === 0 ? null : obj;
}catch(e){ }catch(e){
console.error(e);
return null; return null;
} }
}, },
@ -165,46 +181,47 @@ var DISCORD = (function(){
* Returns an array containing currently loaded messages. * Returns an array containing currently loaded messages.
*/ */
getMessages: function(){ getMessages: function(){
var props = DISCORD.getReactProps(DOM.queryReactClass("messages")); try{
var array = props && props.children.find(ele => ele && ele.length); var props = DISCORD.getReactProps(getMessageContainerElement());
var wrappers = props.children.find(ele => ele && ele.length);
var messages = []; var messages = [];
if (array){ for(let obj of wrappers){
if (array.length == 2 && !array.every(ele => ele && ele.length)){ let nested = obj.props;
array = array[1];
}
for(let obj of array){ if (nested && nested.message){
if (obj.props && obj.props.message){ messages.push(nested.message);
messages.push(obj.props.message);
}
} }
} }
return messages; return messages;
}catch(e){
console.error(e);
return null;
}
}, },
/* /*
* Returns true if the message view is visible. * Returns true if the message view is visible.
*/ */
isInMessageView: () => !!DOM.queryReactClass("messages"), isInMessageView: () => !!getMessageContainerElement(),
/* /*
* Returns true if there are more messages available or if they're still loading. * Returns true if there are more messages available or if they're still loading.
*/ */
hasMoreMessages: function(){ hasMoreMessages: function(){
let classes = getTopMessageViewElement().getAttribute("class"); let view = getMessageContainerElement();
return classes.includes("hasMore-") || classes.includes("loadingMore-"); return checkTopSpecialMessageElement(view, "hasMore") || checkTopSpecialMessageElement(view, "loadingMore");
}, },
/* /*
* Forces the message view to load older messages by scrolling all the way up. * Forces the message view to load older messages by scrolling all the way up.
*/ */
loadOlderMessages: function(){ loadOlderMessages: function(){
let view = DOM.queryReactClass("messages"); let view = getMessageScrollerElement();
if (view.scrollTop > 0){ if (view.scrollTop > 0){
view.scrollTop = view.scrollHeight / 2;
view.scrollTop = 0; view.scrollTop = 0;
} }
}, },
@ -236,7 +253,7 @@ var DISCORD = (function(){
var isValidChannelType = ele => !!ele.querySelector('path[d="' + channelIconNormal + '"]') || !!ele.querySelector('path[d="' + channelIconSpecial + '"]'); var isValidChannelType = ele => !!ele.querySelector('path[d="' + channelIconNormal + '"]') || !!ele.querySelector('path[d="' + channelIconSpecial + '"]');
var isValidChannel = ele => ele.childElementCount > 0 && isValidChannelClass(ele.children[0].className) && isValidChannelType(ele); var isValidChannel = ele => ele.childElementCount > 0 && isValidChannelClass(ele.children[0].className) && isValidChannelType(ele);
var channelListEle = document.querySelector("div[class*='sidebar'] > div[class*='container'] > div[class*='scrollerWrap'] > div[class*='scroller']"); var channelListEle = document.querySelector("div[class*='sidebar'] > nav[class*='container'] > div[class*='scrollerWrap'] > div[class*='scroller']");
if (!channelListEle){ if (!channelListEle){
return false; return false;
@ -574,7 +591,7 @@ ${radio("asm", "pause", "Pause Tracking")}
${radio("asm", "switch", "Switch to Next Channel")} ${radio("asm", "switch", "Switch to Next Channel")}
<p id='dht-cfg-note'> <p id='dht-cfg-note'>
It is recommended to disable link and image previews to avoid putting unnecessary strain on your browser.<br><br> It is recommended to disable link and image previews to avoid putting unnecessary strain on your browser.<br><br>
<sub>BETA v.18, released 6 Feb 2020</sub> <sub>BETA v.19, released 1 Apr 2020</sub>
</p>`); </p>`);
// elements // elements
@ -1134,7 +1151,11 @@ DISCORD.setupMessageUpdateCallback(hasMoreMessages => {
let messages = DISCORD.getMessages(); let messages = DISCORD.getMessages();
if (!messages.length){ if (messages == null){
stopTrackingDelayed();
return;
}
else if (!messages.length){
DISCORD.loadOlderMessages(); DISCORD.loadOlderMessages();
return; return;
} }
@ -1163,7 +1184,11 @@ DISCORD.setupMessageUpdateCallback(hasMoreMessages => {
let updatedInfo = DISCORD.getSelectedChannel(); let updatedInfo = DISCORD.getSelectedChannel();
if (updatedInfo && updatedInfo.id === info.id){ if (updatedInfo && updatedInfo.id === info.id){
STATE.addDiscordMessages(info.id, DISCORD.getMessages()); // sometimes needed to catch the last few messages before switching let lastMessages = DISCORD.getMessages(); // sometimes needed to catch the last few messages before switching
if (lastMessages != null){
STATE.addDiscordMessages(info.id, lastMessages);
}
} }
if ((action === CONSTANTS.AUTOSCROLL_ACTION_SWITCH && !DISCORD.selectNextTextChannel()) || action === CONSTANTS.AUTOSCROLL_ACTION_PAUSE){ if ((action === CONSTANTS.AUTOSCROLL_ACTION_SWITCH && !DISCORD.selectNextTextChannel()) || action === CONSTANTS.AUTOSCROLL_ACTION_PAUSE){
@ -1180,8 +1205,16 @@ STATE.onStateChanged((type, enabled) => {
let info = DISCORD.getSelectedChannel(); let info = DISCORD.getSelectedChannel();
if (info){ if (info){
STATE.addDiscordChannel(info.server, info.type, info.id, info.channel); let messages = DISCORD.getMessages();
STATE.addDiscordMessages(info.id, DISCORD.getMessages());
if (messages != null){
STATE.addDiscordChannel(info.server, info.type, info.id, info.channel);
STATE.addDiscordMessages(info.id, messages);
}
else{
stopTrackingDelayed(() => alert("Cannot see any messages."));
return;
}
} }
else{ else{
stopTrackingDelayed(() => alert("The selected channel is not visible in the channel list.")); stopTrackingDelayed(() => alert("The selected channel is not visible in the channel list."));
@ -1227,7 +1260,7 @@ window.setInterval(function(){
return; return;
} }
const help = document.querySelector("div[class^='title'] a[href*='support.discordapp.com']"); const help = document.querySelector("section[class^='title'] a[href*='support.discordapp.com']");
if (help){ if (help){
help.insertAdjacentHTML("afterend", ` help.insertAdjacentHTML("afterend", `

File diff suppressed because one or more lines are too long

View File

@ -8,8 +8,8 @@ import os
import distutils.dir_util import distutils.dir_util
VERSION_SHORT = "BETA v.18" VERSION_SHORT = "BETA v.19"
VERSION_FULL = VERSION_SHORT + ", released 6 Feb 2020" VERSION_FULL = VERSION_SHORT + ", released 1 Apr 2020"
EXEC_UGLIFYJS_WIN = "{2}/lib/uglifyjs.cmd --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\"" EXEC_UGLIFYJS_WIN = "{2}/lib/uglifyjs.cmd --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\""