2022-10-22 01:17:06 +02:00
/ * !
* Vencord , a modification for Discord ' s desktop app
* Copyright ( c ) 2022 Vendicated and contributors
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
* /
2022-08-29 22:05:22 +02:00
export * as Api from "./api" ;
2024-05-17 23:01:07 +02:00
export * as Components from "./components" ;
2022-10-22 18:18:41 +02:00
export * as Plugins from "./plugins" ;
2022-10-14 21:34:35 +02:00
export * as Util from "./utils" ;
2022-10-22 18:18:41 +02:00
export * as QuickCss from "./utils/quickCss" ;
export * as Updater from "./utils/updater" ;
export * as Webpack from "./webpack" ;
2025-02-07 20:07:17 -03:00
export * as WebpackPatcher from "./webpack/patchWebpack" ;
2022-10-26 13:54:23 +02:00
export { PlainSettings , Settings } ;
2022-08-29 20:27:47 +02:00
2022-08-29 18:11:44 +02:00
import "./utils/quickCss" ;
2022-11-07 23:34:14 +01:00
import "./webpack/patchWebpack" ;
2022-10-22 18:18:41 +02:00
2024-04-20 14:51:33 +02:00
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab" ;
2023-11-22 06:14:16 +01:00
import { StartAt } from "@utils/types" ;
2023-08-04 19:10:12 +01:00
import { get as dsGet } from "./api/DataStore" ;
2023-03-19 13:21:26 +04:00
import { showNotification } from "./api/Notifications" ;
2023-05-06 01:36:00 +02:00
import { PlainSettings , Settings } from "./api/Settings" ;
2022-11-07 23:34:14 +01:00
import { patches , PMLogger , startAllPlugins } from "./plugins" ;
2023-04-07 01:27:18 +01:00
import { localStorage } from "./utils/localStorage" ;
2023-04-15 13:50:00 +01:00
import { relaunch } from "./utils/native" ;
2023-04-07 01:27:18 +01:00
import { getCloudSettings , putCloudSettings } from "./utils/settingsSync" ;
2023-05-06 01:36:00 +02:00
import { checkForUpdates , update , UpdateLogger } from "./utils/updater" ;
2022-10-01 00:42:50 +02:00
import { onceReady } from "./webpack" ;
2023-01-25 03:25:29 +01:00
import { SettingsRouter } from "./webpack/common" ;
2022-08-31 20:47:07 +02:00
2024-05-31 23:28:58 -03:00
if ( IS_REPORTER ) {
require ( "./debug/runReporter" ) ;
2024-10-13 18:33:39 -04:00
Settings . plugins . CharacterCounter . enabled = false ;
2024-05-31 23:28:58 -03:00
}
2023-04-07 01:27:18 +01:00
async function syncSettings() {
2025-03-31 17:36:21 -04:00
// Check if cloud auth exists for current user before attempting sync
const hasCloudAuth = await dsGet ( "Vencord_cloudSecret" ) ;
if ( ! hasCloudAuth ) {
if ( Settings . cloud . authenticated ) {
// User switched to an account that isn't connected to cloud
showNotification ( {
title : "Cloud Settings" ,
body : "Cloud sync was disabled because this account isn't connected to the Vencloud App. You can enable it again by connecting this account in Cloud Settings. (note: it will store your preferences separately)" ,
color : "var(--yellow-360)" ,
onClick : ( ) = > SettingsRouter . open ( "VencordCloud" )
} ) ;
// Disable cloud sync globally
Settings . cloud . authenticated = false ;
}
return ;
}
2023-08-04 19:10:12 +01:00
// pre-check for local shared settings
if (
Settings . cloud . authenticated &&
2025-03-31 17:36:21 -04:00
! hasCloudAuth // this has been enabled due to local settings share or some other bug
2023-08-04 19:10:12 +01:00
) {
// show a notification letting them know and tell them how to fix it
showNotification ( {
title : "Cloud Integrations" ,
body : "We've noticed you have cloud integrations enabled in another client! Due to limitations, you will " +
"need to re-authenticate to continue using them. Click here to go to the settings page to do so!" ,
color : "var(--yellow-360)" ,
2024-07-13 00:06:01 -04:00
onClick : ( ) = > SettingsRouter . open ( "EquicordCloud" )
2023-08-04 19:10:12 +01:00
} ) ;
return ;
}
2023-04-07 01:27:18 +01:00
if (
Settings . cloud . settingsSync && // if it's enabled
Settings . cloud . authenticated // if cloud integrations are enabled
) {
if ( localStorage . Vencord_settingsDirty ) {
await putCloudSettings ( ) ;
delete localStorage . Vencord_settingsDirty ;
2024-10-14 19:33:17 -04:00
} else if ( await getCloudSettings ( false ) ) {
// if we synchronized something (false means no sync)
2023-04-07 01:27:18 +01:00
// we show a notification here instead of allowing getCloudSettings() to show one to declutter the amount of
// potential notifications that might occur. getCloudSettings() will always send a notification regardless if
// there was an error to notify the user, but besides that we only want to show one notification instead of all
// of the possible ones it has (such as when your settings are newer).
showNotification ( {
title : "Cloud Settings" ,
body : "Your settings have been updated! Click here to restart to fully apply changes!" ,
color : "var(--green-360)" ,
2023-04-15 13:50:00 +01:00
onClick : relaunch
2023-04-07 01:27:18 +01:00
} ) ;
}
}
}
2022-10-01 00:42:50 +02:00
async function init() {
await onceReady ;
2023-11-22 06:14:16 +01:00
startAllPlugins ( StartAt . WebpackReady ) ;
2022-10-01 00:42:50 +02:00
2023-04-07 01:27:18 +01:00
syncSettings ( ) ;
2024-04-20 14:51:33 +02:00
if ( ! IS_WEB && ! IS_UPDATER_DISABLED ) {
2022-10-16 17:15:15 +02:00
try {
const isOutdated = await checkForUpdates ( ) ;
2023-01-24 01:42:57 +01:00
if ( ! isOutdated ) return ;
if ( Settings . autoUpdate ) {
await update ( ) ;
2024-12-06 12:15:02 -05:00
if ( Settings . updateRelaunch ) return relaunch ;
2023-03-19 13:21:26 +04:00
if ( Settings . autoUpdateNotification )
2023-03-19 22:03:33 -03:00
setTimeout ( ( ) = > showNotification ( {
2024-04-21 00:23:13 -04:00
title : "Equicord has been updated!" ,
2023-03-19 13:21:26 +04:00
body : "Click here to restart" ,
permanent : true ,
2023-04-01 02:47:49 +02:00
noPersist : true ,
2023-04-09 04:04:02 +02:00
onClick : relaunch
2023-03-19 22:03:33 -03:00
} ) , 10 _000 ) ;
2024-12-03 04:04:13 -05:00
return ;
2023-01-24 01:42:57 +01:00
}
2024-04-20 14:51:33 +02:00
setTimeout ( ( ) = > showNotification ( {
2024-04-21 00:23:13 -04:00
title : "A Equicord update is available!" ,
2024-04-20 14:51:33 +02:00
body : "Click here to view the update" ,
permanent : true ,
noPersist : true ,
onClick : openUpdaterModal !
} ) , 10 _000 ) ;
2022-10-16 17:15:15 +02:00
} catch ( err ) {
UpdateLogger . error ( "Failed to check for updates" , err ) ;
}
2022-10-01 00:42:50 +02:00
}
2022-10-30 20:45:18 +01:00
if ( IS_DEV ) {
const pendingPatches = patches . filter ( p = > ! p . all && p . predicate ? . ( ) !== false ) ;
if ( pendingPatches . length )
PMLogger . warn (
"Webpack has finished initialising, but some patches haven't been applied yet." ,
"This might be expected since some Modules are lazy loaded, but please verify" ,
"that all plugins are working as intended." ,
"You are seeing this warning because this is a Development build of Vencord." ,
"\nThe following patches have not been applied:" ,
"\n\n" + pendingPatches . map ( p = > ` ${ p . plugin } : ${ p . find } ` ) . join ( "\n" )
) ;
}
2022-10-01 00:42:50 +02:00
}
2025-03-30 13:56:37 -04:00
startAllPlugins ( StartAt . Init ) ;
init ( ) ;
2023-02-28 22:17:39 +01:00
2024-07-10 15:25:18 -04:00
document . addEventListener ( "DOMContentLoaded" , ( ) = > {
2025-03-30 13:56:37 -04:00
startAllPlugins ( StartAt . DOMContentLoaded ) ;
if ( IS_DISCORD_DESKTOP && Settings . winNativeTitleBar && navigator . platform . toLowerCase ( ) . startsWith ( "win" ) ) {
document . head . append ( Object . assign ( document . createElement ( "style" ) , {
id : "vencord-native-titlebar-style" ,
textContent : "[class*=titleBar]{display: none!important}"
} ) ) ;
2024-07-10 15:25:18 -04:00
}
} , { once : true } ) ;