Attempt to fix CrashHandler odd issues

This commit is contained in:
Nuckyz 2024-02-14 15:00:29 -03:00
parent 0c9d2a6a21
commit 48822bdc58
No known key found for this signature in database
GPG key ID: 440BF8296E1C4AD9

View file

@ -57,6 +57,7 @@ const settings = definePluginSettings({
});
let hasCrashedOnce = false;
let isRecovering = false;
let shouldAttemptRecover = true;
export default definePlugin({
@ -71,22 +72,30 @@ export default definePlugin({
{
find: ".Messages.ERRORS_UNEXPECTED_CRASH",
replacement: {
match: /(?=this\.setState\()/,
replace: "$self.handleCrash(this);"
match: /this\.setState\((.+?)\)/,
replace: "$self.handleCrash(this,$1);"
}
}
],
handleCrash(_this: any) {
handleCrash(_this: any, errorState: any) {
_this.setState(errorState);
// Already recovering, prevent error which happens more than once too fast to trigger another recover
if (isRecovering) return;
isRecovering = true;
// 1 ms timeout to avoid react breaking when re-rendering
setTimeout(() => {
try {
// Prevent a crash loop with an error that could not be handled
if (!shouldAttemptRecover) {
try {
showNotification({
color: "#eed202",
title: "Discord has crashed!",
body: "Awn :( Discord has crashed two times rapidly, not attempting to recover.",
noPersist: true,
noPersist: true
});
} catch { }
@ -96,13 +105,16 @@ export default definePlugin({
shouldAttemptRecover = false;
// This is enough to avoid a crash loop
setTimeout(() => shouldAttemptRecover = true, 500);
} catch { }
try {
if (!hasCrashedOnce) {
hasCrashedOnce = true;
maybePromptToUpdate("Uh oh, Discord has just crashed... but good news, there is a Vencord update available that might fix this issue! Would you like to update now?", true);
}
} catch { }
try {
if (settings.store.attemptToPreventCrashes) {
this.handlePreventCrash(_this);
}
@ -118,7 +130,7 @@ export default definePlugin({
color: "#eed202",
title: "Discord has crashed!",
body: "Attempting to recover...",
noPersist: true,
noPersist: true
});
} catch { }
@ -169,6 +181,10 @@ export default definePlugin({
}
}
// Set isRecovering to false before setting the state to allow us to handle the next crash error correcty, in case it happens
setImmediate(() => isRecovering = false);
try {
_this.setState({ error: null, info: null });
} catch (err) {