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==
// @name Discord History Tracker
// @version BETA v.18
// @version BETA v.19
// @license MIT
// @namespace https://chylex.com
// @homepageURL https://dht.chylex.com/
@ -13,15 +13,30 @@
const start = function(){
var DISCORD = (function(){
var getTopMessageViewElement = function(){
let view = DOM.queryReactClass("messages");
var getMessageContainerElement = function(){
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){
let topClass = view.children[0].getAttribute("class");
return topClass.includes("placeholder") || topClass.includes("privateChannelPlaceholder-") ? view.children[1] : view.children[0];
for(let child of view.children){
let childClass = child.className;
if (childClass.includes(cls) || child.querySelector(selector)){
return true;
}
else if (childClass.includes("message-")){
break;
}
}
return null;
return false;
};
var observerTimer = 0, waitingForCleanup = 0;
@ -32,13 +47,13 @@ var DISCORD = (function(){
*/
setupMessageUpdateCallback: function(callback){
var onTimerFinished = function(){
let topEle = getTopMessageViewElement();
let view = getMessageContainerElement();
if (!topEle){
if (!view){
restartTimer(500);
}
else if (!topEle.getAttribute("class").includes("loadingMore-")){
let messages = DOM.queryReactClass("messages").children.length;
else if (!checkTopSpecialMessageElement(view, "loadingMore")){
let messages = getMessageContainerElement().children.length;
if (messages < 100){
waitingForCleanup = 0;
@ -53,12 +68,12 @@ var DISCORD = (function(){
waitingForCleanup = 6;
DOM.setTimer(() => {
let view = DOM.queryReactClass("messages");
let view = getMessageScrollerElement();
view.scrollTop = view.scrollHeight/2;
}, 1);
}
callback(topEle.getAttribute("class").includes("hasMore-"));
callback(checkTopSpecialMessageElement(view, "hasMore"));
restartTimer(200);
}
}
@ -132,7 +147,7 @@ var DISCORD = (function(){
};
}
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 props = DISCORD.getReactProps(channel);
@ -157,6 +172,7 @@ var DISCORD = (function(){
return obj.channel.length === 0 ? null : obj;
}catch(e){
console.error(e);
return null;
}
},
@ -165,46 +181,47 @@ var DISCORD = (function(){
* Returns an array containing currently loaded messages.
*/
getMessages: function(){
var props = DISCORD.getReactProps(DOM.queryReactClass("messages"));
var array = props && props.children.find(ele => ele && ele.length);
try{
var props = DISCORD.getReactProps(getMessageContainerElement());
var wrappers = props.children.find(ele => ele && ele.length);
var messages = [];
if (array){
if (array.length == 2 && !array.every(ele => ele && ele.length)){
array = array[1];
}
for(let obj of wrappers){
let nested = obj.props;
for(let obj of array){
if (obj.props && obj.props.message){
messages.push(obj.props.message);
}
if (nested && nested.message){
messages.push(nested.message);
}
}
return messages;
}catch(e){
console.error(e);
return null;
}
},
/*
* 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.
*/
hasMoreMessages: function(){
let classes = getTopMessageViewElement().getAttribute("class");
return classes.includes("hasMore-") || classes.includes("loadingMore-");
let view = getMessageContainerElement();
return checkTopSpecialMessageElement(view, "hasMore") || checkTopSpecialMessageElement(view, "loadingMore");
},
/*
* Forces the message view to load older messages by scrolling all the way up.
*/
loadOlderMessages: function(){
let view = DOM.queryReactClass("messages");
let view = getMessageScrollerElement();
if (view.scrollTop > 0){
view.scrollTop = view.scrollHeight / 2;
view.scrollTop = 0;
}
},
@ -236,7 +253,7 @@ var DISCORD = (function(){
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 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){
return false;
@ -574,7 +591,7 @@ ${radio("asm", "pause", "Pause Tracking")}
${radio("asm", "switch", "Switch to Next Channel")}
<p id='dht-cfg-note'>
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>`);
// elements
@ -1134,7 +1151,11 @@ DISCORD.setupMessageUpdateCallback(hasMoreMessages => {
let messages = DISCORD.getMessages();
if (!messages.length){
if (messages == null){
stopTrackingDelayed();
return;
}
else if (!messages.length){
DISCORD.loadOlderMessages();
return;
}
@ -1163,7 +1184,11 @@ DISCORD.setupMessageUpdateCallback(hasMoreMessages => {
let updatedInfo = DISCORD.getSelectedChannel();
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){
@ -1180,8 +1205,16 @@ STATE.onStateChanged((type, enabled) => {
let info = DISCORD.getSelectedChannel();
if (info){
STATE.addDiscordChannel(info.server, info.type, info.id, info.channel);
STATE.addDiscordMessages(info.id, DISCORD.getMessages());
let messages = 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{
stopTrackingDelayed(() => alert("The selected channel is not visible in the channel list."));
@ -1227,7 +1260,7 @@ window.setInterval(function(){
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){
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
VERSION_SHORT = "BETA v.18"
VERSION_FULL = VERSION_SHORT + ", released 6 Feb 2020"
VERSION_SHORT = "BETA v.19"
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}\""