mirror of
https://github.com/chylex/Discord-History-Tracker.git
synced 2024-11-25 14:42:44 +01:00
Compare commits
No commits in common. "d01f9ed2186b83ed5ad58da1376059138600b946" and "9eab8ac92a901f5bead3122fb2315eda4f5bfd8d" have entirely different histories.
d01f9ed218
...
9eab8ac92a
2
app/Resources/Tracker/bootstrap.js
vendored
2
app/Resources/Tracker/bootstrap.js
vendored
@ -64,11 +64,9 @@
|
|||||||
let action = null;
|
let action = null;
|
||||||
|
|
||||||
if (!DISCORD.hasMoreMessages()) {
|
if (!DISCORD.hasMoreMessages()) {
|
||||||
console.debug("[DHT] Reached first message.");
|
|
||||||
action = SETTINGS.afterFirstMsg;
|
action = SETTINGS.afterFirstMsg;
|
||||||
}
|
}
|
||||||
if (isNoAction(action) && !anyNewMessages) {
|
if (isNoAction(action) && !anyNewMessages) {
|
||||||
console.debug("[DHT] No new messages.");
|
|
||||||
action = SETTINGS.afterSavedMsg;
|
action = SETTINGS.afterSavedMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,11 +28,46 @@ class DISCORD {
|
|||||||
* Calls the provided function with a list of messages whenever the currently loaded messages change.
|
* Calls the provided function with a list of messages whenever the currently loaded messages change.
|
||||||
*/
|
*/
|
||||||
static setupMessageCallback(callback) {
|
static setupMessageCallback(callback) {
|
||||||
|
let skipsLeft = 0;
|
||||||
|
let waitForCleanup = false;
|
||||||
const previousMessages = new Set();
|
const previousMessages = new Set();
|
||||||
|
|
||||||
const onMessageElementsChanged = function() {
|
const timer = window.setInterval(() => {
|
||||||
const messages = DISCORD.getMessages();
|
if (skipsLeft > 0) {
|
||||||
const hasChanged = messages.some(message => !previousMessages.has(message.id)) || !DISCORD.hasMoreMessages();
|
--skipsLeft;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const view = this.getMessageOuterElement();
|
||||||
|
|
||||||
|
if (!view) {
|
||||||
|
skipsLeft = 2;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const anyMessage = DOM.queryReactClass("message", this.getMessageOuterElement());
|
||||||
|
const messageCount = anyMessage ? anyMessage.parentElement.children.length : 0;
|
||||||
|
|
||||||
|
if (messageCount > 300) {
|
||||||
|
if (waitForCleanup) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
skipsLeft = 3;
|
||||||
|
waitForCleanup = true;
|
||||||
|
|
||||||
|
window.setTimeout(() => {
|
||||||
|
const view = this.getMessageScrollerElement();
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
view.scrollTop = view.scrollHeight / 2;
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
waitForCleanup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = this.getMessages();
|
||||||
|
const hasChanged = messages.some(message => !previousMessages.has(message.id)) || !this.hasMoreMessages();
|
||||||
|
|
||||||
if (!hasChanged) {
|
if (!hasChanged) {
|
||||||
return;
|
return;
|
||||||
@ -44,74 +79,24 @@ class DISCORD {
|
|||||||
}
|
}
|
||||||
|
|
||||||
callback(messages);
|
callback(messages);
|
||||||
};
|
}, 200);
|
||||||
|
|
||||||
let debounceTimer;
|
window.DHT_ON_UNLOAD.push(() => window.clearInterval(timer));
|
||||||
|
|
||||||
/**
|
|
||||||
* Do not trigger the callback too often due to autoscrolling.
|
|
||||||
*/
|
|
||||||
const onMessageElementsChangedLater = function() {
|
|
||||||
window.clearTimeout(debounceTimer);
|
|
||||||
debounceTimer = window.setTimeout(onMessageElementsChanged, 200);
|
|
||||||
};
|
|
||||||
|
|
||||||
const observer = new MutationObserver(function () {
|
|
||||||
onMessageElementsChangedLater();
|
|
||||||
});
|
|
||||||
|
|
||||||
let skipsLeft = 0;
|
|
||||||
let observedElement = null;
|
|
||||||
|
|
||||||
const observerTimer = window.setInterval(() => {
|
|
||||||
if (skipsLeft > 0) {
|
|
||||||
--skipsLeft;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const view = this.getMessageOuterElement();
|
|
||||||
|
|
||||||
if (!view) {
|
|
||||||
skipsLeft = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (observedElement !== null && observedElement.isConnected) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
observedElement = view.querySelector("[data-list-id='chat-messages']");
|
|
||||||
|
|
||||||
if (observedElement) {
|
|
||||||
console.debug("[DHT] Observed message container.");
|
|
||||||
observer.observe(observedElement, { childList: true });
|
|
||||||
onMessageElementsChangedLater();
|
|
||||||
}
|
|
||||||
}, 400);
|
|
||||||
|
|
||||||
window.DHT_ON_UNLOAD.push(() => {
|
|
||||||
observer.disconnect();
|
|
||||||
observedElement = null;
|
|
||||||
window.clearInterval(observerTimer);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the message from a message element.
|
* Returns the property object of a message element.
|
||||||
* @returns { null | DiscordMessage } }
|
* @returns { null | { message: DiscordMessage, channel: Object } }
|
||||||
*/
|
*/
|
||||||
static getMessageFromElement(ele) {
|
static getMessageElementProps(ele) {
|
||||||
const props = DOM.getReactProps(ele);
|
const props = DOM.getReactProps(ele);
|
||||||
|
|
||||||
if (props && Array.isArray(props.children)) {
|
if (props.children && props.children.length) {
|
||||||
for (const child of props.children) {
|
for (let i = 3; i < props.children.length; i++) {
|
||||||
if (!(child instanceof Object)) {
|
const childProps = props.children[i].props;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const childProps = child.props;
|
if (childProps && "message" in childProps && "channel" in childProps) {
|
||||||
if (childProps instanceof Object && "message" in childProps) {
|
return childProps;
|
||||||
return childProps.message;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -128,10 +113,10 @@ class DISCORD {
|
|||||||
|
|
||||||
for (const ele of this.getMessageElements()) {
|
for (const ele of this.getMessageElements()) {
|
||||||
try {
|
try {
|
||||||
const message = this.getMessageFromElement(ele);
|
const props = this.getMessageElementProps(ele);
|
||||||
|
|
||||||
if (message != null) {
|
if (props != null) {
|
||||||
messages.push(message);
|
messages.push(props.message);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[DHT] Error extracing message data, skipping it.", e, ele, DOM.tryGetReactProps(ele));
|
console.error("[DHT] Error extracing message data, skipping it.", e, ele, DOM.tryGetReactProps(ele));
|
||||||
@ -152,7 +137,7 @@ class DISCORD {
|
|||||||
*/
|
*/
|
||||||
static getSelectedChannel() {
|
static getSelectedChannel() {
|
||||||
try {
|
try {
|
||||||
let obj = null;
|
let obj;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (const child of DOM.getReactProps(DOM.queryReactClass("chatContent")).children) {
|
for (const child of DOM.getReactProps(DOM.queryReactClass("chatContent")).children) {
|
||||||
@ -163,6 +148,15 @@ class DISCORD {
|
|||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[DHT] Error retrieving selected channel from 'chatContent' element.", e);
|
console.error("[DHT] Error retrieving selected channel from 'chatContent' element.", e);
|
||||||
|
|
||||||
|
for (const ele of this.getMessageElements()) {
|
||||||
|
const props = this.getMessageElementProps(ele);
|
||||||
|
|
||||||
|
if (props != null) {
|
||||||
|
obj = props.channel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!obj || typeof obj.id !== "string") {
|
if (!obj || typeof obj.id !== "string") {
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="7.0.9" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
Loading…
Reference in New Issue
Block a user