Compare commits
19 commits
906926b6bf
...
170c6a1771
Author | SHA1 | Date | |
---|---|---|---|
|
170c6a1771 | ||
|
5d19f1844b | ||
|
57fbc45315 | ||
|
b9a0a73399 | ||
|
efbccabd4c | ||
|
f7b860fc06 | ||
|
fe86b2508a | ||
|
12994b1050 | ||
|
c19bb21282 | ||
|
cdc52346d8 | ||
|
ef8a15c328 | ||
4d13e686da | |||
|
9efce82462 | ||
|
a216475618 | ||
|
b7a0d1face | ||
|
0b165e64bc | ||
|
8c62d9dd86 | ||
|
86f885c41f | ||
dfa1665b19 |
|
@ -1,6 +1,6 @@
|
|||
|
||||
<div align="center">
|
||||
<img src="https://armcord.vercel.app/armcord_full_logo.png" width="520">
|
||||
<img src="https://armcord.vercel.app/logo.png" width="520">
|
||||
<br>ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.
|
||||
</div>
|
||||
|
||||
|
@ -45,6 +45,9 @@ ArmCord is also available on the Snap store [here](https://snapcraft.io/armcord)
|
|||
<a href="https://snapcraft.io/armcord">
|
||||
<img alt="Get it from the Snap Store" src="https://snapcraft.io/static/images/badges/en/snap-store-black.svg" />
|
||||
</a>
|
||||
### Pi-Apps
|
||||
ArmCord is also available in [Pi-Apps](https://github.com/Botspot/pi-apps).
|
||||
[![badge](https://github.com/Botspot/pi-apps/blob/master/icons/badge.png?raw=true)](https://github.com/Botspot/pi-apps)
|
||||
### Manual:
|
||||
Alternatively you can run ArmCord from source (npm, nodejs required):
|
||||
1. Clone ArmCord repo: `git clone https://github.com/ArmCord/ArmCord.git`
|
||||
|
|
BIN
assets/ac_black_plug.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
assets/ac_black_plug_hollow.png
Normal file
After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 16 KiB |
BIN
assets/ac_white_plug_hollow.png
Normal file
After Width: | Height: | Size: 10 KiB |
|
@ -1,30 +1,30 @@
|
|||
{
|
||||
"loading_screen_start": "Starting ArmCord…",
|
||||
"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.",
|
||||
"setup_question1": "Select what kind of setup you want to perform:",
|
||||
"setup_question1_answer1": "Express setup",
|
||||
"setup_question1_answer2": "Full setup",
|
||||
"setup_offline": "You appear to be offline. Please connect to the Internet and restart the ArmCord setup.",
|
||||
"setup_question2": "Choose your Discord channel/instance:",
|
||||
"setup_question3": "Should ArmCord handle client mods installation?",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"next": "Next",
|
||||
"setup_question4": "Select a client mod you want to install:",
|
||||
"setup_question4_clientmodnotice": "Why not all of them? Having many client mods at the same time can cause issues. If you really want to do it though, check our Discord.",
|
||||
"settings-theme": "ArmCord theme:",
|
||||
"settings-theme-default": "Default",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-tray": "Minimize to tray",
|
||||
"settings-patches": "Automatic Patches",
|
||||
"settings-channel": "Discord channel:",
|
||||
"settings-invitewebsocket": "Invite Websocket",
|
||||
"settings-mod": "Client mod:",
|
||||
"settings-prfmMode": "Performance mode:",
|
||||
"settings-prfmMode-performance": "Performance",
|
||||
"settings-prfmMode-battery": "Battery",
|
||||
"settings-none": "None",
|
||||
"settings-save": "Save settings",
|
||||
"settings-updater": "Check for updates"
|
||||
"loading_screen_start": "Starting ArmCord…",
|
||||
"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.",
|
||||
"setup_question1": "Select what kind of setup you want to perform:",
|
||||
"setup_question1_answer1": "Express Setup",
|
||||
"setup_question1_answer2": "Full Setup",
|
||||
"setup_offline": "You appear to be offline. Please connect to the internet and restart ArmCord.",
|
||||
"setup_question2": "Choose your Discord channel/instance:",
|
||||
"setup_question3": "Should ArmCord handle client mods installation?",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"next": "Next",
|
||||
"setup_question4": "Select a client mod you want to install:",
|
||||
"setup_question4_clientmodnotice": "Why not all of them? Having many client mods at the same time can cause issues. If you really want to do it though, check our Discord.",
|
||||
"settings-theme": "ArmCord theme:",
|
||||
"settings-theme-default": "Default",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-tray": "Minimize to tray",
|
||||
"settings-patches": "Automatic Patches",
|
||||
"settings-channel": "Discord channel:",
|
||||
"settings-invitewebsocket": "Invite Websocket",
|
||||
"settings-mod": "Client mod:",
|
||||
"settings-prfmMode": "Performance mode:",
|
||||
"settings-prfmMode-performance": "Performance",
|
||||
"settings-prfmMode-battery": "Battery",
|
||||
"settings-none": "None",
|
||||
"settings-save": "Save settings",
|
||||
"settings-updater": "Check for updates"
|
||||
}
|
||||
|
|
30
assets/lang/fa-IR.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"loading_screen_start": "درحال پیاده سازی ArmCord…",
|
||||
"loading_screen_offline": "به نظر میرسد شما آفلاین هستید. لطفا به اینترنت متصل شده و سپس دوباره تلاش کنید.",
|
||||
"loading_screen_update": "نسخه جدید ArmCord در دسترس است. لطفا به آخرین نسخه بروزرسانی کنید.",
|
||||
"setup_question1": "انتخاب کنید که چگونه میخواهید نصب کنید:",
|
||||
"setup_question1_answer1": "راهاندازی سریع",
|
||||
"setup_question1_answer2": "راهاندازی کامل",
|
||||
"setup_offline": "به نظر میرسد شما آفلاین هستید. لطفا به اینترنت وصل شده و سپس نصب ArmCord را از ابتدا شروع کنید.",
|
||||
"setup_question2": "نوع دیسکورد را انتخاب کنید:",
|
||||
"setup_question3": "آیا میخواهید ArmCord تغییرات کلاینت را خودکار اعمال کند؟",
|
||||
"yes": "بله",
|
||||
"no": "خیر",
|
||||
"next": "بعدی",
|
||||
"setup_question4": "نوع اصلاحساز برنامه که میخواهید نصب کنید انتخاب کنید:",
|
||||
"setup_question4_clientmodnotice": "چرا همه نه؟ داشتن اصلاحسازهای زیاد به صورت همزمان میتواند خرابی به بار آورد. اگر واقعا میخواهید انجامش دهید، به دیسکورد ما سر بزنید.",
|
||||
"settings-theme": "تم ArmCord:",
|
||||
"settings-theme-default": "پیشفرض",
|
||||
"settings-theme-native": "محلی",
|
||||
"settings-tray": "مینیماز در نوارابزار کوچک",
|
||||
"settings-patches": "اعمال تغییرات به صورت خودکار",
|
||||
"settings-channel": "نوع دیسکورد:",
|
||||
"settings-invitewebsocket": "وب سوکت دعوت",
|
||||
"settings-mod": "نوع اصلاحساز کلاینت:",
|
||||
"settings-prfmMode": "حالت عملکرد:",
|
||||
"settings-prfmMode-performance": "قدرت بیشتر",
|
||||
"settings-prfmMode-battery": "ذخیره برای باتری",
|
||||
"settings-none": "هیچکدام",
|
||||
"settings-save": "ذخیره تنظیمات",
|
||||
"settings-updater": "بررسی برای بروزرسانی"
|
||||
}
|
|
@ -13,15 +13,15 @@
|
|||
"setup_question4_clientmodnotice": "Pourquoi pas tous ? Le fait d'avoir plusieurs clients mods en même temps peut causer des problèmes. Si vous voulez vraiment le faire, consultez notre Discord.",
|
||||
"loading_screen_offline": "Vous semblez être hors ligne. Veuillez vous connecter à internet et réessayer.",
|
||||
"setup_offline": "Vous semblez être hors ligne. Veuillez vous connecter à internet et redémarrer l'installateur ArmCord.",
|
||||
"settings-tray": "Minimize to tray",
|
||||
"settings-channel": "Discord channel:",
|
||||
"settings-mod": "Client mod:",
|
||||
"settings-save": "Save settings",
|
||||
"settings-updater": "Check for updates",
|
||||
"settings-tray": "Minimiser dans la zone de notification",
|
||||
"settings-channel": "Canaux Discord :",
|
||||
"settings-mod": "Modification client :",
|
||||
"settings-save": "Sauvegarder les paramètres",
|
||||
"settings-updater": "Vérifier les mises à jour",
|
||||
"settings-theme": "Thème ArmCord :",
|
||||
"settings-theme-default": "Default",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-patches": "Automatic Patches",
|
||||
"settings-patches": "Correctifs automatiques",
|
||||
"settings-invitewebsocket": "Lien discord.gg",
|
||||
"settings-prfmMode": "Mode performance :",
|
||||
"settings-prfmMode-performance": "Performance",
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
"setup_question4": "Select a client mod you want to install:",
|
||||
"setup_question4_clientmodnotice": "Why not all of them? Having many client mods at the same time can cause issues. If you really want to do it though, check our documentation.",
|
||||
"settings-theme": "ArmCord Theme:",
|
||||
"settings-theme-tabs": "Tabs (experimental)",
|
||||
"settings-theme-default": "Default",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-tray": "Minimize to tray",
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
"settings-updater": "Controlla gli aggiornamenti",
|
||||
"settings-mod": "Client mod:",
|
||||
"settings-theme": "ArmCord Theme:",
|
||||
"settings-theme-tabs": "Tabs (experimental)",
|
||||
"settings-theme-default": "Default",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-patches": "Automatic Patches",
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
"settings-save": "Save settings",
|
||||
"settings-updater": "Check for updates",
|
||||
"settings-theme": "ArmCord Theme:",
|
||||
"settings-theme-tabs": "Tabs (experimental)",
|
||||
"settings-theme-default": "Default",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-patches": "Automatic Patches",
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
"settings-updater": "Check voor updates",
|
||||
"settings-patches": "Automatische Patches",
|
||||
"settings-theme": "ArmCord Thema:",
|
||||
"settings-theme-tabs": "Tabs (experimenteel)",
|
||||
"settings-theme-default": "Standaard",
|
||||
"settings-theme-native": "Native",
|
||||
"settings-invitewebsocket": "discord.gg support",
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
"settings-save": "Zapisz ustawienia",
|
||||
"settings-mod": "Modyfikacja klienta:",
|
||||
"settings-theme": "Motyw ArmCord:",
|
||||
"settings-theme-tabs": "Karty (eksperymentalne)",
|
||||
"settings-theme-default": "Domyślny",
|
||||
"settings-theme-native": "Natywny",
|
||||
"settings-patches": "Automatyczne łatki",
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
{
|
||||
"loading_screen_start": "กำลังเริ่ม ArmCord…",
|
||||
"loading_screen_start": "กำลังเริ่มต้น ArmCord…",
|
||||
"loading_screen_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง",
|
||||
"loading_screen_update": "ArmCord เวอร์ชันใหม่พร้อมใช้งานแล้ว โปรดอัปเดตเป็นเวอร์ชันล่าสุด",
|
||||
"setup_question1": "เลือกประเภทการติดตั้งที่คุณต้องการ:",
|
||||
"setup_question1_answer1": "ติดตั้งแบบน้ำหนักเบา",
|
||||
"setup_question1_answer2": "ติดตั้งแบบเต็ม",
|
||||
"setup_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง",
|
||||
"setup_question1_answer1": "ติดตั้งแบบรวดเร็ว",
|
||||
"setup_question1_answer2": "ติดตั้งเต็มรูปแบบ",
|
||||
"setup_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองเริ่ม ArmCord ใหม่อีกครั้ง",
|
||||
"setup_question2": "เลือกช่อง/อินสแตนส์ Discord:",
|
||||
"setup_question3": "ต้องการให้ ArmCord จัดการการติดตั้งมอดของไคลเอนต์หรือไม่?",
|
||||
"yes": "ใช่",
|
||||
"no": "ไม่",
|
||||
"no": "ไม่ใช่",
|
||||
"next": "ถัดไป",
|
||||
"setup_question4": "เลือกไคลเอนต์มอดที่ต้องการติดตั้ง:",
|
||||
"settings-prfmMode-battery": "แบตเตอรี่",
|
||||
"setup_question4_clientmodnotice": "ทำไมไม่ใช้ทั้งหมดล่ะ? การมีไคลเอนต์มอดหลายตัวพร้อมกันอาจทำให้เกิดปัญหาได้ หากต้องการที่จะทำจริงๆ ให้ไปดูใน Discord ของเรา",
|
||||
"settings-prfmMode-battery": "ประหยัดแบตเตอรี่",
|
||||
"setup_question4_clientmodnotice": "ทำไมไม่ใช้พร้อมกันทั้งหมดล่ะ? การมีไคลเอนต์มอดหลายตัวพร้อมกันอาจทำให้เกิดปัญหาได้ หากต้องการที่จะทำจริงๆ ให้ไปดูใน Discord ของเรา",
|
||||
"settings-theme": "ธีม ArmCord:",
|
||||
"settings-theme-default": "ค่าเริ่มต้น",
|
||||
"settings-theme-native": "ดั้งเดิม",
|
||||
"settings-tray": "ย่อลงไปในถาดงาน",
|
||||
"settings-tray": "ย่อขนาดหน้าต่าง",
|
||||
"settings-patches": "แพทช์อัตโนมัติ",
|
||||
"settings-channel": "ช่อง Discord:",
|
||||
"settings-invitewebsocket": "ใช้ Websocket สำหรับการเชิญ",
|
||||
"settings-prfmMode": "โหมดประสิทธิภาพ:",
|
||||
"settings-prfmMode-performance": "ประสิทธิภาพ",
|
||||
"settings-prfmMode-performance": "ประสิทธิภาพสูงสุด",
|
||||
"settings-mod": "ไคลแอนต์มอด:",
|
||||
"settings-none": "ไม่มี",
|
||||
"settings-save": "บันทึกการตั้งค่า",
|
||||
|
|
BIN
build/icon.icns
BIN
build/icon.ico
Normal file
After Width: | Height: | Size: 66 KiB |
|
@ -26,10 +26,10 @@
|
|||
"@types/node": "^17.0.42",
|
||||
"@types/ws": "^8.5.3",
|
||||
"copyfiles": "^2.4.1",
|
||||
"electron": "^19.0.4",
|
||||
"electron": "^19.0.7",
|
||||
"electron-builder": "^23.0.3",
|
||||
"husky": "^8.0.1",
|
||||
"prettier": "^2.7.0",
|
||||
"prettier": "^2.7.1",
|
||||
"typescript": "^4.7.3"
|
||||
},
|
||||
"dependencies": {
|
||||
|
@ -47,7 +47,7 @@
|
|||
"linux": {
|
||||
"icon": "build/icon.icns",
|
||||
"category": "Network",
|
||||
"maintainer": "smartfrigde@gmail.com",
|
||||
"maintainer": "smartfridge@vivaldi.net",
|
||||
"target": [
|
||||
"deb",
|
||||
"tar.gz",
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
.notice-2HEN-u {
|
||||
display: none;
|
||||
}
|
||||
.sidebar-1tnWFu {
|
||||
[customTitlebar] .sidebar-1tnWFu {
|
||||
border-top-left-radius: 8px;
|
||||
}
|
||||
.scroller-3X7KbA {
|
||||
[customTitlebar] .scroller-3X7KbA {
|
||||
padding: 0;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
* {
|
||||
outline: none;
|
||||
}
|
||||
[class^="socialLinks-"] + [class^="info-"] {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*MIT License
|
||||
|
||||
Copyright (c) 2021 GooseMod
|
||||
Copyright (c) 2022 GooseMod
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -20,11 +20,18 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.*/
|
||||
:root {
|
||||
--background-primary: #282b30;
|
||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
||||
--brand-experiment: #5865f2;
|
||||
--header-primary: #fff;
|
||||
--background-secondary: #2f3136;
|
||||
--background-secondary-alt: #292b2f;
|
||||
--background-floating: #18191c;
|
||||
--background-modifier-hover: rgba(106, 116, 128, 0.16);
|
||||
--brand-experiment: #7289da;
|
||||
--brand-experiment-560: #5c6fb1;
|
||||
--brand-experiment-600: #4e5d94;
|
||||
--interactive-normal: #b9bbbe;
|
||||
--interactive-hover: #dcddde;
|
||||
--text-muted: #72767d;
|
||||
--font-primary: "Whitney";
|
||||
--header-primary: #fff;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
|
@ -36,12 +43,19 @@ SOFTWARE.*/
|
|||
|
||||
html,
|
||||
body {
|
||||
overflow: hidden;
|
||||
|
||||
margin: 0;
|
||||
overflow-x: hidden;
|
||||
overflow-y: scroll;
|
||||
padding: 0;
|
||||
margin: 2%;
|
||||
background: var(--background-primary);
|
||||
background: var(--background-secondary);
|
||||
}
|
||||
body::-webkit-scrollbar {
|
||||
width: 0.4em;
|
||||
background: transparent;
|
||||
}
|
||||
body::-webkit-scrollbar-thumb {
|
||||
background: var(--background-floating);
|
||||
border-radius: 25px;
|
||||
}
|
||||
|
||||
* {
|
||||
|
@ -58,31 +72,39 @@ body {
|
|||
vertical-align: middle;
|
||||
}
|
||||
.header {
|
||||
color: white;
|
||||
font-size: 1.5em;
|
||||
color: var(--header-primary);
|
||||
font-size: 1.46em;
|
||||
}
|
||||
.center {
|
||||
text-align: center;
|
||||
left: 50%;
|
||||
margin-right: 50%;
|
||||
transform: translateX(50%);
|
||||
float: right;
|
||||
}
|
||||
/*buttons*/
|
||||
button {
|
||||
background-color: #7289da;
|
||||
font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
color: #ffffff;
|
||||
padding: 4px;
|
||||
border-radius: 5px;
|
||||
margin-top: 5px;
|
||||
|
||||
text-align: center;
|
||||
border-style: none;
|
||||
background: var(--brand-experiment);
|
||||
color: var(--header-primary);
|
||||
outline: none;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
padding: 8px;
|
||||
transition: 0.17s ease;
|
||||
}
|
||||
button:hover {
|
||||
background: var(--brand-experiment-560);
|
||||
cursor: pointer;
|
||||
transition: 0.17s ease;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #687dc6;
|
||||
border-style: none;
|
||||
outline: none;
|
||||
button:active {
|
||||
background: var(--brand-experiment-600);
|
||||
cursor: pointer;
|
||||
transition: 0.17s ease;
|
||||
}
|
||||
#save {
|
||||
font-size: 15px;
|
||||
}
|
||||
.tgl {
|
||||
display: none;
|
||||
|
@ -135,42 +157,47 @@ button:hover {
|
|||
height: 100%;
|
||||
}
|
||||
.tgl + .tgl-btn:after {
|
||||
left: 0;
|
||||
left: 1px;
|
||||
}
|
||||
.tgl + .tgl-btn:before {
|
||||
display: none;
|
||||
}
|
||||
.tgl:checked + .tgl-btn:after {
|
||||
left: 50%;
|
||||
left: 56%;
|
||||
}
|
||||
|
||||
.tgl-light + .tgl-btn {
|
||||
background: #5c5757;
|
||||
border-radius: 2em;
|
||||
padding: 2px;
|
||||
background: var(--text-muted);
|
||||
border-radius: 25px;
|
||||
padding: 4px;
|
||||
transition: all 0.4s ease;
|
||||
}
|
||||
.tgl-light + .tgl-btn:after {
|
||||
border-radius: 50%;
|
||||
border-radius: 50px;
|
||||
position: relative;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background: rgb(255, 255, 255);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
.tgl-light:checked + .tgl-btn {
|
||||
background: #47ca5a;
|
||||
background: var(--brand-experiment);
|
||||
}
|
||||
select {
|
||||
-webkit-appearance: button;
|
||||
-moz-appearance: button;
|
||||
background-color: #2c2f33;
|
||||
background-color: var(--background-secondary-alt);
|
||||
background-position: center right;
|
||||
background-repeat: no-repeat;
|
||||
border: 1px solid #aaa;
|
||||
border: 1px solid var(--background-floating);
|
||||
border-radius: 2px;
|
||||
box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);
|
||||
color: #fff;
|
||||
font-size: 1.2em;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
outline: none !important;
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
@import url("https://armcord.smartfridge.space/logofont.css");
|
||||
|
||||
/* Meta {{{ */
|
||||
:root {
|
||||
--background-primary: #282b30;
|
||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
||||
--background-modifier-hover: rgba(106, 116, 128, 0.16);
|
||||
--brand-experiment: #7289da;
|
||||
--brand-experiment-560: #5c6fb1;
|
||||
--brand-experiment-600: #4e5d94;
|
||||
--interactive-normal: #b9bbbe;
|
||||
--interactive-hover: #dcddde;
|
||||
--text-muted: #72767d;
|
||||
|
@ -109,7 +109,12 @@ body {
|
|||
height: 100%;
|
||||
width: 33%;
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container {
|
||||
margin-left: -26px;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #minimize {
|
||||
transform: translateX(5px);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* Buttons {{{ */
|
||||
|
@ -130,10 +135,18 @@ button {
|
|||
border: none;
|
||||
border-radius: 4px;
|
||||
padding: 8px 20px;
|
||||
transition: 0.17s ease;
|
||||
}
|
||||
button:hover {
|
||||
filter: brightness(85%);
|
||||
background: var(--brand-experiment-560);
|
||||
cursor: pointer;
|
||||
transition: 0.17s ease;
|
||||
}
|
||||
|
||||
button:active {
|
||||
background: var(--brand-experiment-600);
|
||||
cursor: pointer;
|
||||
transition: 0.17s ease;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -157,5 +170,9 @@ select {
|
|||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
}
|
||||
option {
|
||||
text-align: left;
|
||||
}
|
||||
/* }}} */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*MIT License
|
||||
|
||||
Copyright (c) 2021 GooseMod
|
||||
Copyright (c) 2022 GooseMod
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -22,7 +22,7 @@ SOFTWARE.*/
|
|||
:root {
|
||||
--background-primary: #282b30;
|
||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
||||
--brand-experiment: #5865f2;
|
||||
--brand-experiment: #7289da;
|
||||
--header-primary: #fff;
|
||||
--text-muted: #72767d;
|
||||
}
|
||||
|
|
|
@ -47,17 +47,105 @@
|
|||
}
|
||||
|
||||
/* ArmCord on Linux */
|
||||
[armcord-platform="linux"] .container-2RRFHK {
|
||||
padding-top: 45px;
|
||||
top: -45px;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar {
|
||||
height: 45px;
|
||||
line-height: 45px;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container {
|
||||
line-height: 45px;
|
||||
transform: translateY(-8px);
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #minimize:hover {
|
||||
background-color: #99aab5;
|
||||
background-color: var(--background-modifier-hover);
|
||||
transition: 0.2s ease;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #maximize:hover {
|
||||
background-color: #99aab5;
|
||||
background-color: var(--background-modifier-hover);
|
||||
transition: 0.2s ease;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #minimize:hover #minimize-icon {
|
||||
background-color: var(--interactive-hover);
|
||||
transition: 0.2s ease;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #maximize:hover #maximize-icon {
|
||||
background-color: var(--interactive-hover);
|
||||
transition: 0.2s ease;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #quit:hover {
|
||||
background-color: #f04747;
|
||||
background-color: var(--brand-experiment-560);
|
||||
transition: 0.2s ease;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #quit #quit-icon {
|
||||
background-color: #ffffff;
|
||||
display: list-item;
|
||||
transition: 0.1s ease;
|
||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #minimize-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #maximize-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
|
||||
[armcord-platform="linux"][isMaximized] .titlebar #window-controls-container #maximize-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #minimize {
|
||||
background-color: transparent;
|
||||
transition: 0.1s ease;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #maximize {
|
||||
background-color: transparent;
|
||||
transition: 0.1s ease;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #quit {
|
||||
background-color: var(--brand-experiment);
|
||||
transition: 0.1s ease;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="linux"] .titlebar #window-controls-container #quit:active {
|
||||
background-color: var(--brand-experiment-600);
|
||||
transition: 0.1s ease;
|
||||
}
|
||||
|
||||
/* ArmCord on Windows */
|
||||
[armcord-platform="win32"] .titlebar #window-controls-container {
|
||||
width: 142px;
|
||||
}
|
||||
[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover {
|
||||
background-color: var(--background-modifier-hover);
|
||||
transition: 0.2s ease;
|
||||
|
@ -102,8 +190,7 @@
|
|||
background-color: #000000cc;
|
||||
transition: 0.1s ease;
|
||||
}
|
||||
|
||||
.titlebar #window-controls-container #quit-icon {
|
||||
[armcord-platform="win32"] .titlebar #window-controls-container #quit-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
||||
|
@ -111,7 +198,7 @@
|
|||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
.titlebar #window-controls-container #minimize-icon {
|
||||
[armcord-platform="win32"] .titlebar #window-controls-container #minimize-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
||||
|
@ -119,7 +206,7 @@
|
|||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
.titlebar #window-controls-container #maximize-icon {
|
||||
[armcord-platform="win32"] .titlebar #window-controls-container #maximize-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
||||
|
@ -128,7 +215,7 @@
|
|||
no-repeat 50% 50%;
|
||||
}
|
||||
|
||||
[isMaximized] .titlebar #window-controls-container #maximize-icon {
|
||||
[armcord-platform="win32"][isMaximized] .titlebar #window-controls-container #maximize-icon {
|
||||
background-color: var(--interactive-normal);
|
||||
display: list-item;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E")
|
||||
|
@ -137,7 +224,124 @@
|
|||
no-repeat 50% 50%;
|
||||
}
|
||||
|
||||
.window-title {
|
||||
/* ArmCord on MacOS (Why would you do this?) */
|
||||
[armcord-platform="darwin"] .container-2RRFHK {
|
||||
padding-top: 45px;
|
||||
top: -45px;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar {
|
||||
height: 45px;
|
||||
line-height: 45px;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container {
|
||||
float: left;
|
||||
width: 150px;
|
||||
height: 60%;
|
||||
line-height: 45px;
|
||||
-webkit-app-region: no-drag;
|
||||
transform: translate(-78px, 4px);
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container:hover #minimize #minimize-icon,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize #maximize-icon,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container:hover #quit #quit-icon {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #quit #quit-icon {
|
||||
background-color: #79282b;
|
||||
-webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=")
|
||||
no-repeat 50% 50%;
|
||||
transform: translate(-0.3px, -11.7px);
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #minimize #minimize-icon {
|
||||
background-color: #7d631b;
|
||||
-webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=")
|
||||
no-repeat 50% 50%;
|
||||
transform: translate(-0px, -11.7px);
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize #maximize-icon {
|
||||
background-color: #1d7525;
|
||||
-webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=")
|
||||
no-repeat 50% 50%;
|
||||
transform: translate(-0.2px, -11.7px);
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #minimize {
|
||||
background-color: #fac536;
|
||||
border: 1px solid #da9e10;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
transform: translateX(-21.5px);
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize {
|
||||
background-color: #39ea49;
|
||||
border: 1px solid #13c11e;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
transform: translateX(21.5px);
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #quit {
|
||||
background-color: #f25056;
|
||||
border: 1px solid #d52735;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E")
|
||||
no-repeat 50% 50%;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize:active {
|
||||
background-color: #13c11e;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container:hover #minimize:active {
|
||||
background-color: #da9e10;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container:hover #quit:active {
|
||||
background-color: #d52735;
|
||||
}
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #spacer,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #minimize,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #quit {
|
||||
float: right;
|
||||
height: 80%;
|
||||
width: 13%;
|
||||
text-align: center;
|
||||
color: transparent;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #minimize-icon,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize-icon,
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #quit-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .titlebar #window-controls-container #spacer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
[armcord-platform="darwin"] .window-title {
|
||||
content: var(--wordmark-svg);
|
||||
height: 10px;
|
||||
left: 50%;
|
||||
margin-right: 50%;
|
||||
transform: translate(50%, 9.5px);
|
||||
float: right;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
[armcord-platform="linux"] .window-title,
|
||||
[armcord-platform="win32"] .window-title {
|
||||
content: var(--wordmark-svg);
|
||||
height: 10px;
|
||||
margin-left: initial;
|
||||
|
@ -146,6 +350,12 @@
|
|||
padding: 0;
|
||||
}
|
||||
|
||||
[wordmark="discord"] .window-title {
|
||||
content: var(--discord-wordmark-svg);
|
||||
height: 11.7px;
|
||||
width: 56px;
|
||||
}
|
||||
|
||||
.withFrame-haYltI {
|
||||
height: 30px !important;
|
||||
}
|
||||
|
|
|
@ -12,9 +12,7 @@
|
|||
<body>
|
||||
<div class="container">
|
||||
<div id="warning" class="hidden">
|
||||
<p id="setup_offline">
|
||||
You appear to be offline. Please connect to the internet and restart ArmCord Setup.
|
||||
</p>
|
||||
<p id="setup_offline">You appear to be offline. Please connect to the internet and restart ArmCord.</p>
|
||||
</div>
|
||||
<div id="setup">
|
||||
<div id="logo" class="hidden"></div>
|
||||
|
@ -123,6 +121,7 @@
|
|||
automaticPatches: false,
|
||||
mods: "cumcord",
|
||||
inviteWebsocket: true,
|
||||
trayIcon: "ac_plug_colored",
|
||||
performanceMode: "none"
|
||||
});
|
||||
setTimeout(() => window.armcordinternal.restart(), 5000);
|
||||
|
@ -153,6 +152,7 @@
|
|||
minimizeToTray: true,
|
||||
automaticPatches: false,
|
||||
performanceMode: "none",
|
||||
trayIcon: "ac_plug_colored",
|
||||
mods: options.mod,
|
||||
inviteWebsocket: true
|
||||
});
|
||||
|
@ -168,11 +168,13 @@
|
|||
autoLaunch: true,
|
||||
mods: "none",
|
||||
performanceMode: "none",
|
||||
trayIcon: "ac_plug_colored",
|
||||
inviteWebsocket: true
|
||||
});
|
||||
setTimeout(() => window.armcordinternal.restart(), 500);
|
||||
}
|
||||
});
|
||||
document.body.setAttribute("insetup", "");
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -6,6 +6,13 @@
|
|||
<style>
|
||||
@import url("css/splash.css");
|
||||
</style>
|
||||
<script>
|
||||
window.onbeforeunload = function () {
|
||||
const style = document.createElement("style");
|
||||
style.textContent = "body { display: none; }";
|
||||
document.head.append(style);
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
@ -23,7 +30,7 @@
|
|||
text.innerHTML = await armcord.getLang("loading_screen_offline");
|
||||
} else {
|
||||
text.innerHTML = await armcord.getLang("loading_screen_start");
|
||||
if (window.armcord.version === "DEV") {
|
||||
if (window.armcord.version === "3.1.0") {
|
||||
console.log("Running a development build of ArmCord. Skipping updater.");
|
||||
} else {
|
||||
const response = await fetch("https://armcord.xyz/latest.json");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
//https://github.com/GooseMod/GooseMod/wiki/Stuck-Updater-or-Blank-Window-Fix
|
||||
/*
|
||||
Copyright 2021 GooseMod
|
||||
Copyright 2022 GooseMod
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
@ -60,6 +60,6 @@ electron.app.whenReady().then(async () => {
|
|||
if (await getConfig("armcordCSP")) {
|
||||
unstrictCSP();
|
||||
} else {
|
||||
console.log("ArmCord CSP is disabled. The CSP should be managed by third-party plugin.");
|
||||
console.log("ArmCord CSP is disabled. The CSP should be managed by a third-party plugin(s).");
|
||||
}
|
||||
});
|
||||
|
|
26
src/ipc.ts
|
@ -1,7 +1,7 @@
|
|||
//ipc stuff
|
||||
import {app, ipcMain, shell, desktopCapturer} from "electron";
|
||||
import {mainWindow} from "./window";
|
||||
import {setConfigBulk, getVersion, getConfig, setLang, getLang} from "./utils";
|
||||
import {setConfigBulk, getVersion, getConfig, setLang, getLang, getWindowState} from "./utils";
|
||||
import {customTitlebar} from "./main";
|
||||
import {createSettingsWindow} from "./settings/main";
|
||||
export function registerIpc() {
|
||||
|
@ -23,6 +23,9 @@ export function registerIpc() {
|
|||
ipcMain.on("win-isMaximized", (event, arg) => {
|
||||
event.returnValue = mainWindow.isMaximized();
|
||||
});
|
||||
ipcMain.on("win-isNormal", (event, arg) => {
|
||||
event.returnValue = mainWindow.isNormal();
|
||||
});
|
||||
ipcMain.on("win-minimize", (event, arg) => {
|
||||
mainWindow.minimize();
|
||||
});
|
||||
|
@ -41,8 +44,22 @@ export function registerIpc() {
|
|||
ipcMain.on("get-app-version", (event) => {
|
||||
event.returnValue = getVersion();
|
||||
});
|
||||
ipcMain.on("splashEnd", (event, arg) => {
|
||||
mainWindow.setSize(800, 600);
|
||||
ipcMain.on("splashEnd", async (event, arg) => {
|
||||
try {
|
||||
var width = await getWindowState("width") ?? 800;
|
||||
var height= await getWindowState("height") ?? 600;
|
||||
var isMaximized = await getWindowState("isMaximized") ?? false;
|
||||
} catch (e) {
|
||||
console.log("No window state file found. Fallbacking to default values.")
|
||||
mainWindow.setSize(800, 600);
|
||||
}
|
||||
if (isMaximized) {
|
||||
mainWindow.setSize(800, 600); //just so the whole thing doesn't cover whole screen
|
||||
mainWindow.maximize()
|
||||
} else {
|
||||
mainWindow.setSize(width, height);
|
||||
console.log("Not maximized.")
|
||||
}
|
||||
});
|
||||
ipcMain.on("restart", (event, arg) => {
|
||||
app.relaunch();
|
||||
|
@ -60,6 +77,9 @@ export function registerIpc() {
|
|||
ipcMain.on("clientmod", async (event, arg) => {
|
||||
event.returnValue = await getConfig("mods");
|
||||
});
|
||||
ipcMain.on("trayIcon", async (event, arg) => {
|
||||
event.returnValue = await getConfig("trayIcon");
|
||||
});
|
||||
ipcMain.on("titlebar", (event, arg) => {
|
||||
event.returnValue = customTitlebar;
|
||||
});
|
||||
|
|
|
@ -10,7 +10,7 @@ import "./shortcuts";
|
|||
|
||||
export var settings: any;
|
||||
export var customTitlebar: boolean;
|
||||
|
||||
export var clientName: "ArmCord";
|
||||
|
||||
if (process.platform == "linux") {
|
||||
if (process.env.$XDG_SESSION_TYPE == "wayland") {
|
||||
|
@ -34,7 +34,7 @@ app.whenReady().then(async () => {
|
|||
case "native":
|
||||
createNativeWindow();
|
||||
break;
|
||||
case "discord":
|
||||
case "basic":
|
||||
createNativeWindow();
|
||||
break;
|
||||
default:
|
||||
|
@ -68,6 +68,7 @@ app.whenReady().then(async () => {
|
|||
createCustomWindow();
|
||||
break;
|
||||
}
|
||||
console.log("userDataPath = " + app.getPath("userData"));
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ contextBridge.exposeInMainWorld("armcord", {
|
|||
},
|
||||
electron: process.versions.electron,
|
||||
channel: ipcRenderer.sendSync("channel"),
|
||||
openTab: (number: number) => ipcRenderer.sendSync("openTab", number),
|
||||
setLang: (lang: string) => ipcRenderer.send("setLang", lang),
|
||||
getLang: (toGet: string) =>
|
||||
ipcRenderer.invoke("getLang", toGet).then((result) => {
|
||||
|
|
|
@ -28,6 +28,9 @@ const clientMods = {
|
|||
};
|
||||
|
||||
console.log("ArmCord");
|
||||
ipcRenderer.on("themeLoader", (event, message) => {
|
||||
addStyle(message);
|
||||
});
|
||||
if (window.location.href.indexOf("splash.html") > -1) {
|
||||
console.log("Skipping titlebar injection and client mod injection.");
|
||||
} else {
|
||||
|
@ -90,6 +93,5 @@ setInterval(() => {
|
|||
|
||||
el.textContent = `\nArmCord Version: ${version}`;
|
||||
el.onclick = () => ipcRenderer.send("openSettingsWindow");
|
||||
|
||||
host.append(el);
|
||||
}, 2000);
|
||||
|
|
|
@ -2,7 +2,7 @@ import {ipcRenderer} from "electron";
|
|||
import {addStyle} from "../utils";
|
||||
import * as fs from "fs";
|
||||
import * as path from "path";
|
||||
import {platform} from "node:process";
|
||||
import os from "os";
|
||||
export function injectTitlebar() {
|
||||
document.addEventListener("DOMContentLoaded", function (event) {
|
||||
var elem = document.createElement("div");
|
||||
|
@ -25,7 +25,8 @@ export function injectTitlebar() {
|
|||
const wordmarkcssPath = path.join(__dirname, "../", "/content/css/logos.css");
|
||||
addStyle(fs.readFileSync(titlebarcssPath, "utf8"));
|
||||
addStyle(fs.readFileSync(wordmarkcssPath, "utf8"));
|
||||
document.body.setAttribute("armcord-platform", platform);
|
||||
document.body.setAttribute("customTitlebar", "");
|
||||
document.body.setAttribute("armcord-platform", "win32");
|
||||
|
||||
var minimize = document.getElementById("minimize");
|
||||
var maximize = document.getElementById("maximize");
|
||||
|
@ -38,7 +39,8 @@ export function injectTitlebar() {
|
|||
maximize!.addEventListener("click", () => {
|
||||
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
||||
ipcRenderer.send("win-unmaximize");
|
||||
} else {
|
||||
document.body.removeAttribute("isMaximized");
|
||||
} else if (ipcRenderer.sendSync("win-isNormal") == true) {
|
||||
ipcRenderer.send("win-maximize");
|
||||
}
|
||||
});
|
||||
|
@ -52,6 +54,3 @@ export function injectTitlebar() {
|
|||
});
|
||||
});
|
||||
}
|
||||
export function removeTitlebar() {
|
||||
document.querySelector("#titlebar")!.remove();
|
||||
}
|
||||
|
|
|
@ -66,7 +66,18 @@
|
|||
</select>
|
||||
<p class="header" id="settings-prfmMode">Performance mode:</p>
|
||||
</div>
|
||||
<button id="settings-save" class="center">Save settings</button>
|
||||
<div class="switch">
|
||||
<select name="trayIcon" id="trayIcon" class="left">
|
||||
<option value="ac_plug_colored">Default</option>
|
||||
<option value="dsc-tray">Discord Icon</option>
|
||||
<option value="ac_white_plug">White Icon</option>
|
||||
<option value="ac_black_plug">Black Icon</option>
|
||||
<option value="ac_white_plug_hollow">White Hollowed Icon</option>
|
||||
<option value="ac_black_plug_hollow">Black Hollowed Icon</option>
|
||||
</select>
|
||||
<p class="header" id="settings-trayIcon">Tray icon:</p>
|
||||
</div>
|
||||
<button id="settings-save" class="center">Save Settings</button>
|
||||
</body>
|
||||
<script>
|
||||
async function loadLang() {
|
||||
|
@ -101,6 +112,7 @@
|
|||
document.getElementById("channel").value = await settings.get("channel");
|
||||
document.getElementById("theme").value = await settings.get("windowStyle");
|
||||
document.getElementById("prfmMode").value = await settings.get("performanceMode");
|
||||
document.getElementById("trayIcon").value = await settings.get("trayIcon");
|
||||
}
|
||||
loadSettings();
|
||||
document.getElementById("settings-save").addEventListener("click", function () {
|
||||
|
@ -113,6 +125,7 @@
|
|||
mods: document.getElementById("mod").value,
|
||||
inviteWebsocket: document.getElementById("websocket").checked,
|
||||
performanceMode: document.getElementById("prfmMode").value,
|
||||
trayIcon: document.getElementById("trayIcon").value,
|
||||
doneSetup: true
|
||||
});
|
||||
});
|
||||
|
|
|
@ -14,5 +14,10 @@ app.on("web-contents-created", (webContentsCreatedEvent, webContents) => {
|
|||
if (shift && control && !alt && !meta && code === "KeyR") {
|
||||
mainWindow.reload();
|
||||
}
|
||||
// Shortcut: app reload
|
||||
if (alt && control && !shift && !meta && code === "KeyR") {
|
||||
app.relaunch();
|
||||
app.exit();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -23,7 +23,7 @@ import type {Server, WebSocket} from "ws";
|
|||
import {inviteWindow, createInviteWindow} from "./window";
|
||||
|
||||
async function wsLog(message: string, ...args: unknown[]) {
|
||||
console.log("[WebSocket]" + message, ...args);
|
||||
console.log("[WebSocket] " + message, ...args);
|
||||
}
|
||||
|
||||
/** Generates an inclusive range (as `Array`) from `start` to `end`. */
|
||||
|
|
179
src/tray.ts
|
@ -1,75 +1,128 @@
|
|||
import {app, Menu, Tray} from "electron";
|
||||
import {mainWindow} from "./window";
|
||||
import {getConfig} from "./utils";
|
||||
import * as fs from "fs";
|
||||
import { app, Menu, Tray } from "electron";
|
||||
import { mainWindow } from "./window";
|
||||
import { getConfig, getConfigLocation, setWindowState } from "./utils";
|
||||
import * as path from "path";
|
||||
import {createSettingsWindow} from "./settings/main";
|
||||
import {platform} from "process";
|
||||
import { createSettingsWindow } from "./settings/main";
|
||||
let tray: any = null;
|
||||
let defaultIcon = "ac_plug_colored";
|
||||
app.whenReady().then(async () => {
|
||||
if (platform == "darwin") {
|
||||
defaultIcon = "macos"
|
||||
}
|
||||
if ((await getConfig("windowStyle")) == "discord") {
|
||||
tray = new Tray(path.join(__dirname, "../", "/assets/dsc-tray.png"));
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: "Open ArmCord",
|
||||
click: function () {
|
||||
mainWindow.show();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: "Quit ArmCord",
|
||||
click: function () {
|
||||
app.quit();
|
||||
}
|
||||
let finishedSetup = (await getConfig("doneSetup"));
|
||||
if ((await getConfig("windowStyle")) == "basic") {
|
||||
var clientName = (await getConfig("clientName")) ?? "ArmCord";
|
||||
var trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored";
|
||||
tray = new Tray(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
|
||||
const contextMenu = function () {
|
||||
if (finishedSetup == false) {
|
||||
return Menu.buildFromTemplate([
|
||||
{
|
||||
label: `Finish the setup first!`,
|
||||
enabled: false
|
||||
},
|
||||
{
|
||||
label: `Quit ${clientName}`,
|
||||
click: async function () {
|
||||
fs.unlink(await getConfigLocation(), (err) => {
|
||||
if (err) throw err;
|
||||
console.log('Closed during setup. "settings.json" was deleted');
|
||||
app.quit();
|
||||
});
|
||||
}
|
||||
}
|
||||
]);
|
||||
} else {
|
||||
return Menu.buildFromTemplate([
|
||||
{
|
||||
label: `Open ${clientName}`,
|
||||
click: function () {
|
||||
mainWindow.show();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: `Quit ${clientName}`,
|
||||
click: function () {
|
||||
let [width, height] = mainWindow.getSize()
|
||||
setWindowState({
|
||||
width: width,
|
||||
height: height,
|
||||
isMaximized: mainWindow.isMaximized()
|
||||
})
|
||||
app.quit();
|
||||
}
|
||||
}
|
||||
]);
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
||||
tray.setToolTip("Discord");
|
||||
tray.setToolTip(clientName);
|
||||
tray.setContextMenu(contextMenu);
|
||||
} else {
|
||||
var trayIcon = (await getConfig("trayIcon")) ?? defaultIcon;
|
||||
var clientName = (await getConfig("clientName")) ?? "ArmCord";
|
||||
var trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored";
|
||||
tray = new Tray(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: "ArmCord"
|
||||
},
|
||||
{
|
||||
type: "separator"
|
||||
},
|
||||
{
|
||||
label: "Open ArmCord",
|
||||
click: function () {
|
||||
mainWindow.show();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: "Open Settings",
|
||||
click: function () {
|
||||
createSettingsWindow();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: "Support Discord Server",
|
||||
click: function () {
|
||||
mainWindow.show();
|
||||
mainWindow.loadURL("https://discord.gg/TnhxcqynZ2");
|
||||
}
|
||||
},
|
||||
{
|
||||
type: "separator"
|
||||
},
|
||||
{
|
||||
label: "Quit ArmCord",
|
||||
click: function () {
|
||||
app.quit();
|
||||
if (finishedSetup == false) {
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: `Finish the setup first!`,
|
||||
enabled: false
|
||||
},
|
||||
{
|
||||
label: `Quit ${clientName}`,
|
||||
click: async function () {
|
||||
fs.unlink(await getConfigLocation(), (err) => {
|
||||
if (err) throw err;
|
||||
console.log('Closed during setup. "settings.json" was deleted');
|
||||
app.quit();
|
||||
});
|
||||
}
|
||||
}
|
||||
]);
|
||||
tray.setContextMenu(contextMenu);
|
||||
} else {
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: `${clientName} ` + app.getVersion(),
|
||||
enabled: false
|
||||
|
||||
},
|
||||
{
|
||||
type: "separator"
|
||||
},
|
||||
{
|
||||
label: `Open ${clientName}`,
|
||||
click: function () {
|
||||
mainWindow.show();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: "Open Settings",
|
||||
click: function () {
|
||||
createSettingsWindow();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: "Support Discord Server",
|
||||
click: function () {
|
||||
mainWindow.show();
|
||||
mainWindow.loadURL("https://discord.gg/TnhxcqynZ2");
|
||||
}
|
||||
},
|
||||
{
|
||||
type: "separator"
|
||||
},
|
||||
{
|
||||
label: `Quit ${clientName}`,
|
||||
click: function () {
|
||||
app.quit();
|
||||
}
|
||||
}
|
||||
]);
|
||||
tray.setContextMenu(contextMenu);
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
||||
tray.setToolTip("ArmCord " + app.getVersion());
|
||||
tray.setContextMenu(contextMenu);
|
||||
tray.setToolTip(clientName);
|
||||
tray.on('click', function(){
|
||||
mainWindow.show()
|
||||
});
|
||||
}
|
||||
});
|
||||
);
|
||||
|
|
64
src/utils.ts
|
@ -1,7 +1,6 @@
|
|||
import * as fs from "fs";
|
||||
import {app, dialog} from "electron";
|
||||
import { app, dialog } from "electron";
|
||||
import path from "path";
|
||||
import {defaultMaxListeners} from "events";
|
||||
export var firstRun: boolean;
|
||||
export var isSetup: boolean;
|
||||
export var contentPath: string;
|
||||
|
@ -44,6 +43,7 @@ export function setup() {
|
|||
mods: "cumcord",
|
||||
performanceMode: "none",
|
||||
inviteWebsocket: true,
|
||||
trayIcon: "ac_plug_colored",
|
||||
doneSetup: false
|
||||
};
|
||||
setConfigBulk({
|
||||
|
@ -52,8 +52,8 @@ export function setup() {
|
|||
}
|
||||
|
||||
export function getVersion() {
|
||||
//to-do better way of doing this
|
||||
return "3.1.0";
|
||||
//I'm too lazy to replace every mf reference so :p
|
||||
return app.getVersion();
|
||||
}
|
||||
export async function injectJS(inject: string) {
|
||||
const js = await (await fetch(`${inject}`)).text();
|
||||
|
@ -119,12 +119,17 @@ export async function setLang(language: string) {
|
|||
var language: string;
|
||||
export async function getLang(object: string) {
|
||||
if (language == undefined) {
|
||||
const userDataPath = app.getPath("userData");
|
||||
const storagePath = path.join(userDataPath, "/storage/");
|
||||
const langConfigFile = storagePath + "lang.json";
|
||||
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
||||
let parsed = JSON.parse(rawdata);
|
||||
language = parsed["lang"];
|
||||
try {
|
||||
const userDataPath = app.getPath("userData");
|
||||
const storagePath = path.join(userDataPath, "/storage/");
|
||||
const langConfigFile = storagePath + "lang.json";
|
||||
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
||||
let parsed = JSON.parse(rawdata);
|
||||
language = parsed["lang"];
|
||||
} catch (e) {
|
||||
console.log("Language config file doesn't exist. Fallback to English.")
|
||||
language = "en-US"
|
||||
}
|
||||
}
|
||||
if (language.length == 2) {
|
||||
language = language + "-" + language.toUpperCase();
|
||||
|
@ -137,6 +142,33 @@ export async function getLang(object: string) {
|
|||
let parsed = JSON.parse(rawdata);
|
||||
return parsed[object];
|
||||
}
|
||||
|
||||
//ArmCord Window State manager
|
||||
export interface WindowState {
|
||||
width: number;
|
||||
height: number;
|
||||
isMaximized: boolean;
|
||||
}
|
||||
export async function setWindowState(object: WindowState) {
|
||||
const userDataPath = app.getPath("userData");
|
||||
const storagePath = path.join(userDataPath, "/storage/");
|
||||
const saveFile = storagePath + "window.json";
|
||||
if (!fs.existsSync(saveFile)) {
|
||||
fs.writeFileSync(saveFile, "{}", "utf-8");
|
||||
}
|
||||
let toSave = JSON.stringify(object);
|
||||
fs.writeFileSync(saveFile, toSave, "utf-8");
|
||||
}
|
||||
export async function getWindowState(object: string) {
|
||||
const userDataPath = app.getPath("userData");
|
||||
const storagePath = path.join(userDataPath, "/storage/");
|
||||
const settingsFile = storagePath + "window.json";
|
||||
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
||||
let returndata = JSON.parse(rawdata);
|
||||
console.log(object + ": " + returndata[object]);
|
||||
return returndata[object];
|
||||
|
||||
}
|
||||
//ArmCord Settings/Storage manager
|
||||
|
||||
export interface Settings {
|
||||
|
@ -148,6 +180,7 @@ export interface Settings {
|
|||
mods: string;
|
||||
performanceMode: string;
|
||||
inviteWebsocket: boolean;
|
||||
trayIcon: string;
|
||||
doneSetup: boolean;
|
||||
}
|
||||
export async function getConfig(object: string) {
|
||||
|
@ -165,6 +198,17 @@ export async function getConfig(object: string) {
|
|||
return "setup";
|
||||
}
|
||||
}
|
||||
export async function getConfigLocation() {
|
||||
try {
|
||||
const userDataPath = app.getPath("userData");
|
||||
const storagePath = path.join(userDataPath, "/storage/");
|
||||
return storagePath + "settings.json";
|
||||
} catch (e) {
|
||||
console.log("Config probably doesn't exist yet. Returning setup value.");
|
||||
firstRun = true;
|
||||
return "setup";
|
||||
}
|
||||
}
|
||||
export async function setConfig(object: string, toSet: any) {
|
||||
try {
|
||||
const userDataPath = app.getPath("userData");
|
||||
|
|
|
@ -2,10 +2,11 @@
|
|||
// I had to add most of the window creation code here to split both into seperete functions
|
||||
// WHY? Because I can't use the same code for both due to annoying bug with value `frame` not responding to variables
|
||||
// I'm sorry for this mess but I'm not sure how to fix it.
|
||||
import {BrowserWindow, shell, app, dialog} from "electron";
|
||||
import { BrowserWindow, shell, app, dialog } from "electron";
|
||||
import path from "path";
|
||||
import {checkIfConfigIsBroken, firstRun, getConfig, contentPath, isSetup, setConfig, setLang} from "./utils";
|
||||
import {registerIpc} from "./ipc";
|
||||
import { checkIfConfigIsBroken, firstRun, getConfig, contentPath, isSetup, setConfig, setLang, setWindowState } from "./utils";
|
||||
import { registerIpc } from "./ipc";
|
||||
import * as fs from "fs";
|
||||
import startServer from "./socket";
|
||||
import contextMenu from "electron-context-menu";
|
||||
import os from "os";
|
||||
|
@ -24,13 +25,13 @@ async function doAfterDefiningTheWindow() {
|
|||
var ignoreProtocolWarning = await getConfig("ignoreProtocolWarning");
|
||||
checkIfConfigIsBroken();
|
||||
registerIpc();
|
||||
|
||||
|
||||
// A little sloppy but it works :p
|
||||
if (osType == 'Windows_NT') {
|
||||
osType = "Windows " + os.release().split('.')[0] + " (" + os.release() + ")";
|
||||
}
|
||||
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.setWindowOpenHandler(({url}) => {
|
||||
mainWindow.webContents.setWindowOpenHandler(({ url }) => {
|
||||
if (url.startsWith("https:" || url.startsWith("http:") || url.startsWith("mailto:"))) {
|
||||
shell.openExternal(url);
|
||||
} else {
|
||||
|
@ -48,7 +49,7 @@ async function doAfterDefiningTheWindow() {
|
|||
checkboxChecked: false
|
||||
};
|
||||
|
||||
dialog.showMessageBox(mainWindow, options).then(({response, checkboxChecked}) => {
|
||||
dialog.showMessageBox(mainWindow, options).then(({ response, checkboxChecked }) => {
|
||||
console.log(response, checkboxChecked);
|
||||
if (checkboxChecked) {
|
||||
if (response == 0) {
|
||||
|
@ -65,13 +66,38 @@ async function doAfterDefiningTheWindow() {
|
|||
});
|
||||
}
|
||||
}
|
||||
return {action: "deny"};
|
||||
return { action: "deny" };
|
||||
});
|
||||
mainWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
|
||||
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({});
|
||||
});
|
||||
const userDataPath = app.getPath("userData");
|
||||
const themesFolder = userDataPath + "/themes/";
|
||||
if (!fs.existsSync(themesFolder)) {
|
||||
fs.mkdirSync(themesFolder);
|
||||
console.log("Created missing theme folder");
|
||||
}
|
||||
mainWindow.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);
|
||||
mainWindow.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);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
mainWindow.on("close", async (e) => {
|
||||
let [width, height] = mainWindow.getSize()
|
||||
setWindowState({
|
||||
width: width,
|
||||
height: height,
|
||||
isMaximized: mainWindow.isMaximized()
|
||||
})
|
||||
if (await getConfig("minimizeToTray")) {
|
||||
e.preventDefault();
|
||||
mainWindow.hide();
|
||||
|
@ -80,10 +106,10 @@ async function doAfterDefiningTheWindow() {
|
|||
app.quit();
|
||||
}
|
||||
});
|
||||
mainWindow.on('maximize',() =>{
|
||||
mainWindow.on('maximize', () => {
|
||||
mainWindow.webContents.executeJavaScript(`document.body.setAttribute("isMaximized", "");`)
|
||||
})
|
||||
mainWindow.on('unmaximize',() =>{
|
||||
mainWindow.on('unmaximize', () => {
|
||||
mainWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`)
|
||||
})
|
||||
console.log(contentPath);
|
||||
|
|