Compare commits

..

1 commit

Author SHA1 Message Date
dependabot[bot]
a112753e4f
Update prettier requirement from ^2.7.0 to ^2.7.1
Updates the requirements on [prettier](https://github.com/prettier/prettier) to permit the latest version.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.7.0...2.7.1)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-25 14:12:06 +00:00
39 changed files with 2396 additions and 393 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -53,6 +53,5 @@
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder",
"settings-none": "None", "settings-none": "None",
"settings-save": "Save Settings", "settings-save": "Save Settings",
"settings-restart": "Restart App",
"settings-updater": "Check for updates" "settings-updater": "Check for updates"
} }

View file

@ -52,6 +52,5 @@
"settings-trayIcon": "Tray icon", "settings-trayIcon": "Tray icon",
"settings-trayIcon-desc": "Set the icon which will appear in tray menu.", "settings-trayIcon-desc": "Set the icon which will appear in tray menu.",
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder",
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-trayIcon-desc": "Set the icon which will appear in tray menu.", "settings-trayIcon-desc": "Set the icon which will appear in tray menu.",
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder"
"settings-restart": "Restart App"
} }

View file

@ -29,7 +29,7 @@
"settings-none": "tidak ada", "settings-none": "tidak ada",
"settings-mobileMode": "Mobile mode", "settings-mobileMode": "Mobile mode",
"settings-altPaste": "Alternative Paste", "settings-altPaste": "Alternative Paste",
"settings-theme-desc1": "\"Tema\" ArmCord menata perilaku dan penampilan aplikasi.", "settings-theme-desc1": "ArmCord \"themes\" manage apps behaviour and looks.",
"settings-theme-desc2": "this is how ArmCord looks when you first launch it. It includes recreation of Discord's\n custom titlebar and ArmCord specific styles injected into Discord.", "settings-theme-desc2": "this is how ArmCord looks when you first launch it. It includes recreation of Discord's\n custom titlebar and ArmCord specific styles injected into Discord.",
"settings-theme-desc3": "uses native titlebar of OS you're currently running (e.g Windows 7/10). Functions more\n similar to actual Discord app on Linux.", "settings-theme-desc3": "uses native titlebar of OS you're currently running (e.g Windows 7/10). Functions more\n similar to actual Discord app on Linux.",
"settings-tray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", "settings-tray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.",
@ -52,6 +52,5 @@
"settings-trayIcon": "Tray icon", "settings-trayIcon": "Tray icon",
"settings-trayIcon-desc": "Set the icon which will appear in tray menu.", "settings-trayIcon-desc": "Set the icon which will appear in tray menu.",
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder",
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder",
"settings-none": "None", "settings-none": "None",
"settings-save": "Save Settings", "settings-save": "Save Settings",
"settings-updater": "Check for updates", "settings-updater": "Check for updates"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Sone for avanserte brukere", "settings-advanced": "Sone for avanserte brukere",
"settings-pluginsFolder": "Åpne programtilleggsmappen", "settings-pluginsFolder": "Åpne programtilleggsmappen",
"settings-themesFolder": "Åpne draktmappen", "settings-themesFolder": "Åpne draktmappen",
"settings-storageFolder": "Åpne lagringsmappen", "settings-storageFolder": "Åpne lagringsmappen"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder",
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder",
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Área para usuários avançados", "settings-advanced": "Área para usuários avançados",
"settings-pluginsFolder": "Abrir pasta de plugins", "settings-pluginsFolder": "Abrir pasta de plugins",
"settings-themesFolder": "Abrir pasta de temas", "settings-themesFolder": "Abrir pasta de temas",
"settings-storageFolder": "Abrir pasta de armazenamento", "settings-storageFolder": "Abrir pasta de armazenamento"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.", "settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
"settings-trayIcon": "Tray icon", "settings-trayIcon": "Tray icon",
"settings-trayIcon-desc": "Set the icon which will appear in tray menu.", "settings-trayIcon-desc": "Set the icon which will appear in tray menu.",
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone"
"settings-restart": "Restart App"
} }

View file

@ -1,5 +1,5 @@
{ {
"loading_screen_start": "Startar ArmCord…", "loading_screen_start": "Starting ArmCord…",
"loading_screen_offline": "You appear to be offline. Please connect to the Internet and try again.", "loading_screen_offline": "You appear to be offline. Please connect to the Internet and try again.",
"loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.", "loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.",
"setup_question1": "Select what kind of setup you want to perform:", "setup_question1": "Select what kind of setup you want to perform:",
@ -52,6 +52,5 @@
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder",
"settings-none": "None", "settings-none": "None",
"settings-save": "Save Settings", "settings-save": "Save Settings",
"settings-updater": "Check for updates", "settings-updater": "Check for updates"
"settings-restart": "Restart App"
} }

View file

@ -52,6 +52,5 @@
"settings-advanced": "Advanced user zone", "settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder", "settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder",
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder"
"settings-restart": "Restart App"
} }

View file

@ -1,57 +0,0 @@
{
"setup_question1_answer2": "Tam Kurulum",
"setup_question4": "Yüklemek istediğiniz bir istemci modunu seçin:",
"settings-channel": "Discord channel",
"settings-altPaste": "Alternative Paste",
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
"settings-prfmMode-performance": "Performance",
"loading_screen_start": "ArmCord Başlatılıyor…",
"loading_screen_offline": "Çevrimdışı görünüyorsunuz. Lütfen internete bağlanın ve tekrar deneyin.",
"loading_screen_update": "ArmCord'un yeni bir sürümü mevcut. Lütfen son sürüme güncelleyin.",
"settings-storageFolder": "Open storage folder",
"setup_question1": "Ne tür bir kurulum gerçekleştirmek istediğinizi seçin:",
"setup_question1_answer1": "Hızlı Kurulum",
"setup_offline": "Çevrimdışı görünüyorsunuz. Lütfen internete bağlanın ve ArmCord'u yeniden başlatın.",
"setup_question2": "Choose your Discord channel/instance:",
"setup_question3": "ArmCord istemci modlarının kurulumunu yapmalı mı?",
"yes": "Evet",
"no": "Hayır",
"next": "İleri",
"setup_question4_clientmodnotice": "Neden hepsi değil? Aynı anda birçok istemci moduna sahip olmak sorunlara neden olabilir. Yine de gerçekten yapmak istiyorsan, Discord sunucumuza bak.",
"settings-theme": "ArmCord teması",
"settings-theme-desc1": "ArmCord \"temaları\" uygulamaların davranışlarını ve görünümünü yönetir.",
"settings-theme-desc2": "ArmCord'u ilk başlattığında böyle görünüyor. Discord'un yeniden oluşturulmasını içerir \n Discord'a enjekte edilen özel başlık çubuğu ve ArmCord'a özgü stiller.",
"settings-theme-desc3": "çalıştırdığınız işletim sisteminin başlık çubuğunu kullanır (örneğin Windows 7/10). Daha fazla fonksiyon\n Linux'taki normal Discord uygulamasına benzer.",
"settings-theme-default": "Varsayılan",
"settings-theme-native": "Native",
"settings-csp-desc": "ArmCord CSP, Discord uygulamasına özel içerik yükleme işlemini yöneten sistemimiz. .Bunun gibi şeyler\n istemci modları ve temaları buna bağlıdır. Modlardan ve özel stillerden kurtulmak istiyorsanız devre dışı bırakın.",
"settings-tray": "Görev çubuğuna küçült",
"settings-tray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.",
"settings-patches": "Automatic Patches",
"settings-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.",
"settings-mobileMode": "Mobile mode",
"settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.",
"settings-channel-desc1": "You can use this setting to change current instance of Discord:",
"settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!",
"settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.",
"settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.",
"settings-channel-desc5": "unofficial instance of Discord that takes you back to 2016! Only client mod\n available to run alongside with it is Cordwood. It's run by community, so you take all the risk by\n using it.",
"settings-invitewebsocket": "Invite Websocket",
"settings-invitewebsocket-desc": "When enabled ArmCord will support Discord.gg links which means that if you open an invite link in your\n browser, ArmCord will automatically accept the invite. Can be unresponsive at times.",
"settings-altPaste-desc": "If you're on Gnome on Linux or just simply can't paste images copied from other messages, then this is\n for you. This enables alternative module for pasting images. Only enable this when you're experiencing\n issues.",
"settings-mod": "Client mod",
"settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!",
"settings-mod-desc2": "focuses on making the Discord plugin development experience easier. Minimal and\n lightweight.",
"settings-mod-desc3": "light, secure, and easy to use, with out of the box experience. Features a built-in\n store for plugins.",
"settings-prfmMode": "Performance mode is an experimental function that may either increase responsiveness and performance of\n ArmCord or... decrease it. Please try every option and see which fits you the best.",
"settings-prfmMode-battery": "Battery",
"settings-trayIcon": "Tray icon",
"settings-trayIcon-desc": "Set the icon which will appear in tray menu.",
"settings-advanced": "Advanced user zone",
"settings-pluginsFolder": "Open plugins folder",
"settings-themesFolder": "Open themes folder",
"settings-none": "None",
"settings-save": "Save Settings",
"settings-updater": "Check for updates",
"settings-restart": "Restart App"
}

View file

@ -52,6 +52,5 @@
"settings-themesFolder": "Open themes folder", "settings-themesFolder": "Open themes folder",
"settings-storageFolder": "Open storage folder", "settings-storageFolder": "Open storage folder",
"settings-none": "None", "settings-none": "None",
"settings-save": "保存设置", "settings-save": "保存设置"
"settings-restart": "Restart App"
} }

View file

@ -7,7 +7,6 @@
"build": "tsc && copyfiles -u 1 src/**/*.html src/**/**/*.css ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/", "build": "tsc && copyfiles -u 1 src/**/*.html src/**/**/*.css ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/",
"watch": "tsc -w", "watch": "tsc -w",
"start": "npm run build && electron ./ts-out/main.js", "start": "npm run build && electron ./ts-out/main.js",
"startNoSandbox": "npm run build && electron ./ts-out/main.js --no-sandbox",
"package": "npm run build && electron-builder", "package": "npm run build && electron-builder",
"packageQuick": "npm run build && electron-builder --dir", "packageQuick": "npm run build && electron-builder --dir",
"format": "prettier --write src/**/*", "format": "prettier --write src/**/*",

2179
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load diff

View file

@ -74,56 +74,52 @@ p {
vertical-align: middle; vertical-align: middle;
border-radius: 10px; border-radius: 10px;
background: var(--background-floating); background: var(--background-floating);
padding-left: 20px; border: 20px;
padding-right: 20px;
border-color: var(--background-floating); border-color: var(--background-floating);
border-style: solid; border-style: solid;
} }
.saveBar { .saveBar {
position: fixed; position: fixed;
bottom: 20px; bottom: 20px;
float: left;
left: 0;
font-weight: bold;
z-index: 999;
font-size: 10px;
}
.restartBar {
position: fixed;
bottom: 20px;
float: right;
right: 0;
font-weight: bold; font-weight: bold;
z-index: 999; z-index: 999;
font-size: 10px; font-size: 10px;
} }
.saveBar > button { .saveBar > button {
width: 90px; width: 90px;
transform: translateX(56%);
}
.restartBar > button {
width: 90px;
transform: translateX(50%);
} }
.header { .header {
color: var(--header-primary); color: var(--header-primary);
font-size: 1.5em; font-size: 1.5em;
position: relative; position: relative;
bottom: 20px;
font-weight: bold; font-weight: bold;
top: 15px; }
margin: auto; .header2 {
color: var(--header-primary);
font-size: 1.5em;
position: relative;
bottom: 0px;
font-weight: bold;
}
.description2 {
position: relative;
color: white;
font-size: 1.2em;
font-weight: lighter;
bottom: 15px;
} }
.description { .description {
position: relative; position: relative;
color: white; color: white;
font-size: 1.2em; font-size: 1.2em;
font-weight: lighter; font-weight: lighter;
bottom: 40px;
} }
.dropdown { .dropdown {
position: relative; position: relative;
font-size: 25px; font-size: 25px;
margin-top: 20px;
} }
.center { .center {
text-align: center; text-align: center;
@ -163,9 +159,6 @@ button:active {
#save { #save {
font-size: 15px; font-size: 15px;
} }
.acAdvSettings {
height: 400px !important;
}
.tgl { .tgl {
display: none; display: none;
} }
@ -177,7 +170,6 @@ button:active {
.tgl *:before, .tgl *:before,
.tgl + .tgl-btn { .tgl + .tgl-btn {
box-sizing: border-box; box-sizing: border-box;
margin-top: 20px;
} }
.tgl::-moz-selection, .tgl::-moz-selection,
.tgl:after::-moz-selection, .tgl:after::-moz-selection,
@ -246,17 +238,6 @@ button:active {
.tgl-light:checked + .tgl-btn { .tgl-light:checked + .tgl-btn {
background: var(--brand-experiment); background: var(--brand-experiment);
} }
select optgroup {
color: #fff6;
font-weight: 200;
font-style: italic;
}
select option {
color: #fff;
font-weight: 400;
font-style: normal;
}
select { select {
-webkit-appearance: button; -webkit-appearance: button;
-moz-appearance: button; -moz-appearance: button;

View file

@ -90,18 +90,7 @@ body {
} }
/* }}} */ /* }}} */
/* Titlebar {{{ */ /* Logo {{{ */
div {
margin: 0;
padding: 0;
border: 0;
display: block;
font-weight: inherit;
font-style: inherit;
font-family: inherit;
font-size: 100%;
vertical-align: baseline;
}
#logo { #logo {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -111,24 +100,20 @@ div {
width: 292px; width: 292px;
} }
[armcord-platform="win32"] .titlebar #window-controls-container #maximize, .titlebar #window-controls-container #maximize {
[armcord-platform="linux"] .titlebar #window-controls-container #maximize {
display: none; display: none;
} }
[armcord-platform="win32"] .titlebar #window-controls-container #spacer, .titlebar #window-controls-container #spacer {
[armcord-platform="linux"] .titlebar #window-controls-container #spacer {
float: left; float: left;
height: 100%; height: 100%;
width: 33%; width: 33%;
} }
[armcord-platform="darwin"] .titlebar #window-controls-container #quit { [armcord-platform="darwin"] .titlebar #window-controls-container {
width: 18% !important; margin-left: -26px;
} }
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize, [armcord-platform="darwin"] .titlebar #window-controls-container #minimize {
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize #maximize-icon { transform: translateX(5px);
background-color: #d6d6d5 !important;
pointer-events: none;
} }
/* }}} */ /* }}} */

View file

@ -260,11 +260,10 @@
[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #maximize, [armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #maximize,
[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #quit { [armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #quit {
background-color: #d6d6d5 !important; background-color: #d6d6d5 !important;
pointer-events: none;
transition: background-color 0.1s ease-in; transition: background-color 0.1s ease-in;
} }
[armcord-platform="darwin"]:not([unFocused]) .titlebar #window-controls-container #quit #quit-icon { [armcord-platform="darwin"] .titlebar #window-controls-container #quit #quit-icon {
background-color: #79282b; background-color: #79282b;
-webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=")
no-repeat 50% 50%; no-repeat 50% 50%;
@ -272,7 +271,7 @@
no-repeat 50% 50%; no-repeat 50% 50%;
transform: translate(-0.3px, -11.7px); transform: translate(-0.3px, -11.7px);
} }
[armcord-platform="darwin"]:not([unFocused]) .titlebar #window-controls-container #minimize #minimize-icon { [armcord-platform="darwin"] .titlebar #window-controls-container #minimize #minimize-icon {
background-color: #7d631b; background-color: #7d631b;
-webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=")
no-repeat 50% 50%; no-repeat 50% 50%;
@ -280,7 +279,7 @@
no-repeat 50% 50%; no-repeat 50% 50%;
transform: translate(-0px, -11.7px); transform: translate(-0px, -11.7px);
} }
[armcord-platform="darwin"]:not([unFocused]) .titlebar #window-controls-container #maximize #maximize-icon { [armcord-platform="darwin"] .titlebar #window-controls-container #maximize #maximize-icon {
background-color: #1d7525; background-color: #1d7525;
-webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=")
no-repeat 50% 50%; no-repeat 50% 50%;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -2,7 +2,6 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/ico" href="./favicon.ico" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ArmCord Setup</title> <title>ArmCord Setup</title>
@ -53,7 +52,9 @@
<p class="text-center setup-ask" id="setup_question4">Select a client mod you want to install:</p> <p class="text-center setup-ask" id="setup_question4">Select a client mod you want to install:</p>
<div class="center"> <div class="center">
<select name="mod" id="mod" class="dropdown-button"> <select name="mod" id="mod" class="dropdown-button">
<option value="none">None (check Discord)</option> <option value="cumcord">Cumcord</option>
<option value="goosemod">GooseMod</option>
<option value="flicker">Flicker (Heavily WIP)</option>
</select> </select>
</div> </div>
<p class="text-center" id="setup_question4_clientmodnotice"> <p class="text-center" id="setup_question4_clientmodnotice">
@ -118,7 +119,7 @@
minimizeToTray: true, minimizeToTray: true,
alternativePaste: false, alternativePaste: false,
automaticPatches: false, automaticPatches: false,
mods: "none", mods: "cumcord",
inviteWebsocket: true, inviteWebsocket: true,
mobileMode: false, mobileMode: false,
trayIcon: "default", trayIcon: "default",

View file

@ -2,7 +2,6 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/ico" href="./favicon.ico" />
<title>ArmCord</title> <title>ArmCord</title>
<style> <style>
@import url("css/splash.css"); @import url("css/splash.css");

View file

@ -21,7 +21,15 @@ const unstrictCSP = () => {
const cspAllowAll = ["connect-src", "style-src", "img-src", "font-src"]; const cspAllowAll = ["connect-src", "style-src", "img-src", "font-src"];
const corsAllowUrls = ["https://raw.githubusercontent.com/Cordwood/builds/master/index.js"]; const corsAllowUrls = [
"https://github.com/GooseMod/GooseMod/releases/download/dev/index.js",
"https://github-releases.githubusercontent.com/",
"https://api.goosemod.com/inject.js",
"https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js",
"https://raw.githubusercontent.com/Cumcord/Cumcord/master/dist/build.js",
"https://raw.githubusercontent.com/FlickerMod/dist/main/build.js",
"https://raw.githubusercontent.com/Cordwood/builds/master/index.js"
];
electron.session.defaultSession.webRequest.onHeadersReceived(({responseHeaders, url}, done) => { electron.session.defaultSession.webRequest.onHeadersReceived(({responseHeaders, url}, done) => {
let csp = responseHeaders!["content-security-policy"]; let csp = responseHeaders!["content-security-policy"];

View file

@ -1,5 +1,5 @@
//ipc stuff //ipc stuff
import {app, ipcMain, shell, desktopCapturer, nativeImage} from "electron"; import {app, ipcMain, shell, desktopCapturer,nativeImage} from "electron";
import {mainWindow} from "./window"; import {mainWindow} from "./window";
import { import {
setConfigBulk, setConfigBulk,
@ -8,8 +8,7 @@ import {
setLang, setLang,
getLang, getLang,
getWindowState, getWindowState,
packageVersion, packageVersion, getDisplayVersion
getDisplayVersion
} from "./utils"; } from "./utils";
import {customTitlebar} from "./main"; import {customTitlebar} from "./main";
import {createSettingsWindow} from "./settings/main"; import {createSettingsWindow} from "./settings/main";
@ -31,14 +30,14 @@ export function registerIpc() {
ipcMain.on("setPing", (event, pingCount: number) => { ipcMain.on("setPing", (event, pingCount: number) => {
switch (os.platform()) { switch (os.platform()) {
case "linux" ?? "macos": case "linux" ?? "macos":
app.setBadgeCount(pingCount); app.setBadgeCount(pingCount)
break; break;
case "win32": case "win32":
if (pingCount > 0) { if (pingCount > 0) {
var image = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ping.png`)); var image = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ping.png`))
mainWindow.setOverlayIcon(image, "badgeCount"); mainWindow.setOverlayIcon(image, "badgeCount")
} else { } else {
mainWindow.setOverlayIcon(null, "badgeCount"); mainWindow.setOverlayIcon(null, "badgeCount")
} }
break; break;
} }

View file

@ -6,8 +6,7 @@ import "./extensions/mods";
import "./extensions/plugin"; import "./extensions/plugin";
import "./tray"; import "./tray";
import {createCustomWindow, createNativeWindow} from "./window"; import {createCustomWindow, createNativeWindow} from "./window";
import path from "path";
export var iconPath: string;
export var settings: any; export var settings: any;
export var customTitlebar: boolean; export var customTitlebar: boolean;
export var clientName: "ArmCord"; export var clientName: "ArmCord";
@ -26,11 +25,6 @@ if (process.platform == "linux") {
checkIfConfigExists(); checkIfConfigExists();
injectElectronFlags(); injectElectronFlags();
app.whenReady().then(async () => { app.whenReady().then(async () => {
if ((await getConfig("customIcon")) !== undefined ?? null) {
iconPath = await getConfig("customIcon");
} else {
iconPath = path.join(__dirname, "../", "/assets/ac_icon_transparent.png");
}
async function init() { async function init() {
switch (await getConfig("windowStyle")) { switch (await getConfig("windowStyle")) {
case "default": case "default":

View file

@ -63,7 +63,7 @@ export async function setMenu() {
label: "Reload", label: "Reload",
accelerator: "CmdOrCtrl+R", accelerator: "CmdOrCtrl+R",
click: function () { click: function () {
mainWindow.reload(); mainWindow.reload()
} }
}, },
{ {
@ -97,7 +97,7 @@ export async function setMenu() {
label: "Zoom", label: "Zoom",
submenu: [ submenu: [
{label: "Zoom in", accelerator: "CmdOrCtrl+Plus", role: "zoomIn"}, {label: "Zoom in", accelerator: "CmdOrCtrl+Plus", role: "zoomIn"},
{label: "Zoom out", accelerator: "CmdOrCtrl+-", role: "zoomOut"} {label: "Zoom out", accelerator: "CmdOrCtrl+-", role: "zoomOut"},
] ]
} }
]; ];

View file

@ -15,6 +15,7 @@ contextBridge.exposeInMainWorld("armcord", {
}, },
electron: process.versions.electron, electron: process.versions.electron,
channel: ipcRenderer.sendSync("channel"), channel: ipcRenderer.sendSync("channel"),
setLang: (lang: string) => ipcRenderer.send("setLang", lang),
setPingCount: (pingCount: number) => ipcRenderer.send("setPing", pingCount), setPingCount: (pingCount: number) => ipcRenderer.send("setPing", pingCount),
setTrayIcon: (favicon: string) => ipcRenderer.send("sendTrayIcon", favicon), setTrayIcon: (favicon: string) => ipcRenderer.send("sendTrayIcon", favicon),
getLang: (toGet: string) => getLang: (toGet: string) =>

View file

@ -4,7 +4,7 @@ import "./patch";
import * as fs from "fs"; import * as fs from "fs";
import * as path from "path"; import * as path from "path";
import {injectHummusTitlebar, injectTitlebar} from "./titlebar"; import {injectHummusTitlebar, injectTitlebar} from "./titlebar";
import {sleep, addStyle, injectJS} from "../utils"; import {sleep, addStyle, injectJS, addScript} from "../utils";
import {ipcRenderer} from "electron"; import {ipcRenderer} from "electron";
import {injectMobileStuff} from "./mobile"; import {injectMobileStuff} from "./mobile";
var version = ipcRenderer.sendSync("displayVersion"); var version = ipcRenderer.sendSync("displayVersion");
@ -13,9 +13,9 @@ async function updateLang() {
if (window.location.href.indexOf("setup.html") > -1) { if (window.location.href.indexOf("setup.html") > -1) {
console.log("Setup, skipping lang update"); console.log("Setup, skipping lang update");
} else { } else {
const value = `; ${document.cookie}`; addScript(`function getDiscordLang() {
const parts: any = value.split(`; locale=`); {const _w=webpackChunkdiscord_app;let lang;_w.push([[Symbol()],{},e=>{for(const k in e.c){const m=e.c[k].exports;const mDef=m?.default&&m.__esModule?m.default:m;if(mDef?._chosenLocale&&!lang)lang=mDef}}]);_w.pop();window.armcord.setLang(lang._chosenLocale);return lang._chosenLocale;void 0}}
if (parts.length === 2) ipcRenderer.send("setLang", parts.pop().split(";").shift()); getDiscordLang();`);
} }
} }
declare global { declare global {
@ -25,6 +25,8 @@ declare global {
} }
const clientMods = { const clientMods = {
goosemod: "https://api.goosemod.com/inject.js", goosemod: "https://api.goosemod.com/inject.js",
cumcord: "https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js",
flicker: "https://raw.githubusercontent.com/FlickerMod/dist/main/build.js",
cordwood: "https://raw.githubusercontent.com/Cordwood/builds/master/index.js" cordwood: "https://raw.githubusercontent.com/Cordwood/builds/master/index.js"
}; };
@ -55,6 +57,16 @@ if (window.location.href.indexOf("splash.html") > -1) {
console.log("Loading GooseMod..."); console.log("Loading GooseMod...");
await updateLang(); await updateLang();
break; break;
case "cumcord":
injectJS(clientMods.cumcord);
console.log("Loading Cumcord...");
await updateLang();
break;
case "flicker":
injectJS(clientMods.flicker);
console.log("Loading FlickerMod...");
await updateLang();
break;
case "cordwood": case "cordwood":
injectJS(clientMods.cordwood); injectJS(clientMods.cordwood);
console.log("Loading Cordwood..."); console.log("Loading Cordwood...");

View file

@ -2,8 +2,12 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>ArmCord Settings</title>
<style> <style>
@import url("../content/css/settings.css"); @import url("../content/css/settings.css");
.acAdvSettings {
height: 19em !important;
}
</style> </style>
</head> </head>
@ -11,9 +15,6 @@
<div class="saveBar"> <div class="saveBar">
<button id="settings-save" class="center">Save Settings</button> <button id="settings-save" class="center">Save Settings</button>
</div> </div>
<div class="restartBar">
<button id="settings-restart" class="center">Restart App</button>
</div>
<div class="switch acTheme"> <div class="switch acTheme">
<select name="theme" id="theme" class="left dropdown"> <select name="theme" id="theme" class="left dropdown">
<option value="default">Default</option> <option value="default">Default</option>
@ -32,40 +33,40 @@
</div> </div>
<br /> <br />
<div class="switch acCSP"> <div class="switch acCSP">
<label class="header">ArmCord CSP</label> <label class="header2">ArmCord CSP</label>
<input class="tgl tgl-light left" id="csp" type="checkbox" /> <input class="tgl tgl-light left" id="csp" type="checkbox" />
<label class="tgl-btn left" for="csp"></label> <label class="tgl-btn left" for="csp"></label>
<p class="description"> <p class="description2">
ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like
client mods and themes depend on it. Disable if you want to get rid of mods and custom styles. client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acTray"> <div class="switch acTray">
<label class="header" id="settings-tray">Minimize to tray</label> <label class="header2" id="settings-tray">Minimize to tray</label>
<input class="tgl tgl-light left" id="tray" type="checkbox" /> <input class="tgl tgl-light left" id="tray" type="checkbox" />
<label class="tgl-btn left" for="tray"></label> <label class="tgl-btn left" for="tray"></label>
<p class="description"> <p class="description2">
When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax
in your system tray for later. in your system tray for later.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acPatches"> <div class="switch acPatches">
<label class="header" id="settings-patches">Automatic Patches</label> <label class="header2" id="settings-patches">Automatic Patches</label>
<input class="tgl tgl-light left" id="patches" type="checkbox" /> <input class="tgl tgl-light left" id="patches" type="checkbox" />
<label class="tgl-btn left" for="patches"></label> <label class="tgl-btn left" for="patches"></label>
<p class="description"> <p class="description2">
Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually
you don't have to keep this enabled, unless notified in support Discord. you don't have to keep this enabled, unless notified in support Discord.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acAltPaste"> <div class="switch acAltPaste">
<label class="header" id="settings-alternativePaste">Alternative paste</label> <label class="header2" id="settings-alternativePaste">Alternative paste</label>
<input class="tgl tgl-light left" id="alternativePaste" type="checkbox" /> <input class="tgl tgl-light left" id="alternativePaste" type="checkbox" />
<label class="tgl-btn left" for="alternativePaste"></label> <label class="tgl-btn left" for="alternativePaste"></label>
<p class="description"> <p class="description2">
If you're on Gnome on Linux or just simply can't paste images copied from other messages, then this is If you're on Gnome on Linux or just simply can't paste images copied from other messages, then this is
for you. This enables alternative module for pasting images. Only enable this when you're experiencing for you. This enables alternative module for pasting images. Only enable this when you're experiencing
issues. issues.
@ -99,10 +100,10 @@
</div> </div>
<br /> <br />
<div class="switch acCordwood"> <div class="switch acCordwood">
<label class="header" id="settings-cordwood">Cordwood client mod</label> <label class="header2" id="settings-cordwood">Cordwood client mod</label>
<input class="tgl tgl-light left" id="cordwood" type="checkbox" /> <input class="tgl tgl-light left" id="cordwood" type="checkbox" />
<label class="tgl-btn left" for="cordwood"></label> <label class="tgl-btn left" for="cordwood"></label>
<p class="description"> <p class="description2">
Client mod for Hummus that focuses on making the plugin development experience easier. Minimal, light, Client mod for Hummus that focuses on making the plugin development experience easier. Minimal, light,
and easy to use and easy to use
</p> </p>
@ -123,18 +124,13 @@
<br /> <br />
<div class="switch acTray"> <div class="switch acTray">
<select name="trayIcon" id="trayIcon" class="left dropdown"> <select name="trayIcon" id="trayIcon" class="left dropdown">
<optgroup label="- Discord -"> <option value="default">Default (Dynamic)</option>
<option value="default">Dynamic</option> <option value="ac_plug_colored">Plug colored</option>
<option value="dsc-tray">Discord Icon</option> <option value="dsc-tray">Discord Icon</option>
<option value="clsc-dsc-tray">Classic Discord Icon</option> <option value="ac_white_plug">White Icon</option>
</optgroup> <option value="ac_black_plug">Black Icon</option>
<optgroup label="- ArmCord -"> <option value="ac_white_plug_hollow">White Hollowed Icon</option>
<option value="ac_plug_colored">Colored Plug</option> <option value="ac_black_plug_hollow">Black Hollowed Icon</option>
<option value="ac_white_plug">White Plug</option>
<option value="ac_white_plug_hollow">White Plug Alt</option>
<option value="ac_black_plug">Black Plug</option>
<option value="ac_black_plug_hollow">Black Plug Alt</option>
</optgroup>
</select> </select>
<p class="header" id="settings-trayIcon">Tray icon:</p> <p class="header" id="settings-trayIcon">Tray icon:</p>
<p class="description">Set the icon which will appear in tray menu.</p> <p class="description">Set the icon which will appear in tray menu.</p>
@ -143,13 +139,6 @@
<br /> <br />
<div class="switch acAdvSettings"> <div class="switch acAdvSettings">
<h1 class="center advancedText">⚠️ Advanced User Zone ⚠️</h1> <h1 class="center advancedText">⚠️ Advanced User Zone ⚠️</h1>
<br />
<br />
<label class="header" id="settings-skipSplash">Skip Splash Screen (Experimental)</label>
<input class="tgl tgl-light left" id="skipSplash" type="checkbox" />
<label class="tgl-btn left" for="skipSplash"></label>
<p class="description">Skips ArmCord splash screen when you start up the app.</p>
<br />
<button id="settings-pluginsFolder" class="center">Open Plugins Folder</button> <button id="settings-pluginsFolder" class="center">Open Plugins Folder</button>
<br /> <br />
<button id="settings-themesFolder" class="center">Open Themes Folder</button> <button id="settings-themesFolder" class="center">Open Themes Folder</button>
@ -193,27 +182,27 @@
document.getElementById("trayIcon").value = await settings.get("trayIcon"); document.getElementById("trayIcon").value = await settings.get("trayIcon");
} }
loadSettings(); loadSettings();
document.getElementById("settings-save").addEventListener("click", function () { document.getElementById("settings-save").addEventListener("click", async function () {
var cordwood;
if (document.getElementById("cordwood").checked) {
cordwood = true;
} else {
cordwood = false;
}
settings.save({ settings.save({
windowStyle: document.getElementById("theme").value, windowStyle: document.getElementById("theme").value,
channel: document.getElementById("channel").value, channel: document.getElementById("channel").value,
armcordCSP: document.getElementById("csp").checked, armcordCSP: document.getElementById("csp").checked,
minimizeToTray: document.getElementById("tray").checked, minimizeToTray: document.getElementById("tray").checked,
alternativePaste: document.getElementById("alternativePaste").checked, alternativePaste: document.getElementById("alternativePaste").checked,
skipSplash: document.getElementById("skipSplash").checked,
automaticPatches: document.getElementById("patches").checked, automaticPatches: document.getElementById("patches").checked,
mods: cordwood, mods: cordwood,
mobileMode: document.getElementById("mobile").checked, mobileMode: await settings.get("mobileMode"),
inviteWebsocket: document.getElementById("websocket").checked, inviteWebsocket: await settings.get("inviteWebsocket"),
performanceMode: document.getElementById("prfmMode").value, performanceMode: document.getElementById("prfmMode").value,
trayIcon: document.getElementById("trayIcon").value, trayIcon: document.getElementById("trayIcon").value,
doneSetup: true doneSetup: true
}); });
alert(`Your settings have been saved!
Some changes may require the app to restart before taking effect.`);
});
document.getElementById("settings-restart").addEventListener("click", function () {
settings.restart();
}); });
document.getElementById("settings-pluginsFolder").addEventListener("click", async function () { document.getElementById("settings-pluginsFolder").addEventListener("click", async function () {
settings.openPluginsFolder(); settings.openPluginsFolder();

View file

@ -1,19 +1,8 @@
import {BrowserWindow, shell, ipcMain, app, clipboard} from "electron"; import {BrowserWindow, shell, ipcMain, app, clipboard} from "electron";
import { import {getConfig, setConfigBulk, Settings, getLang, getVersion, getConfigLocation, getLangName} from "../utils";
getConfig,
setConfigBulk,
Settings,
getLang,
getVersion,
getConfigLocation,
getLangName,
sleep,
getDisplayVersion
} from "../utils";
import path from "path"; import path from "path";
import os from "os"; import os from "os";
import fs from "fs"; import fs from "fs";
import {mainWindow} from "../window";
var settingsWindow: BrowserWindow; var settingsWindow: BrowserWindow;
var instance: number = 0; var instance: number = 0;
const userDataPath = app.getPath("userData"); const userDataPath = app.getPath("userData");
@ -32,7 +21,7 @@ export function createSettingsWindow() {
settingsWindow = new BrowserWindow({ settingsWindow = new BrowserWindow({
width: 660, width: 660,
height: 670, height: 670,
title: `ArmCord Settings | Version: ${getDisplayVersion()}`, title: "ArmCord Settings",
darkTheme: true, darkTheme: true,
frame: true, frame: true,
autoHideMenuBar: true, autoHideMenuBar: true,
@ -48,42 +37,19 @@ export function createSettingsWindow() {
settingsWindow.loadURL(`file://${__dirname}/settings.html`); settingsWindow.loadURL(`file://${__dirname}/settings.html`);
} }
} }
const userDataPath = app.getPath("userData");
const themesFolder = userDataPath + "/themes/";
if (!fs.existsSync(themesFolder)) {
fs.mkdirSync(themesFolder);
console.log("Created missing theme folder");
}
settingsWindow.webContents.on("did-finish-load", () => {
fs.readdirSync(themesFolder).forEach((file) => {
try {
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
var themeFile = JSON.parse(manifest);
settingsWindow.webContents.send(
"themeLoader",
fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8")
);
console.log(`%cLoaded ${themeFile.name} made by ${themeFile.author}`, "color:red");
} catch (err) {
console.error(err);
}
});
});
ipcMain.on("saveSettings", (event, args: Settings) => { ipcMain.on("saveSettings", (event, args: Settings) => {
console.log(args); console.log(args);
setConfigBulk(args); setConfigBulk(args);
}); });
ipcMain.on("openStorageFolder", async (event) => { ipcMain.on("openStorageFolder", (event) => {
shell.openPath(storagePath); shell.openPath(storagePath);
await sleep(1000);
}); });
ipcMain.on("openThemesFolder", async (event) => { ipcMain.on("openThemesFolder", (event) => {
shell.openPath(themesPath); shell.openPath(themesPath);
await sleep(1000);
}); });
ipcMain.on("openPluginsFolder", async (event) => { ipcMain.on("openPluginsFolder", (event) => {
shell.openPath(pluginsPath); shell.openPath(pluginsPath);
await sleep(1000);
}); });
ipcMain.on("getLangName", async (event) => { ipcMain.on("getLangName", async (event) => {
event.returnValue = await getLangName(); event.returnValue = await getLangName();

View file

@ -6,8 +6,6 @@ console.log("ArmCord Settings");
contextBridge.exposeInMainWorld("settings", { contextBridge.exposeInMainWorld("settings", {
save: (...args: any) => ipcRenderer.send("saveSettings", ...args), save: (...args: any) => ipcRenderer.send("saveSettings", ...args),
restart: () => ipcRenderer.send("restart"),
saveAlert: (restartFunc: any) => ipcRenderer.send("saveAlert", restartFunc),
getLang: (toGet: string) => getLang: (toGet: string) =>
ipcRenderer.invoke("getLang", toGet).then((result) => { ipcRenderer.invoke("getLang", toGet).then((result) => {
return result; return result;
@ -21,6 +19,7 @@ contextBridge.exposeInMainWorld("settings", {
openStorageFolder: () => ipcRenderer.send("openStorageFolder"), openStorageFolder: () => ipcRenderer.send("openStorageFolder"),
copyDebugInfo: () => ipcRenderer.send("copyDebugInfo") copyDebugInfo: () => ipcRenderer.send("copyDebugInfo")
}); });
ipcRenderer.on("themeLoader", (event, message) => { if (ipcRenderer.sendSync("getLangName") == "en-US") {
addStyle(message); const cssPath = path.join(__dirname, "../", "/content/css/settingsEng.css");
}); addStyle(fs.readFileSync(cssPath, "utf8"));
}

View file

@ -2,8 +2,12 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>ArmCord Settings</title>
<style> <style>
@import url("../content/css/settings.css"); @import url("../content/css/settings.css");
.acAdvSettings {
height: 26em !important;
}
</style> </style>
</head> </head>
@ -11,9 +15,6 @@
<div class="saveBar"> <div class="saveBar">
<button id="settings-save" class="center">Save Settings</button> <button id="settings-save" class="center">Save Settings</button>
</div> </div>
<div class="restartBar">
<button id="settings-restart" class="center">Restart App</button>
</div>
<div class="switch acTheme"> <div class="switch acTheme">
<select name="theme" id="theme" class="left dropdown"> <select name="theme" id="theme" class="left dropdown">
<option value="default">Default</option> <option value="default">Default</option>
@ -32,50 +33,50 @@
</div> </div>
<br /> <br />
<div class="switch acCSP"> <div class="switch acCSP">
<label class="header">ArmCord CSP</label> <label class="header2">ArmCord CSP</label>
<input class="tgl tgl-light left" id="csp" type="checkbox" /> <input class="tgl tgl-light left" id="csp" type="checkbox" />
<label class="tgl-btn left" for="csp"></label> <label class="tgl-btn left" for="csp"></label>
<p class="description"> <p class="description2">
ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like
client mods and themes depend on it. Disable if you want to get rid of mods and custom styles. client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acTray"> <div class="switch acTray">
<label class="header" id="settings-tray">Minimize to tray</label> <label class="header2" id="settings-tray">Minimize to tray</label>
<input class="tgl tgl-light left" id="tray" type="checkbox" /> <input class="tgl tgl-light left" id="tray" type="checkbox" />
<label class="tgl-btn left" for="tray"></label> <label class="tgl-btn left" for="tray"></label>
<p class="description"> <p class="description2">
When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax
in your system tray for later. in your system tray for later.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acPatches"> <div class="switch acPatches">
<label class="header" id="settings-patches">Automatic Patches</label> <label class="header2" id="settings-patches">Automatic Patches</label>
<input class="tgl tgl-light left" id="patches" type="checkbox" /> <input class="tgl tgl-light left" id="patches" type="checkbox" />
<label class="tgl-btn left" for="patches"></label> <label class="tgl-btn left" for="patches"></label>
<p class="description"> <p class="description2">
Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually
you don't have to keep this enabled, unless notified in support Discord. you don't have to keep this enabled, unless notified in support Discord.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acWebsocket"> <div class="switch acWebsocket">
<label class="header" id="settings-invitewebsocket">Invite Websocket</label> <label class="header2" id="settings-invitewebsocket">Invite Websocket</label>
<input class="tgl tgl-light left" id="websocket" type="checkbox" /> <input class="tgl tgl-light left" id="websocket" type="checkbox" />
<label class="tgl-btn left" for="websocket"></label> <label class="tgl-btn left" for="websocket"></label>
<p class="description"> <p class="description2">
When enabled ArmCord will support Discord.gg links which means that if you open an invite link in your When enabled ArmCord will support Discord.gg links which means that if you open an invite link in your
browser, ArmCord will automatically accept the invite. Can be unresponsive at times. browser, ArmCord will automatically accept the invite. Can be unresponsive at times.
</p> </p>
</div> </div>
<br /> <br />
<div class="switch acMobileMode"> <div class="switch acMobileMode">
<label class="header" id="settings-mobileMode">Mobile mode</label> <label class="header2" id="settings-mobileMode">Mobile mode</label>
<input class="tgl tgl-light left" id="mobile" type="checkbox" /> <input class="tgl tgl-light left" id="mobile" type="checkbox" />
<label class="tgl-btn left" for="mobile"></label> <label class="tgl-btn left" for="mobile"></label>
<p class="description"> <p class="description2">
If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile
mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for
users on PinePhone and similar. users on PinePhone and similar.
@ -83,10 +84,10 @@
</div> </div>
<br /> <br />
<div class="switch acAltPaste"> <div class="switch acAltPaste">
<label class="header" id="settings-alternativePaste">Alternative paste</label> <label class="header2" id="settings-alternativePaste">Alternative paste</label>
<input class="tgl tgl-light left" id="alternativePaste" type="checkbox" /> <input class="tgl tgl-light left" id="alternativePaste" type="checkbox" />
<label class="tgl-btn left" for="alternativePaste"></label> <label class="tgl-btn left" for="alternativePaste"></label>
<p class="description"> <p class="description2">
If you're on Gnome on Linux or just simply can't paste images copied from other messages, then this is If you're on Gnome on Linux or just simply can't paste images copied from other messages, then this is
for you. This enables alternative module for pasting images. Only enable this when you're experiencing for you. This enables alternative module for pasting images. Only enable this when you're experiencing
issues. issues.
@ -98,7 +99,7 @@
<option value="stable">Stable</option> <option value="stable">Stable</option>
<option value="canary">Canary</option> <option value="canary">Canary</option>
<option value="ptb">PTB</option> <option value="ptb">PTB</option>
<option value="hummus">Hummus (Experimental)</option> <option value="hummus">Hummus (unofficial)</option>
</select> </select>
<div> <div>
<p class="header" id="settings-channel">Discord channel</p> <p class="header" id="settings-channel">Discord channel</p>
@ -123,7 +124,9 @@
<br /> <br />
<div class="switch acClientMod"> <div class="switch acClientMod">
<select name="mod" id="mod" class="left dropdown"> <select name="mod" id="mod" class="left dropdown">
<option value="cumcord">Cumcord</option>
<option value="goosemod">GooseMod</option> <option value="goosemod">GooseMod</option>
<option value="flicker">Flicker</option>
<option value="none">None</option> <option value="none">None</option>
</select> </select>
<p class="header" id="settings-mod">Client mod</p> <p class="header" id="settings-mod">Client mod</p>
@ -131,8 +134,13 @@
Client mods are programs that allow you customize your Discord experience. They can change appearance of Client mods are programs that allow you customize your Discord experience. They can change appearance of
the client, modify behaviours or add new features! the client, modify behaviours or add new features!
<br /> <br />
<b>Cumcord</b> - focuses on making the Discord plugin development experience easier. Minimal and
lightweight.
<br />
<b>GooseMod</b> - light, secure, and easy to use, with out of the box experience. Features a built-in <b>GooseMod</b> - light, secure, and easy to use, with out of the box experience. Features a built-in
store for plugins. store for plugins.
<br />
<b>Flicker</b> - heavily work in progress, doesn't have a working UI.
</p> </p>
</div> </div>
<br /> <br />
@ -151,18 +159,13 @@
<br /> <br />
<div class="switch acTray"> <div class="switch acTray">
<select name="trayIcon" id="trayIcon" class="left dropdown"> <select name="trayIcon" id="trayIcon" class="left dropdown">
<optgroup label="- Discord -"> <option value="default">Default (dynamic)</option>
<option value="default">Dynamic</option> <option value="ac_plug_colored">Plug colored</option>
<option value="dsc-tray">Discord Icon</option> <option value="dsc-tray">Discord Icon</option>
<option value="clsc-dsc-tray">Classic Discord Icon</option> <option value="ac_white_plug">White Icon</option>
</optgroup> <option value="ac_black_plug">Black Icon</option>
<optgroup label="- ArmCord -"> <option value="ac_white_plug_hollow">White Hollowed Icon</option>
<option value="ac_plug_colored">Colored Plug</option> <option value="ac_black_plug_hollow">Black Hollowed Icon</option>
<option value="ac_white_plug">White Plug</option>
<option value="ac_white_plug_hollow">White Plug Alt</option>
<option value="ac_black_plug">Black Plug</option>
<option value="ac_black_plug_hollow">Black Plug Alt</option>
</optgroup>
</select> </select>
<p class="header" id="settings-trayIcon">Tray icon</p> <p class="header" id="settings-trayIcon">Tray icon</p>
<p class="description">Set the icon which will appear in tray menu.</p> <p class="description">Set the icon which will appear in tray menu.</p>
@ -172,11 +175,10 @@
<div class="switch acAdvSettings"> <div class="switch acAdvSettings">
<h1 class="center advancedText">⚠️ Advanced User Zone ⚠️</h1> <h1 class="center advancedText">⚠️ Advanced User Zone ⚠️</h1>
<br /> <br />
<br /> <label class="header2" id="settings-skipSplash">Skip Splash Screen (Experimental)</label>
<label class="header" id="settings-skipSplash">Skip Splash Screen (Experimental)</label>
<input class="tgl tgl-light left" id="skipSplash" type="checkbox" /> <input class="tgl tgl-light left" id="skipSplash" type="checkbox" />
<label class="tgl-btn left" for="skipSplash"></label> <label class="tgl-btn left" for="skipSplash"></label>
<p class="description">Skips ArmCord splash screen when you start up the app.</p> <p class="description2">Skips ArmCord splash screen when you start up the app.</p>
<br /> <br />
<button id="settings-pluginsFolder" class="center">Open Plugins Folder</button> <button id="settings-pluginsFolder" class="center">Open Plugins Folder</button>
<br /> <br />
@ -189,7 +191,6 @@
</body> </body>
<script> <script>
async function loadLang() { async function loadLang() {
document.getElementById("settings-restart").innerHTML = await settings.getLang("settings-restart");
document.getElementById("settings-save").innerHTML = await settings.getLang("settings-save"); document.getElementById("settings-save").innerHTML = await settings.getLang("settings-save");
document.getElementById("settings-mod").innerHTML = await settings.getLang("settings-mod"); document.getElementById("settings-mod").innerHTML = await settings.getLang("settings-mod");
document.getElementById("settings-channel").innerHTML = await settings.getLang("settings-channel"); document.getElementById("settings-channel").innerHTML = await settings.getLang("settings-channel");
@ -244,15 +245,6 @@
trayIcon: document.getElementById("trayIcon").value, trayIcon: document.getElementById("trayIcon").value,
doneSetup: true doneSetup: true
}); });
if (
confirm(`Your settings have been saved!
Some changes may require the app to restart before taking effect, would you like to do so now?`) == true
) {
settings.restart();
}
});
document.getElementById("settings-restart").addEventListener("click", function () {
settings.restart();
}); });
document.getElementById("settings-pluginsFolder").addEventListener("click", function () { document.getElementById("settings-pluginsFolder").addEventListener("click", function () {
settings.openPluginsFolder(); settings.openPluginsFolder();

View file

@ -1,28 +1,18 @@
import * as fs from "fs"; import * as fs from "fs";
import {app, Menu, Tray, nativeImage} from "electron"; import {app, Menu, Tray, nativeImage} from "electron";
import {mainWindow} from "./window"; import {mainWindow} from "./window";
import {getConfig, getConfigLocation, setWindowState, getDisplayVersion} from "./utils"; import {getConfig, getConfigLocation, setWindowState} from "./utils";
import * as path from "path"; import * as path from "path";
import {createSettingsWindow} from "./settings/main"; import {createSettingsWindow} from "./settings/main";
export let tray: any = null; export let tray: any = null;
app.whenReady().then(async () => { app.whenReady().then(async () => {
let finishedSetup = await getConfig("doneSetup"); let finishedSetup = await getConfig("doneSetup");
var trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored"; var trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored";
let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/${trayIcon}.png`)); if (trayIcon = "default") {
let trayVerIcon; trayIcon = "dsc-tray"
trayVerIcon = function () {
if (process.platform == "win32") {
return trayPath.resize({height: 16});
} else if (process.platform == "darwin") {
return trayPath.resize({height: 18});
} else if (process.platform == "linux") {
return trayPath.resize({height: 24});
} }
}; let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
if (process.platform === "darwin" && trayPath.getSize().height > 22) trayPath = trayPath.resize({height: 22});
if (process.platform == "darwin" && trayPath.getSize().height > 22)
trayPath = trayPath.resize({height: 22});
if ((await getConfig("windowStyle")) == "basic") { if ((await getConfig("windowStyle")) == "basic") {
var clientName = (await getConfig("clientName")) ?? "ArmCord"; var clientName = (await getConfig("clientName")) ?? "ArmCord";
tray = new Tray(trayPath); tray = new Tray(trayPath);
@ -32,13 +22,12 @@ app.whenReady().then(async () => {
{ {
label: `Finish the setup first!`, label: `Finish the setup first!`,
enabled: false enabled: false
}, { },
{
label: `Quit ${clientName}`, label: `Quit ${clientName}`,
click: async function () { click: async function () {
fs.unlink(await getConfigLocation(), (err) => { fs.unlink(await getConfigLocation(), (err) => {
if (err) if (err) throw err;
throw err;
console.log('Closed during setup. "settings.json" was deleted'); console.log('Closed during setup. "settings.json" was deleted');
app.quit(); app.quit();
}); });
@ -52,11 +41,16 @@ app.whenReady().then(async () => {
click: function () { click: function () {
mainWindow.show(); mainWindow.show();
} }
}, { },
{
label: `Quit ${clientName}`, label: `Quit ${clientName}`,
click: function () { click: function () {
let [width, height] = mainWindow.getSize(); let [width, height] = mainWindow.getSize();
setWindowState({width: width, height: height, isMaximized: mainWindow.isMaximized()}); setWindowState({
width: width,
height: height,
isMaximized: mainWindow.isMaximized()
});
app.quit(); app.quit();
} }
} }
@ -74,13 +68,12 @@ app.whenReady().then(async () => {
{ {
label: `Finish the setup first!`, label: `Finish the setup first!`,
enabled: false enabled: false
}, { },
{
label: `Quit ${clientName}`, label: `Quit ${clientName}`,
click: async function () { click: async function () {
fs.unlink(await getConfigLocation(), (err) => { fs.unlink(await getConfigLocation(), (err) => {
if (err) if (err) throw err;
throw err;
console.log('Closed during setup. "settings.json" was deleted'); console.log('Closed during setup. "settings.json" was deleted');
app.quit(); app.quit();
}); });
@ -91,8 +84,7 @@ app.whenReady().then(async () => {
} else { } else {
const contextMenu = Menu.buildFromTemplate([ const contextMenu = Menu.buildFromTemplate([
{ {
label: `${clientName} ` + getDisplayVersion(), label: `${clientName} ` + app.getVersion(),
icon: trayVerIcon(),
enabled: false enabled: false
}, },
{ {
@ -109,15 +101,18 @@ app.whenReady().then(async () => {
click: function () { click: function () {
createSettingsWindow(); createSettingsWindow();
} }
}, { },
{
label: "Support Discord Server", label: "Support Discord Server",
click: function () { click: function () {
mainWindow.show(); mainWindow.show();
mainWindow.loadURL("https://discord.gg/TnhxcqynZ2"); mainWindow.loadURL("https://discord.gg/TnhxcqynZ2");
} }
}, { },
{
type: "separator" type: "separator"
}, { },
{
label: `Quit ${clientName}`, label: `Quit ${clientName}`,
click: function () { click: function () {
app.quit(); app.quit();
@ -126,7 +121,9 @@ app.whenReady().then(async () => {
]); ]);
tray.setContextMenu(contextMenu); tray.setContextMenu(contextMenu);
} }
} tray.setToolTip(clientName); }
tray.setToolTip(clientName);
tray.on("click", function () { tray.on("click", function () {
mainWindow.show(); mainWindow.show();
}); });

View file

@ -40,7 +40,7 @@ export function setup() {
minimizeToTray: true, minimizeToTray: true,
automaticPatches: false, automaticPatches: false,
alternativePaste: false, alternativePaste: false,
mods: "none", mods: "cumcord",
performanceMode: "none", performanceMode: "none",
skipSplash: false, skipSplash: false,
inviteWebsocket: true, inviteWebsocket: true,
@ -62,11 +62,7 @@ export function getVersion() {
export function getDisplayVersion() { export function getDisplayVersion() {
//Checks if the app version # has 4 sections (3.1.0.0) instead of 3 (3.1.0) / Shitty way to check if Kernel Mod is installed //Checks if the app version # has 4 sections (3.1.0.0) instead of 3 (3.1.0) / Shitty way to check if Kernel Mod is installed
if ((app.getVersion() == packageVersion) == false) { if ((app.getVersion() == packageVersion) == false) {
if ((app.getVersion() == process.versions.electron) == true) { return `${packageVersion} [Kernel Mod]`;
return `Dev Build (${packageVersion})`;
} else {
return `${packageVersion} [Modified]`;
}
} else { } else {
return packageVersion; return packageVersion;
} }

View file

@ -4,7 +4,15 @@
// I'm sorry for this mess but I'm not sure how to fix it. // I'm sorry for this mess but I'm not sure how to fix it.
import {BrowserWindow, shell, app, dialog, nativeImage} from "electron"; import {BrowserWindow, shell, app, dialog, nativeImage} from "electron";
import path from "path"; import path from "path";
import {checkIfConfigIsBroken, firstRun, getConfig, contentPath, setConfig, setLang, setWindowState} from "./utils"; import {
checkIfConfigIsBroken,
firstRun,
getConfig,
contentPath,
setConfig,
setLang,
setWindowState
} from "./utils";
import {registerIpc} from "./ipc"; import {registerIpc} from "./ipc";
import {setMenu} from "./menu"; import {setMenu} from "./menu";
import * as fs from "fs"; import * as fs from "fs";
@ -12,37 +20,20 @@ import startServer from "./socket";
import contextMenu from "electron-context-menu"; import contextMenu from "electron-context-menu";
import os from "os"; import os from "os";
import {tray} from "./tray"; import {tray} from "./tray";
import {iconPath} from "./main"; export var icon: string;
export let mainWindow: BrowserWindow; export let mainWindow: BrowserWindow;
export let inviteWindow: BrowserWindow; export let inviteWindow: BrowserWindow;
var osType = os.type(); var osType = os.type();
contextMenu({ contextMenu({
showSaveImageAs: true, showSaveImageAs: true,
showCopyImageAddress: true, showCopyImageAddress: true,
showSearchWithGoogle: false, showSearchWithGoogle: true
prepend: (defaultActions, parameters, browserWindow) => [
{
label: "Search with Google",
// Only show it when right-clicking text
visible: parameters.selectionText.trim().length > 0,
click: () => {
shell.openExternal(`https://google.com/search?q=${encodeURIComponent(parameters.selectionText)}`);
}
},
{
label: "Search with DuckDuckGo",
// Only show it when right-clicking text
visible: parameters.selectionText.trim().length > 0,
click: () => {
shell.openExternal(`https://duckduckgo.com/?q=${encodeURIComponent(parameters.selectionText)}`);
}
}
]
}); });
async function doAfterDefiningTheWindow() { async function doAfterDefiningTheWindow() {
var ignoreProtocolWarning = await getConfig("ignoreProtocolWarning"); var ignoreProtocolWarning = await getConfig("ignoreProtocolWarning");
await checkIfConfigIsBroken(); checkIfConfigIsBroken();
registerIpc(); registerIpc();
if (await getConfig("mobileMode")) { if (await getConfig("mobileMode")) {
mainWindow.webContents.userAgent = mainWindow.webContents.userAgent =
@ -54,19 +45,7 @@ async function doAfterDefiningTheWindow() {
} }
mainWindow.webContents.userAgent = `Mozilla/5.0 (X11; ${osType} ${os.arch()}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36`; //fake useragent for screenshare to work mainWindow.webContents.userAgent = `Mozilla/5.0 (X11; ${osType} ${os.arch()}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36`; //fake useragent for screenshare to work
} }
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
app.quit()
} else {
app.on('second-instance', (event, commandLine, workingDirectory) => {
// i love stack overflow
if (mainWindow) {
mainWindow.restore()
mainWindow.focus()
}
})
}
mainWindow.webContents.setWindowOpenHandler(({url}) => { mainWindow.webContents.setWindowOpenHandler(({url}) => {
if (url.startsWith("https:" || url.startsWith("http:") || url.startsWith("mailto:"))) { if (url.startsWith("https:" || url.startsWith("http:") || url.startsWith("mailto:"))) {
shell.openExternal(url); shell.openExternal(url);
@ -108,7 +87,7 @@ async function doAfterDefiningTheWindow() {
if (/api\/v\d\/science$/g.test(details.url)) return callback({cancel: true}); if (/api\/v\d\/science$/g.test(details.url)) return callback({cancel: true});
return callback({}); return callback({});
}); });
if ((await getConfig("trayIcon")) == "default") { if (await getConfig("trayIcon") == "default") {
mainWindow.webContents.on("page-favicon-updated", async (event) => { mainWindow.webContents.on("page-favicon-updated", async (event) => {
var faviconBase64 = await mainWindow.webContents.executeJavaScript(` var faviconBase64 = await mainWindow.webContents.executeJavaScript(`
var getFavicon = function(){ var getFavicon = function(){
@ -124,14 +103,14 @@ async function doAfterDefiningTheWindow() {
return favicon; return favicon;
} }
getFavicon() getFavicon()
`); `)
var buf = new Buffer(faviconBase64.replace(/^data:image\/\w+;base64,/, ""), "base64"); console.log(app.getPath("temp"))
var buf = new Buffer(faviconBase64.replace(/^data:image\/\w+;base64,/, ""), 'base64');
fs.writeFileSync(path.join(app.getPath("temp"), "/", "tray.png"), buf, "utf-8"); fs.writeFileSync(path.join(app.getPath("temp"), "/", "tray.png"), buf, "utf-8");
let trayPath = nativeImage.createFromPath(path.join(app.getPath("temp"), "/", "tray.png")); let trayPath = nativeImage.createFromPath(path.join(app.getPath("temp"), "/", "tray.png"));
if (process.platform === "darwin" && trayPath.getSize().height > 22) if (process.platform === "darwin" && trayPath.getSize().height > 22) trayPath = trayPath.resize({height: 22});
trayPath = trayPath.resize({height: 22}); tray.setImage(trayPath)
tray.setImage(trayPath); })
});
} }
const userDataPath = app.getPath("userData"); const userDataPath = app.getPath("userData");
const themesFolder = userDataPath + "/themes/"; const themesFolder = userDataPath + "/themes/";
@ -154,10 +133,10 @@ async function doAfterDefiningTheWindow() {
} }
}); });
}); });
await setMenu(); setMenu();
mainWindow.on("close", async (e) => { mainWindow.on("close", async (e) => {
let [width, height] = mainWindow.getSize(); let [width, height] = mainWindow.getSize();
await setWindowState({ setWindowState({
width: width, width: width,
height: height, height: height,
isMaximized: mainWindow.isMaximized() isMaximized: mainWindow.isMaximized()
@ -196,22 +175,22 @@ async function doAfterDefiningTheWindow() {
if ((await getConfig("skipSplash")) == true) { if ((await getConfig("skipSplash")) == true) {
switch (await getConfig("channel")) { switch (await getConfig("channel")) {
case "stable": case "stable":
await mainWindow.loadURL("https://discord.com/app"); mainWindow.loadURL("https://discord.com/app");
break; break;
case "canary": case "canary":
await mainWindow.loadURL("https://canary.discord.com/app"); mainWindow.loadURL("https://canary.discord.com/app");
break; break;
case "ptb": case "ptb":
await mainWindow.loadURL("https://ptb.discord.com/app"); mainWindow.loadURL("https://ptb.discord.com/app");
break; break;
case "hummus": case "hummus":
await mainWindow.loadURL("https://hummus.sys42.net/"); mainWindow.loadURL("https://hummus.sys42.net/");
break; break;
case undefined: case undefined:
await mainWindow.loadURL("https://discord.com/app"); mainWindow.loadURL("https://discord.com/app");
break; break;
default: default:
await mainWindow.loadURL("https://discord.com/app"); mainWindow.loadURL("https://discord.com/app");
} }
} else { } else {
await mainWindow.loadFile(path.join(__dirname, "/content/splash.html")); await mainWindow.loadFile(path.join(__dirname, "/content/splash.html"));
@ -224,7 +203,7 @@ export function createCustomWindow() {
height: 350, height: 350,
title: "ArmCord", title: "ArmCord",
darkTheme: true, darkTheme: true,
icon: iconPath, icon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png"),
frame: false, frame: false,
autoHideMenuBar: true, autoHideMenuBar: true,
webPreferences: { webPreferences: {
@ -241,7 +220,7 @@ export function createNativeWindow() {
height: 350, height: 350,
title: "ArmCord", title: "ArmCord",
darkTheme: true, darkTheme: true,
icon: iconPath, icon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png"),
frame: true, frame: true,
autoHideMenuBar: true, autoHideMenuBar: true,
webPreferences: { webPreferences: {
@ -259,7 +238,7 @@ export function createInviteWindow() {
height: 600, height: 600,
title: "ArmCord Invite Manager", title: "ArmCord Invite Manager",
darkTheme: true, darkTheme: true,
icon: iconPath, icon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png"),
frame: true, frame: true,
autoHideMenuBar: true, autoHideMenuBar: true,
webPreferences: { webPreferences: {