Compare commits
114 commits
cdc4ae4eee
...
2c3327b7aa
Author | SHA1 | Date | |
---|---|---|---|
|
2c3327b7aa | ||
|
7e9e43fa6a | ||
|
b5e7e94ba7 | ||
|
da06a3c994 | ||
|
f63e87bf5b | ||
|
a0c9996044 | ||
|
f7b8226875 | ||
|
d58e669466 | ||
|
8cd13d2ec2 | ||
|
01c2a00188 | ||
|
3b9ae25412 | ||
|
5fbb690303 | ||
|
481dc9f249 | ||
|
143eb231f0 | ||
|
f735364552 | ||
|
741acb6381 | ||
|
79fe029209 | ||
|
f57fe11769 | ||
|
0392f176c5 | ||
|
18f8ecf32a | ||
|
10d05d2649 | ||
|
44fb33759c | ||
|
d1d4f0f4a5 | ||
|
8454a6d579 | ||
|
5c109f530b | ||
|
75276dee90 | ||
|
99417c3d29 | ||
|
934e56bdb0 | ||
|
77b5455139 | ||
|
6c59564256 | ||
|
a72a0a4d86 | ||
|
fb6348ee82 | ||
|
ccb87c53d8 | ||
|
881f3b5fd6 | ||
|
42322b40e3 | ||
|
95a26bfe84 | ||
|
dcfa4a6e14 | ||
|
0784b8ce79 | ||
|
6138281e4c | ||
|
ab9ab6304f | ||
|
bace17dca6 | ||
|
e71376237e | ||
|
cb69a35dd6 | ||
|
408c4b5f7b | ||
|
0fb71dfe2b | ||
|
381dab90e8 | ||
|
d746b43013 | ||
|
2720ae9bc0 | ||
|
24be5a69e2 | ||
|
a599481bc5 | ||
|
82e3c76389 | ||
|
f87307ff95 | ||
|
17b51b7b94 | ||
|
c5d71bed86 | ||
|
b2f6c94ad4 | ||
|
e411b8653c | ||
|
f404a7356a | ||
|
5d1721c9f9 | ||
|
3ef612b3c7 | ||
|
9717eaedb1 | ||
|
e48500f00e | ||
|
52bca257f8 | ||
|
414c7d120f | ||
|
0c34328f43 | ||
|
fbca68d8b5 | ||
|
33b2b05792 | ||
|
3e2efad943 | ||
|
a1f91d4d89 | ||
|
c8e6855a02 | ||
|
c933981420 | ||
|
9f9b4deae9 | ||
|
05daca16d4 | ||
|
83b4f75e87 | ||
|
5b509d948f | ||
|
d8fe49df3f | ||
|
0ebaa5627e | ||
|
251f4d55ff | ||
|
a3ac768f25 | ||
|
efe835be04 | ||
|
e946615770 | ||
|
db9bfbb269 | ||
|
56c7b68c47 | ||
|
69012c95a0 | ||
|
7afb3962dc | ||
|
b25ff8dec3 | ||
|
6e30ffa7bf | ||
|
40dc67f0a8 | ||
|
9c2b00d56f | ||
|
d6cbbcba7d | ||
|
1a7af5168d | ||
|
b4f2265efb | ||
|
f272bb822e | ||
|
73c9e8ecb7 | ||
|
927f498872 | ||
|
774a8bea2b | ||
|
1d916df998 | ||
|
161b18a725 | ||
|
46a3f3e17b | ||
|
e59c074230 | ||
|
249619419f | ||
|
c4aba0bc1b | ||
|
0d1e174d60 | ||
|
033e5b7973 | ||
|
5d19f1844b | ||
|
57fbc45315 | ||
|
b9a0a73399 | ||
|
efbccabd4c | ||
|
f7b860fc06 | ||
|
fe86b2508a | ||
|
12994b1050 | ||
|
c19bb21282 | ||
|
cdc52346d8 | ||
|
ef8a15c328 | ||
4d13e686da |
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. Linux, Windows, macOS]
|
||||||
|
- Method of installation [e.g. snap, setup exe, aur]
|
||||||
|
- Version [e.g. 3.0.7]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
2
.github/workflows/stable.yml
vendored
|
@ -138,7 +138,7 @@ jobs:
|
||||||
- uses: dev-drprasad/delete-tag-and-release@v0.2.0
|
- uses: dev-drprasad/delete-tag-and-release@v0.2.0
|
||||||
with:
|
with:
|
||||||
delete_release: true
|
delete_release: true
|
||||||
tag_name: v3.0.7
|
tag_name: v3.0.6
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
|
|
5
.idea/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
12
.idea/ArmCord.iml
generated
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
21
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="myValues">
|
||||||
|
<value>
|
||||||
|
<list size="7">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="nobr" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="noembed" />
|
||||||
|
<item index="2" class="java.lang.String" itemvalue="comment" />
|
||||||
|
<item index="3" class="java.lang.String" itemvalue="noscript" />
|
||||||
|
<item index="4" class="java.lang.String" itemvalue="embed" />
|
||||||
|
<item index="5" class="java.lang.String" itemvalue="script" />
|
||||||
|
<item index="6" class="java.lang.String" itemvalue="color" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="myCustomValuesEnabled" value="true" />
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
8
.idea/modules.xml
generated
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/ArmCord.iml" filepath="$PROJECT_DIR$/.idea/ArmCord.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
52
README.md
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://armcord.vercel.app/armcord_full_logo.png" width="520">
|
<img src="https://armcord.xyz/logo.png" width="520">
|
||||||
<br>ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.
|
<br>ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -8,27 +8,27 @@
|
||||||
|
|
||||||
- **Standalone client**
|
- **Standalone client**
|
||||||
|
|
||||||
ArmCord is built as standalone client, it doesn't rely on original Discord client.
|
ArmCord is built as a standalone client and doesn't rely on the original Discord client in anyway.
|
||||||
|
|
||||||
|
|
||||||
- **Various mods built in**
|
- **Various mods built in**
|
||||||
|
|
||||||
Explore Cumcord/GooseMod/Flicker plugins and their features!
|
Enjoy Cumcord, GooseMod, Flicker, and their many features, or have a more vanilla experience, it's your choice!
|
||||||
|
|
||||||
|
|
||||||
- **Made for Privacy**
|
- **Made for Privacy™**
|
||||||
|
|
||||||
ArmCord automatically blocks Discord's trackers.
|
ArmCord automatically blocks all of Discord's trackers; even without any client mods you can feel safe and secure!
|
||||||
|
|
||||||
|
|
||||||
- **Faster than normal Discord app**
|
- **Much more stable**
|
||||||
|
|
||||||
ArmCord is using newer Electron than stock Discord app. This usually means increased performance and more stable experience.
|
ArmCord is using a newer build of Electron than the stock Discord app. This means you can have a much more stable and secure experience, along with slightly better performance.
|
||||||
|
|
||||||
|
|
||||||
- **Designed to work anywhere**
|
- **Cross-platform support!**
|
||||||
|
|
||||||
ArmCord was initially created in mind to run on Arm64 Linux devices. We soon expanded our support to more platforms. We plan to support every platform that [Electron supports](https://www.electronjs.org/docs/latest/tutorial/support#supported-platforms).
|
ArmCord was originally created for ARM64 Linux devices, since Discord doesn't support them. We soon decided to support every platform that [Electron supports](https://github.com/electron/electron#platform-support)!
|
||||||
|
|
||||||
# How to run/install it?
|
# How to run/install it?
|
||||||
### Recommended:
|
### Recommended:
|
||||||
|
@ -45,8 +45,13 @@ ArmCord is also available on the Snap store [here](https://snapcraft.io/armcord)
|
||||||
<a href="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" />
|
<img alt="Get it from the Snap Store" src="https://snapcraft.io/static/images/badges/en/snap-store-black.svg" />
|
||||||
</a>
|
</a>
|
||||||
### Manual:
|
### Pi-Apps
|
||||||
Alternatively you can run ArmCord from source (npm, nodejs required):
|
ArmCord is also available in [Pi-Apps](https://github.com/Botspot/pi-apps).
|
||||||
|
[](https://github.com/Botspot/pi-apps)
|
||||||
|
|
||||||
|
|
||||||
|
### Compiling:
|
||||||
|
Alternatively you can run ArmCord from source (NodeJS and npm required):
|
||||||
1. Clone ArmCord repo: `git clone https://github.com/ArmCord/ArmCord.git`
|
1. Clone ArmCord repo: `git clone https://github.com/ArmCord/ArmCord.git`
|
||||||
2. Run `npm install` to install dependencies
|
2. Run `npm install` to install dependencies
|
||||||
3. Build with `npm run build`
|
3. Build with `npm run build`
|
||||||
|
@ -54,24 +59,29 @@ ArmCord is also available on the Snap store [here](https://snapcraft.io/armcord)
|
||||||
|
|
||||||
|
|
||||||
# FAQ
|
# FAQ
|
||||||
## 1. Will I get banned from using it?
|
## Will I get banned for using this?
|
||||||
|
- You are breaking [Discord ToS](https://discord.com/terms#software-in-discord%E2%80%99s-services) by using ArmCord, but no one has been banned from using it or any of the client mods included.
|
||||||
|
|
||||||
- You are breaking Discord ToS if you decided to use client mods. But no one ever got banned from using ArmCord or any of the client mods included. If you wish to remove mods, check our documentation.
|
## Can I use this on anything other than ARM?
|
||||||
## 2. How does this work?
|
- Yes! ArmCord should work normally under Windows, MacOS and Linux as long as it has Electron support.
|
||||||
|
|
||||||
- We are using official web app and adding some magic powder to make it all work!
|
## How does this work?
|
||||||
## 3. Can I use this on other architectures or operating systems?
|
- We are using the official web app and adding some magic powder to make it all work!
|
||||||
|
|
||||||
|
## Where can I find the source code?
|
||||||
|
- The source code is on [GitHub](https://github.com/ArmCord/ArmCord/).
|
||||||
|
|
||||||
|
## Where can I translate this?
|
||||||
|
- Translations are done using our [Weblate page](https://hosted.weblate.org/projects/armcord/armcord/). They're pushed to this [repo](https://github.com/ArmCord/i18n).
|
||||||
|
|
||||||
- Yes! ArmCord should work normally under Windows, Mac OS and Linux as long as it has NodeJS, npm and Electron support.
|
|
||||||
## 4. Where can I translate this?
|
|
||||||
- Translations are done using our [Weblate page](https://hosted.weblate.org/projects/armcord/armcord/). They're pushed to this [repo](https://github.com/ArmCord/i18n).
|
|
||||||
# Credits
|
# Credits
|
||||||
[ArmCord UI Elements and few features](https://github.com/kckarnige)
|
[ArmCord UI design, branding, and a few features](https://github.com/kckarnige)
|
||||||
[Cumcord](https://github.com/Cumcord/Cumcord)
|
[Cumcord](https://github.com/Cumcord/Cumcord)
|
||||||
[GooseMod](https://github.com/GooseMod/GooseMod)
|
[GooseMod](https://github.com/GooseMod/GooseMod)
|
||||||
[GooseMod Extension](https://github.com/GooseMod/extension)
|
[GooseMod Extension](https://github.com/GooseMod/extension)
|
||||||
|
[FlickerMod](https://github.com/FlickerMod)
|
||||||
[electron-discord-webapp](https://github.com/SpacingBat3/electron-discord-webapp)
|
[electron-discord-webapp](https://github.com/SpacingBat3/electron-discord-webapp)
|
||||||
[custom-electron-titlebar (css only)](https://github.com/AlexTorresSk/custom-electron-titlebar)
|
(Pre v3.0.6) [custom-electron-titlebar](https://github.com/AlexTorresSk/custom-electron-titlebar)
|
||||||
[electron-builder](https://electron.build)
|
[electron-builder](https://electron.build)
|
||||||
[OpenAsar](https://github.com/GooseMod/OpenAsar)
|
[OpenAsar](https://github.com/GooseMod/OpenAsar)
|
||||||
# Sponsors
|
# Sponsors
|
||||||
|
|
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 |
BIN
assets/clsc-dsc-tray.png
Normal file
After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 9.5 KiB |
|
@ -3,9 +3,9 @@
|
||||||
"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:",
|
||||||
"setup_question1_answer1": "Express setup",
|
"setup_question1_answer1": "Express Setup",
|
||||||
"setup_question1_answer2": "Full setup",
|
"setup_question1_answer2": "Full Setup",
|
||||||
"setup_offline": "You appear to be offline. Please connect to the Internet and restart the ArmCord setup.",
|
"setup_offline": "You appear to be offline. Please connect to the internet and restart ArmCord.",
|
||||||
"setup_question2": "Choose your Discord channel/instance:",
|
"setup_question2": "Choose your Discord channel/instance:",
|
||||||
"setup_question3": "Should ArmCord handle client mods installation?",
|
"setup_question3": "Should ArmCord handle client mods installation?",
|
||||||
"yes": "Yes",
|
"yes": "Yes",
|
||||||
|
@ -13,18 +13,46 @@
|
||||||
"next": "Next",
|
"next": "Next",
|
||||||
"setup_question4": "Select a client mod you want to install:",
|
"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.",
|
"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": "ArmCord theme",
|
||||||
|
"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-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-default": "Default",
|
"settings-theme-default": "Default",
|
||||||
"settings-theme-native": "Native",
|
"settings-theme-native": "Native",
|
||||||
|
"settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
"settings-tray": "Minimize to tray",
|
"settings-tray": "Minimize to tray",
|
||||||
|
"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": "Automatic Patches",
|
||||||
"settings-channel": "Discord channel:",
|
"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": "Discord channel",
|
||||||
|
"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": "Invite Websocket",
|
||||||
"settings-mod": "Client mod:",
|
"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-prfmMode": "Performance mode:",
|
"settings-altPaste": "Alternative Paste",
|
||||||
|
"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-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"settings-prfmMode": "Performance mode",
|
||||||
|
"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-performance": "Performance",
|
"settings-prfmMode-performance": "Performance",
|
||||||
"settings-prfmMode-battery": "Battery",
|
"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-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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,5 +26,32 @@
|
||||||
"settings-prfmMode-battery": "Batería",
|
"settings-prfmMode-battery": "Batería",
|
||||||
"settings-none": "Ninguna",
|
"settings-none": "Ninguna",
|
||||||
"settings-save": "Guardar ajustes",
|
"settings-save": "Guardar ajustes",
|
||||||
"settings-updater": "Buscar una actualización"
|
"settings-updater": "Buscar una actualización",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"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-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-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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-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-themesFolder": "Open themes folder",
|
||||||
|
"settings-storageFolder": "Open storage folder",
|
||||||
|
"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": "Alternative Paste",
|
||||||
|
"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-channel-desc5": "unofficial instance of Discord that takes you back to 2016! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"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-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
57
assets/lang/fa-IR.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"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": "بررسی برای بروزرسانی",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"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-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-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-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! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"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": "Alternative Paste",
|
||||||
|
"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-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-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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-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-storageFolder": "Open storage folder",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
|
}
|
|
@ -2,8 +2,8 @@
|
||||||
"loading_screen_start": "Démarrage d'ArmCord…",
|
"loading_screen_start": "Démarrage d'ArmCord…",
|
||||||
"loading_screen_update": "Une nouvelle version d'ArmCord est disponible. Veuillez mettre à jour vers la dernière version.",
|
"loading_screen_update": "Une nouvelle version d'ArmCord est disponible. Veuillez mettre à jour vers la dernière version.",
|
||||||
"setup_question1": "Sélectionnez le type de configuration que vous souhaitez effectuer :",
|
"setup_question1": "Sélectionnez le type de configuration que vous souhaitez effectuer :",
|
||||||
"setup_question1_answer1": "Configuration express",
|
"setup_question1_answer1": "Configuration Express",
|
||||||
"setup_question1_answer2": "Configuration complète",
|
"setup_question1_answer2": "Configuration Complète",
|
||||||
"setup_question2": "Choisissez votre canal/instance Discord :",
|
"setup_question2": "Choisissez votre canal/instance Discord :",
|
||||||
"setup_question3": "ArmCord doit-il s'occuper de l'installation des mods clients ?",
|
"setup_question3": "ArmCord doit-il s'occuper de l'installation des mods clients ?",
|
||||||
"yes": "Oui",
|
"yes": "Oui",
|
||||||
|
@ -13,18 +13,45 @@
|
||||||
"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.",
|
"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.",
|
"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.",
|
"setup_offline": "Vous semblez être hors ligne. Veuillez vous connecter à internet et redémarrer l'installateur ArmCord.",
|
||||||
"settings-tray": "Minimize to tray",
|
"settings-tray": "Minimiser dans la zone de notification",
|
||||||
"settings-channel": "Discord channel:",
|
"settings-channel": "Canaux Discord :",
|
||||||
"settings-mod": "Client mod:",
|
"settings-mod": "Modification client :",
|
||||||
"settings-save": "Save settings",
|
"settings-save": "Sauvegarder les paramètres",
|
||||||
"settings-updater": "Check for updates",
|
"settings-updater": "Vérifier les mises à jour",
|
||||||
"settings-theme": "Thème ArmCord :",
|
"settings-theme": "Thème ArmCord",
|
||||||
"settings-theme-default": "Default",
|
"settings-theme-default": "Default",
|
||||||
"settings-theme-native": "Native",
|
"settings-theme-native": "Native",
|
||||||
"settings-patches": "Automatic Patches",
|
"settings-patches": "Correctifs automatiques",
|
||||||
"settings-invitewebsocket": "Lien discord.gg",
|
"settings-invitewebsocket": "Lien discord.gg",
|
||||||
"settings-prfmMode": "Mode performance :",
|
"settings-prfmMode": "Mode performance :",
|
||||||
"settings-prfmMode-performance": "Performance",
|
"settings-prfmMode-performance": "Performance",
|
||||||
"settings-prfmMode-battery": "Batterie",
|
"settings-prfmMode-battery": "Batterie",
|
||||||
"settings-none": "Aucun"
|
"settings-none": "Aucun",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"settings-theme-desc1": "Les \"thèmes\" d'ArmCord gèrent le comportement et l'apparence des applications.",
|
||||||
|
"settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.",
|
||||||
|
"settings-altPaste": "Alternative Paste",
|
||||||
|
"settings-storageFolder": "Open storage folder",
|
||||||
|
"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-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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-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-desc5": "unofficial instance of Discord that takes you back to 2016! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"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-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-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,57 @@
|
||||||
{
|
{
|
||||||
"loading_screen_start": "Starting ArmCord…",
|
"loading_screen_start": "memulai ArmCord…",
|
||||||
"loading_screen_offline": "You appear to be offline. Please connect to the Internet and try again.",
|
"loading_screen_offline": "tampaknya anda sedang offline. Silahkan sambungkan ke internet dan coba lagi.",
|
||||||
"loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.",
|
"loading_screen_update": "versi terbaru ArmCord tersedia. Silahkan perbaharui ke versi terbaru.",
|
||||||
"setup_question1": "Select what kind of setup you want to perform:",
|
"setup_question1": "pilih jenis pengaturan yang ingin anda tampilkan:",
|
||||||
"setup_question1_answer1": "Express setup",
|
"setup_question1_answer1": "pengaturan cepat",
|
||||||
"setup_question1_answer2": "Full setup",
|
"setup_question1_answer2": "pengaturan penuh",
|
||||||
"setup_question2": "Choose your Discord channel/instance:",
|
"setup_question2": "pilih saluran Discord anda/instansi:",
|
||||||
"setup_offline": "You appear to be offline. Please connect to the Internet and restart the ArmCord setup.",
|
"setup_offline": "tampaknya anda sedang offline. silahkan sambungkan ke internet dan muat ulang ArmCord.",
|
||||||
"setup_question3": "Should ArmCord handle client mods installation?",
|
"setup_question3": "bolehkah ArmCord menangani pemasangan mods klien?",
|
||||||
"yes": "Yes",
|
"yes": "iya",
|
||||||
"no": "No",
|
"no": "tidak",
|
||||||
"next": "Next",
|
"next": "berikutnya",
|
||||||
"setup_question4": "Select a client mod you want to install:",
|
"setup_question4": "Pilih mod klien yang ingin anda pasang:",
|
||||||
"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.",
|
"setup_question4_clientmodnotice": "kenapa tidak semuanya? memiliki mod klien lebih saat bersamaan bisa menyebabkan masalah. jika anda tetap ingin melakukannya, cek di Discord kami.",
|
||||||
"settings-theme": "ArmCord Theme:",
|
"settings-theme": "Tema ArmCord:",
|
||||||
"settings-theme-default": "Default",
|
"settings-theme-default": "Bawaan",
|
||||||
"settings-theme-native": "Native",
|
"settings-theme-native": "asli",
|
||||||
"settings-tray": "Minimize to tray",
|
"settings-tray": "kecilkan ke tray",
|
||||||
"settings-patches": "Automatic Patches",
|
"settings-patches": "Patch otomatis",
|
||||||
"settings-channel": "Discord channel:",
|
"settings-channel": "Saluran Discord:",
|
||||||
"settings-invitewebsocket": "discord.gg support",
|
"settings-invitewebsocket": "mengajak soket web",
|
||||||
"settings-mod": "Client mod:",
|
"settings-mod": "klien mod:",
|
||||||
"settings-save": "Save settings",
|
"settings-save": "simpan pengaturan",
|
||||||
"settings-updater": "Check for updates",
|
"settings-updater": "periksa pembaharuan",
|
||||||
"settings-prfmMode": "Performance mode:",
|
"settings-prfmMode": "mode kinerja:",
|
||||||
"settings-prfmMode-performance": "Performance",
|
"settings-prfmMode-performance": "kinerja",
|
||||||
"settings-prfmMode-battery": "Battery",
|
"settings-prfmMode-battery": "Baterai",
|
||||||
"settings-none": "None"
|
"settings-none": "tidak ada",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"settings-altPaste": "Alternative Paste",
|
||||||
|
"settings-theme-desc1": "\"Tema\" ArmCord menata perilaku dan penampilan aplikasi.",
|
||||||
|
"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-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-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-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"settings-themesFolder": "Open themes folder",
|
||||||
|
"settings-storageFolder": "Open storage folder",
|
||||||
|
"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-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-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,5 +26,32 @@
|
||||||
"settings-prfmMode": "Performance mode:",
|
"settings-prfmMode": "Performance mode:",
|
||||||
"settings-prfmMode-performance": "Performance",
|
"settings-prfmMode-performance": "Performance",
|
||||||
"settings-prfmMode-battery": "Battery",
|
"settings-prfmMode-battery": "Battery",
|
||||||
"settings-none": "None"
|
"settings-none": "None",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"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-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-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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-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-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": "Alternative Paste",
|
||||||
|
"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-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-channel-desc5": "unofficial instance of Discord that takes you back to 2016! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"settings-mod-desc3": "light, secure, and easy to use, with out of the box experience. Features a built-in\n store for plugins.",
|
||||||
|
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
57
assets/lang/ja-JP.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"setup_question1_answer2": "Full Setup",
|
||||||
|
"yes": "Yes",
|
||||||
|
"settings-theme-default": "Default",
|
||||||
|
"settings-invitewebsocket": "Invite Websocket",
|
||||||
|
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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_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?",
|
||||||
|
"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-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-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-native": "Native",
|
||||||
|
"settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"settings-tray": "Minimize to tray",
|
||||||
|
"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": "Discord channel",
|
||||||
|
"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-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": "Alternative Paste",
|
||||||
|
"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-performance": "Performance",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-none": "None",
|
||||||
|
"settings-save": "Save Settings",
|
||||||
|
"settings-updater": "Check for updates",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
|
}
|
|
@ -9,22 +9,49 @@
|
||||||
"no": "Nei",
|
"no": "Nei",
|
||||||
"setup_question1_answer1": "Hurtigoppsett",
|
"setup_question1_answer1": "Hurtigoppsett",
|
||||||
"setup_question3": "Skal ArmCord håndtere installasjon av klient-modifikasjoner?",
|
"setup_question3": "Skal ArmCord håndtere installasjon av klient-modifikasjoner?",
|
||||||
"setup_offline": "Koble til Internett og start ArmCord-oppsett på ny.",
|
"setup_offline": "Det ser ut til at du er frakoblet. Koblet til Internett og start ArmCord på ny.",
|
||||||
"next": "Neste",
|
"next": "Neste",
|
||||||
"setup_question4": "Velg en klient-modifikasjon du ønsker å installere:",
|
"setup_question4": "Velg en klient-modifikasjon du ønsker å installere:",
|
||||||
"setup_question4_clientmodnotice": "Hvorfor ikke alle? Å ha mange klient-modifikasjoner samtidig kan forårsake problemer. Hvis du vil gjøre det likevel bør du lese dokumentasjonen vår.",
|
"setup_question4_clientmodnotice": "Hvorfor ikke alle? Å ha mange klient-modifikasjoner samtidig kan forårsake problemer. Hvis du vil gjøre det likevel bør du lese dokumentasjonen vår.",
|
||||||
"settings-tray": "Minimize to tray",
|
"settings-tray": "Minimize to tray",
|
||||||
"settings-channel": "Discord channel:",
|
"settings-channel": "Discord-kanal:",
|
||||||
"settings-mod": "Client mod:",
|
"settings-mod": "Klient-modifikasjon:",
|
||||||
"settings-save": "Save settings",
|
"settings-save": "Lagre innstillingene",
|
||||||
"settings-updater": "Check for updates",
|
"settings-updater": "Check for updates",
|
||||||
"settings-theme": "ArmCord Theme:",
|
"settings-theme": "ArmCord-drakt",
|
||||||
"settings-theme-default": "Default",
|
"settings-theme-default": "Default",
|
||||||
"settings-theme-native": "Native",
|
"settings-theme-native": "Native",
|
||||||
"settings-patches": "Automatic Patches",
|
"settings-patches": "Automatic Patches",
|
||||||
"settings-invitewebsocket": "discord.gg support",
|
"settings-invitewebsocket": "discord.gg support",
|
||||||
"settings-prfmMode": "Performance mode:",
|
"settings-prfmMode": "Ytelsesmodus er en eksperimentell funksjon som enten øker responsen og ytelsen til\n ArmCord, eller senker den. Prøv begge deler og finn ut hva som passer deg best.",
|
||||||
"settings-prfmMode-performance": "Performance",
|
"settings-prfmMode-performance": "Performance",
|
||||||
"settings-prfmMode-battery": "Battery",
|
"settings-prfmMode-battery": "Battery",
|
||||||
"settings-none": "None"
|
"settings-none": "None",
|
||||||
|
"settings-mobileMode": "Mobilmodus",
|
||||||
|
"settings-theme-desc1": "Draktene endrer systemadferd og utseende.",
|
||||||
|
"settings-theme-desc2": "ArmCord ser slik ut første gang du starter deg. Her finner du et gjenskapt\n tilpasset tittelfelt og spesifikke ArmCord-stiler som injiseres i Discord..",
|
||||||
|
"settings-theme-desc3": "Bruker det systemspesifikke tittelfeltet tilhørende operativsystemet du bruker (f.eks Windows 7/10).\n Fungerer mer likt det faktiske Dicrod-programmet på Linux|GNU.",
|
||||||
|
"settings-csp-desc": "ArmCord CSP er systemet vårt brukt til innlasting av egendefinert innhold i Discord-programmet. Ting som\n klient-modifikasjoner og drakter trenger det. Skru dette av for å bli kvitt modifikasjoner og stilendriner.",
|
||||||
|
"settings-tray-desc": "Når avskrudd vil ArmCord lukkes som ethvert annet vindu. Ellers vil det være å finne\n i systemkurven din for senere bruk.",
|
||||||
|
"settings-channel-desc1": "Du kan bruke denne innstillingen for å endre den nåværende Discord-instansen:",
|
||||||
|
"settings-patches-desk": "Henter automatiske feilfikser som distribueres hvis utgivelsen viser seg å ha feil etter at den er sluppet.\n Vanligvis trenger ikke dette å forbli påslått, med mindre det varsles i støtte-Discord-en.",
|
||||||
|
"settings-mobileMode-desc": "For enheter med pekeskjerm. Aktiverer Discord sitt skjulte modbilmodus tiltenkt telefoner og nettbrett.\n Den eneste store funksjonen som mangler er stemmesludring. Ideelt for PinePhone-brukere og lign.",
|
||||||
|
"settings-channel-desc2": "Du kjenner antagelig denne best. Det er den som brukes i den forvalgte Discord-\n klienten.",
|
||||||
|
"settings-channel-desc3": "dette er en alfa-testutgave av Discord. Ved å bruke den får du tilgang til de nyeste\n funksjonene og fiksene.",
|
||||||
|
"settings-channel-desc4": "Offentlig test-bygg. Får funksjoner tidligere enn den stabile versjonen, men litt senere enn Canary.",
|
||||||
|
"settings-channel-desc5": "Uoffisiell Discord-instans i 2016-stil. Ingen av klient-modifikasjonene\n som er å finne i ArmCord fungerer med den. Den drives av gemenskapen, så du tar all risiko ved bruk.",
|
||||||
|
"settings-invitewebsocket-desc": "Når dette er påskrudd støtter ArmCord Discord.gg-lenker, noe som betyr at ArmCord automatisk godtar\n invitasjoner hvis du åpner dem i nettleseren. Kan til tider slutte å svare.",
|
||||||
|
"settings-altPaste": "Alternativ innliming",
|
||||||
|
"settings-altPaste-desc": "Hvis du er på GNOME eller Linux, eller ganske enkelt ikke kan lime inn bilder kopiert fra andre bilder er\n dette noe for deg. Det skrur på den alternative modulen for innliming av bilder. Kun skru på dette\n hvis du har problemer.",
|
||||||
|
"settings-mod-desc1": "Klientmodifikasjoner er prorammer som lar de endre Discord-opplevelsen. De kan endre klientens\n utseende, endre adferden, eller legge til nye funksjoner.",
|
||||||
|
"settings-mod-desc2": "Fokuserer på å gjøre utviklingen av Discord-programtillegg enklere. Minimalistisk og\n lett.",
|
||||||
|
"settings-mod-desc3": "Lett, sikkert, og enkelt å bruke, ferdig til bruk. Har en innebygd\n butikk for programtillegg.",
|
||||||
|
"settings-mod-desc4": "Under iherdig utvikling. Har ikke fungerende grensesnitt.",
|
||||||
|
"settings-trayIcon": "Systemkurvsikon",
|
||||||
|
"settings-trayIcon-desc": "Sett ikonet som vises i systemkurven.",
|
||||||
|
"settings-advanced": "Sone for avanserte brukere",
|
||||||
|
"settings-pluginsFolder": "Åpne programtilleggsmappen",
|
||||||
|
"settings-themesFolder": "Åpne draktmappen",
|
||||||
|
"settings-storageFolder": "Åpne lagringsmappen",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"setup_question1": "Selecteer wat voor soort setup je wilt starten:",
|
"setup_question1": "Selecteer wat voor soort setup je wilt starten:",
|
||||||
"setup_question1_answer1": "Express setup",
|
"setup_question1_answer1": "Express Setup",
|
||||||
"setup_question1_answer2": "Volledige setup",
|
"setup_question1_answer2": "Volledige Setup",
|
||||||
"setup_question3": "Moet ArmCord client mods installeren?",
|
"setup_question3": "Moet ArmCord client mods installeren?",
|
||||||
"yes": "Ja",
|
"yes": "Ja",
|
||||||
"no": "Nee",
|
"no": "Nee",
|
||||||
"setup_offline": "Het lijkt erop alsof je offline bent. Verbind met het Internet en herstart ArmCord setup.",
|
"setup_offline": "Het lijkt erop alsof je offline bent. Verbind met het internet en herstart ArmCord setup.",
|
||||||
"loading_screen_start": "ArmCord starten…",
|
"loading_screen_start": "ArmCord starten…",
|
||||||
"next": "Volgende",
|
"next": "Volgende",
|
||||||
"setup_question4": "Selecteer een client mod om te installeren:",
|
"setup_question4": "Selecteer een client mod om te installeren:",
|
||||||
|
@ -19,12 +19,39 @@
|
||||||
"settings-save": "Instellingen opslaan",
|
"settings-save": "Instellingen opslaan",
|
||||||
"settings-updater": "Check voor updates",
|
"settings-updater": "Check voor updates",
|
||||||
"settings-patches": "Automatische Patches",
|
"settings-patches": "Automatische Patches",
|
||||||
"settings-theme": "ArmCord Thema:",
|
"settings-theme": "ArmCord Thema",
|
||||||
"settings-theme-default": "Standaard",
|
"settings-theme-default": "Standaard",
|
||||||
"settings-theme-native": "Native",
|
"settings-theme-native": "Native",
|
||||||
"settings-invitewebsocket": "discord.gg support",
|
"settings-invitewebsocket": "discord.gg support",
|
||||||
"settings-none": "None",
|
"settings-none": "None",
|
||||||
"settings-prfmMode": "Performance mode:",
|
"settings-prfmMode": "Performance mode:",
|
||||||
"settings-prfmMode-performance": "Performance",
|
"settings-prfmMode-performance": "Performance",
|
||||||
"settings-prfmMode-battery": "Battery"
|
"settings-prfmMode-battery": "Battery",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.",
|
||||||
|
"settings-altPaste": "Alternative Paste",
|
||||||
|
"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-theme-desc1": "ArmCord thema's beheren de functionaliteit en het uitzien van de app.",
|
||||||
|
"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-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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-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-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! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"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-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-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,13 +12,13 @@
|
||||||
"loading_screen_offline": "Wydaje nam się, że nie jesteś połączony z Internetem. Połącz się z internetem i spróbuj ponownie.",
|
"loading_screen_offline": "Wydaje nam się, że nie jesteś połączony z Internetem. Połącz się z internetem i spróbuj ponownie.",
|
||||||
"setup_question1_answer1": "Ekspresowa konfiguracja",
|
"setup_question1_answer1": "Ekspresowa konfiguracja",
|
||||||
"setup_question1": "Wybierz w jaki sposób chcesz skonfigurować ArmCord:",
|
"setup_question1": "Wybierz w jaki sposób chcesz skonfigurować ArmCord:",
|
||||||
"setup_offline": "Wydaje nam się że nie jesteś połączony z internetem. Połącz się z internetem i uruchom ponownie konfiguracje ArmCord .",
|
"setup_offline": "Wydaje nam się, że nie jesteś połączony z internetem. Połącz się z internetem i uruchom ponownie konfiguracje ArmCord.",
|
||||||
"settings-channel": "Kanał Discorda:",
|
"settings-channel": "Kanał Discorda",
|
||||||
"settings-updater": "Sprawdź aktualizacje",
|
"settings-updater": "Sprawdź aktualizacje",
|
||||||
"settings-tray": "Zminimalizuj do zasobnika zadań",
|
"settings-tray": "Zminimalizuj do zasobnika zadań",
|
||||||
"settings-save": "Zapisz ustawienia",
|
"settings-save": "Zapisz ustawienia",
|
||||||
"settings-mod": "Modyfikacja klienta:",
|
"settings-mod": "Modyfikacja klienta:",
|
||||||
"settings-theme": "Motyw ArmCord:",
|
"settings-theme": "Motyw ArmCord",
|
||||||
"settings-theme-default": "Domyślny",
|
"settings-theme-default": "Domyślny",
|
||||||
"settings-theme-native": "Natywny",
|
"settings-theme-native": "Natywny",
|
||||||
"settings-patches": "Automatyczne łatki",
|
"settings-patches": "Automatyczne łatki",
|
||||||
|
@ -26,5 +26,32 @@
|
||||||
"settings-prfmMode": "Tryb wydajności:",
|
"settings-prfmMode": "Tryb wydajności:",
|
||||||
"settings-prfmMode-performance": "Wydajny",
|
"settings-prfmMode-performance": "Wydajny",
|
||||||
"settings-prfmMode-battery": "Bateria",
|
"settings-prfmMode-battery": "Bateria",
|
||||||
"settings-none": "Nic/Brak"
|
"settings-none": "Nic/Brak",
|
||||||
|
"settings-mobileMode": "Tryb mobilny",
|
||||||
|
"settings-theme-desc1": "Motywy ArmCord zarządzają zachowanie i wygląd aplikacji.",
|
||||||
|
"settings-theme-desc2": "tak wygląda ArmCord przy pierwszym uruchomieniu. Zawiera rekreacje\n paska zadań Discord oraz specjalne style ArmCord wstrzyknięte do Discorda.",
|
||||||
|
"settings-theme-desc3": "używa natywnego paska zadań twojego systemu(np. Windows 7/10). Funkcjonuje\n bliżej do normalnego Discorda na Linuxie.",
|
||||||
|
"settings-csp-desc": "ArmCord CSP to nasz autorski system który zarządza ładowaniem niestandardowych rzeczy do klienta. Na przykład\n modyfikacje klienta lub motywy wymagają jego obecności. Wyłącz jeśli chcesz się pozbyć modyfikacji i motywów Discorda.",
|
||||||
|
"settings-tray-desc": "Kiedy wyłączone, ArmCord zamknie swoje okno jak każda inna aplikacje, jednak gdy jest włączone usiądzie i odpocznie\n w pasku zadań.",
|
||||||
|
"settings-patches-desk": "Ściąga automatyczne łatki, które są rozprowadzane jeśli wersja okaże się mięc błędy. Najczęśćiej\n nie musisz mieć tego włączonego, chyba że poproszony/a na Discordzie.",
|
||||||
|
"settings-mobileMode-desc": "Jeśli jesteś na urządzeniu z dotykowym ekranem, ta opcja jest dla ciebie! Aktywuje ona ukryty tryb Discord\n przeznaczony na telefony i tablety. Jedyna większa brakująca funkcja to kanał głosowy. Jest to idealne rozwiązanie dla\n użytkowników PinePhone i podobnych.",
|
||||||
|
"settings-channel-desc1": "Możesz użyć tej opcji aby zmienić obecny kanał Discorda:",
|
||||||
|
"settings-channel-desc2": "jesteś najpewniej najbardziej zapoznany z tym. Jest on używany w domyślnym oficjalnym kliencie\n Discorda!",
|
||||||
|
"settings-altPaste": "Alternative Paste",
|
||||||
|
"settings-channel-desc3": "jest to wersja alpha Discorda. Poprzez używanie jej otrzymujesz dostęp do najnowszych\n funkcji i poprawek.",
|
||||||
|
"settings-channel-desc4": "publiczny kanał testowania. Dostaje funkcje szybciej niż stable, jednak jest troche starszy od Canary.",
|
||||||
|
"settings-channel-desc5": "nieoficjalny kanał Discorda który zabiera cię do 2016 roku! Żadne z modyfikacji klienta\n normalnie zawartych w ArmCordzie nie działa w nim. Jest on prowadzony przez społeczność więc używaj na własne ryzyko.",
|
||||||
|
"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-desc2": "focuses on making the Discord plugin development experience easier. Minimal and\n lightweight.",
|
||||||
|
"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-desc3": "light, secure, and easy to use, with out of the box experience. Features a built-in\n store for plugins.",
|
||||||
|
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
57
assets/lang/pt-BR.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"no": "Não",
|
||||||
|
"loading_screen_start": "Iniciando ArmCord…",
|
||||||
|
"loading_screen_offline": "Você parece estar offline. Por favor, conecte-se à internet e tente novamente.",
|
||||||
|
"loading_screen_update": "Uma nova versão do ArmCord está disponível. Por favor, atualize para a versão mais recente.",
|
||||||
|
"setup_question1": "Selecione que tipo de instação você deseja fazer:",
|
||||||
|
"setup_question1_answer1": "Instalação rápida",
|
||||||
|
"setup_question1_answer2": "Instalação completa",
|
||||||
|
"setup_offline": "Você parece estar offline. Por favor, conecte-se à internet e tente novamente.",
|
||||||
|
"setup_question2": "Escolha o canal/instância do seu Discord:",
|
||||||
|
"setup_question3": "O ArmCord deve lidar com a instalação de mods do cliente?",
|
||||||
|
"yes": "Sim",
|
||||||
|
"next": "Próximo",
|
||||||
|
"setup_question4": "Selecione um mod de cliente que você deseja instalar:",
|
||||||
|
"setup_question4_clientmodnotice": "Por que não todos eles? Ter muitos mods de cliente ao mesmo tempo pode causar problemas. Se você realmente quiser fazer isso, verifique nosso Discord.",
|
||||||
|
"settings-theme": "Tema do ArmCord",
|
||||||
|
"settings-theme-default": "Padrão",
|
||||||
|
"settings-theme-native": "Nativo",
|
||||||
|
"settings-tray": "Minimizar para a bandeja",
|
||||||
|
"settings-patches": "Patches automáticos",
|
||||||
|
"settings-channel": "Canal do Discord",
|
||||||
|
"settings-invitewebsocket": "Convite por WebSocket",
|
||||||
|
"settings-mod": "Modificação de cliente",
|
||||||
|
"settings-prfmMode": "O modo de desempenho é uma função experimental que pode aumentar a capacidade de resposta e o desempenho\n do ArmCord, ou... diminuí-lo. Por favor, teste todas as opções e veja qual se adapta melhor a você.",
|
||||||
|
"settings-prfmMode-performance": "Desempenho",
|
||||||
|
"settings-prfmMode-battery": "Bateria",
|
||||||
|
"settings-none": "Nenhum",
|
||||||
|
"settings-save": "Salvar configurações",
|
||||||
|
"settings-updater": "Verificar atualizações",
|
||||||
|
"settings-mobileMode": "Modo móvel",
|
||||||
|
"settings-channel-desc1": "Você pode usar esta opção para alterar a atual instância do Discord:",
|
||||||
|
"settings-theme-desc1": "Os \"temas\" do ArmCord gerenciam o comportamento e a aparência de aplicativos.",
|
||||||
|
"settings-theme-desc2": "esta é a aparência do ArmCord quando você o inicia pela primeira vez. Inclui uma recriação\n personalizada da barra de título do Discord e estilos específicos do ArmCord injetados nele.",
|
||||||
|
"settings-theme-desc3": "utiliza a barra de título nativa do SO que você está executando no momento (no Windows 7/10). Funções mais\n parecidas com o real aplicativo do Discord no Linux.",
|
||||||
|
"settings-csp-desc": "ArmCord CSP é o nosso sistema que gerencia o carregamento de conteúdo personalizado no aplicativo do Discord. Coisas como\n mods de cliente e temas dependem disso. Desative se você quiser se livrar de mods e estilos personalizados.",
|
||||||
|
"settings-patches-desk": "Busca patches automáticos que são distribuídos se a versão mais recente apresentar bugs após o lançamento. Normalmente\n você não precisa manter isso ativado, a menos que seja notificado no suporte do Discord.",
|
||||||
|
"settings-mobileMode-desc": "Se estiver em um dispositivo com tela sensível ao toque, este recurso é para você! Ele ativa o modo móvel oculto do Discord\n destinado a celulares e tablets. A única característica importante ausente é o suporte ao bate-papo por voz. Isso é ideal para\n usuários do PinePhone e similares.",
|
||||||
|
"settings-tray-desc": "Quando desativado, o ArmCord irá encerrar como qualquer outra janela quando for fechado, caso contrário, permanecerá\n em repouso na bandeja do seu sistema para mais tarde.",
|
||||||
|
"settings-channel-desc2": "você provavelmente está mais familiarizado com este. É o que você vê no cliente padrão do\n Discord!",
|
||||||
|
"settings-channel-desc3": "esta é a versão de teste alfa do Discord. Ao utilizá-la, você obtém acesso aos recursos e correções\n mais recentes.",
|
||||||
|
"settings-invitewebsocket-desc": "Quando ativado, o ArmCord suportará links Discord.gg; isto é, se você abrir um link de convite em seu\n navegador, o ArmCord irá aceitá-lo automaticamente. Pode não responder às vezes.",
|
||||||
|
"settings-channel-desc4": "canal de teste público. Recebe recursos mais cedo do que o estável, mas é um pouco mais antigo do que o Canary.",
|
||||||
|
"settings-altPaste": "Colar alternativo",
|
||||||
|
"settings-altPaste-desc": "Se você usa GNOME no Linux, ou simplesmente não consegue colar imagens copiadas a partir de outras mensagens, então isto é\n para você. Isto habilita o módulo alternativo para colar imagens. Ative isso apenas quando estiver com\n problemas.",
|
||||||
|
"settings-channel-desc5": "instância não oficial do Discord que leva você de volta a 2016! O único cliente modificado\n disponível para rodar junto com ele é o Cordwood. É administrado pela comunidade, portanto você assume todos os riscos\n ao utilizá-lo.",
|
||||||
|
"settings-mod-desc1": "Mods de cliente são programas que permitem personalizar sua experiência no Discord. Eles podem alterar a aparência\n do cliente, modificar comportamentos ou adicionar novos recursos!",
|
||||||
|
"settings-mod-desc2": "concentra-se em tornar a experiência de desenvolvimento de plugins para o Discord mais fácil. Mínimo e\n leve.",
|
||||||
|
"settings-mod-desc3": "leve, seguro e fácil, já pronto para usar. Possui uma loja integrada\n para plugins.",
|
||||||
|
"settings-mod-desc4": "trabalho pesado em andamento, não possui uma interface do usuário funcional.",
|
||||||
|
"settings-trayIcon": "Ícone da bandeja",
|
||||||
|
"settings-trayIcon-desc": "Defina o ícone que aparecerá no menu da bandeja.",
|
||||||
|
"settings-advanced": "Área para usuários avançados",
|
||||||
|
"settings-pluginsFolder": "Abrir pasta de plugins",
|
||||||
|
"settings-themesFolder": "Abrir pasta de temas",
|
||||||
|
"settings-storageFolder": "Abrir pasta de armazenamento",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
|
}
|
57
assets/lang/ru-RU.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"loading_screen_start": "Запуск ArmCord…",
|
||||||
|
"loading_screen_offline": "Видимо, вы не в сети. Подключитесь к Интернету и повторите попытку.",
|
||||||
|
"loading_screen_update": "Доступна новая версия ArmCord. Обновите до последней версии.",
|
||||||
|
"setup_question1": "Выберите, какую настройку хотите выполнить:",
|
||||||
|
"setup_question1_answer1": "Экспресс-настройка",
|
||||||
|
"setup_question1_answer2": "Полная настройка",
|
||||||
|
"setup_offline": "Видимо, вы не в сети. Подключитесь к Интернету и перезапустите ArmCord.",
|
||||||
|
"setup_question2": "Выберите свой канал/экземпляр Discord:",
|
||||||
|
"setup_question3": "Должен ли ArmCord заниматься установкой клиентских модов?",
|
||||||
|
"yes": "Да",
|
||||||
|
"no": "Нет",
|
||||||
|
"next": "Далее",
|
||||||
|
"setup_question4": "Выберите клиентский мод, который хотите установить:",
|
||||||
|
"setup_question4_clientmodnotice": "Почему не все? Наличие множества клиентских модов одновременно может вызвать проблемы. Если вы действительно хотите это сделать, посетите наш Discord.",
|
||||||
|
"settings-theme": "Тема ArmCord:",
|
||||||
|
"settings-theme-default": "По умолчанию",
|
||||||
|
"settings-theme-native": "Нативная",
|
||||||
|
"settings-tray": "Свернуть в область уведомлений",
|
||||||
|
"settings-patches": "Автоматические патчи",
|
||||||
|
"settings-channel": "Канал Discord:",
|
||||||
|
"settings-invitewebsocket": "Пригласить Websocket",
|
||||||
|
"settings-mod": "Клиентский мод:",
|
||||||
|
"settings-prfmMode": "Режим производительности:",
|
||||||
|
"settings-prfmMode-performance": "Производительность",
|
||||||
|
"settings-prfmMode-battery": "Батарея",
|
||||||
|
"settings-none": "Ничего",
|
||||||
|
"settings-save": "Сохранить настройки",
|
||||||
|
"settings-updater": "Проверить наличие обновлений",
|
||||||
|
"settings-mobileMode": "Mobile mode",
|
||||||
|
"settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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-channel-desc1": "You can use this setting to change current instance of Discord:",
|
||||||
|
"settings-pluginsFolder": "Open plugins folder",
|
||||||
|
"settings-themesFolder": "Open themes folder",
|
||||||
|
"settings-storageFolder": "Open storage folder",
|
||||||
|
"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-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-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-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-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! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"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": "Alternative Paste",
|
||||||
|
"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-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-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"settings-trayIcon": "Tray icon",
|
||||||
|
"settings-trayIcon-desc": "Set the icon which will appear in tray menu.",
|
||||||
|
"settings-advanced": "️Advanced user zone",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
|
}
|
57
assets/lang/sv-SE.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"loading_screen_start": "Startar 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-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-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-default": "Default",
|
||||||
|
"settings-theme-native": "Native",
|
||||||
|
"settings-mod": "Client mod",
|
||||||
|
"settings-prfmMode-performance": "Performance",
|
||||||
|
"settings-mod-desc2": "focuses on making the Discord plugin development experience easier. Minimal and\n lightweight.",
|
||||||
|
"settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"settings-tray": "Minimize to tray",
|
||||||
|
"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": "Discord channel",
|
||||||
|
"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": "Alternative Paste",
|
||||||
|
"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-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-desc3": "light, secure, and easy to use, with out of the box experience. Features a built-in\n store for plugins.",
|
||||||
|
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-none": "None",
|
||||||
|
"settings-save": "Save Settings",
|
||||||
|
"settings-updater": "Check for updates",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
|
}
|
|
@ -1,30 +1,57 @@
|
||||||
{
|
{
|
||||||
"loading_screen_start": "เริ่มต้น ArmCord…",
|
"loading_screen_start": "กำลังเริ่มต้น ArmCord…",
|
||||||
"loading_screen_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง",
|
"loading_screen_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง",
|
||||||
"loading_screen_update": "ArmCord เวอร์ชันใหม่พร้อมใช้งานแล้ว โปรดอัปเดตเป็นเวอร์ชันล่าสุด",
|
"loading_screen_update": "ArmCord เวอร์ชันใหม่พร้อมใช้งานแล้ว โปรดอัปเดตเป็นเวอร์ชันล่าสุด",
|
||||||
"setup_question1": "เลือกประเภทการติดตั้งที่คุณต้องการ:",
|
"setup_question1": "เลือกประเภทการติดตั้งที่คุณต้องการ:",
|
||||||
"setup_question1_answer1": "ติดตั้งแบบรวดเร็ว",
|
"setup_question1_answer1": "ติดตั้งแบบรวดเร็ว",
|
||||||
"setup_question1_answer2": "การตั้งค่าเต็มรูปแบบ",
|
"setup_question1_answer2": "ติดตั้งเต็มรูปแบบ",
|
||||||
"setup_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง",
|
"setup_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองเริ่ม ArmCord ใหม่อีกครั้ง",
|
||||||
"setup_question2": "เลือกช่อง/อินสแตนส์ Discord:",
|
"setup_question2": "เลือกช่อง/อินสแตนส์ Discord:",
|
||||||
"setup_question3": "ต้องการให้ ArmCord จัดการการติดตั้งมอดของไคลเอนต์หรือไม่?",
|
"setup_question3": "ต้องการให้ ArmCord จัดการการติดตั้งมอดของไคลเอนต์หรือไม่?",
|
||||||
"yes": "ใช่",
|
"yes": "ใช่",
|
||||||
"no": "ไม่",
|
"no": "ไม่ใช่",
|
||||||
"next": "ถัดไป",
|
"next": "ถัดไป",
|
||||||
"setup_question4": "เลือกไคลเอนต์มอดที่ต้องการติดตั้ง:",
|
"setup_question4": "เลือกไคลเอนต์มอดที่ต้องการติดตั้ง:",
|
||||||
"settings-prfmMode-battery": "แบตเตอรี่",
|
"settings-prfmMode-battery": "ประหยัดแบตเตอรี่",
|
||||||
"setup_question4_clientmodnotice": "ทำไมไม่ใช้ทั้งหมดล่ะ? การมีไคลเอนต์มอดหลายตัวพร้อมกันอาจทำให้เกิดปัญหาได้ หากต้องการที่จะทำจริงๆ ให้ไปดูใน Discord ของเรา",
|
"setup_question4_clientmodnotice": "ทำไมไม่ใช้พร้อมกันทั้งหมดล่ะ? การมีไคลเอนต์มอดหลายตัวพร้อมกันอาจทำให้เกิดปัญหาได้ หากต้องการที่จะทำจริงๆ ให้ไปดูใน Discord ของเรา",
|
||||||
"settings-theme": "ธีม ArmCord:",
|
"settings-theme": "ธีม ArmCord",
|
||||||
"settings-theme-default": "ค่าเริ่มต้น",
|
"settings-theme-default": "ค่าเริ่มต้น",
|
||||||
"settings-theme-native": "ดั้งเดิม",
|
"settings-theme-native": "ดั้งเดิม",
|
||||||
"settings-tray": "ย่อลงไปในถาดงาน",
|
"settings-tray": "ย่อขนาดหน้าต่าง",
|
||||||
"settings-patches": "แพทช์อัตโนมัติ",
|
"settings-patches": "แพทช์อัตโนมัติ",
|
||||||
"settings-channel": "ช่อง Discord:",
|
"settings-channel": "ช่อง Discord:",
|
||||||
"settings-invitewebsocket": "ใช้ Websocket สำหรับการเชิญ",
|
"settings-invitewebsocket": "ใช้ Websocket สำหรับการเชิญ",
|
||||||
"settings-prfmMode": "โหมดประสิทธิภาพ:",
|
"settings-prfmMode": "โหมดประสิทธิภาพ:",
|
||||||
"settings-prfmMode-performance": "ประสิทธิภาพ",
|
"settings-prfmMode-performance": "ประสิทธิภาพสูงสุด",
|
||||||
"settings-mod": "ไคลแอนต์มอด:",
|
"settings-mod": "ไคลแอนต์มอด:",
|
||||||
"settings-none": "ไม่มี",
|
"settings-none": "ไม่มี",
|
||||||
"settings-save": "บันทึกการตั้งค่า",
|
"settings-save": "บันทึกการตั้งค่า",
|
||||||
"settings-updater": "ตรวจหาการอัปเดต"
|
"settings-updater": "ตรวจหาการอัปเดต",
|
||||||
|
"settings-mobileMode": "โหมดมือถือ",
|
||||||
|
"settings-theme-desc1": "\"ธีม\" ของ ArmCord เป็นการจัดการลักษณะและการทำงานของแอป",
|
||||||
|
"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-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-altPaste": "Alternative Paste",
|
||||||
|
"settings-trayIcon": "Tray icon",
|
||||||
|
"settings-theme-desc2": "นี่คือหน้าตา ArmCord ตอนที่เปิดครั้งแรก เป็นการปรับปรุงจากหน้าตาเดิมของ Discord\n แถบชื่อหน้าต่างและหน้าตาใหม่ ๆ ที่ ArmCord เปลี่ยน Discord",
|
||||||
|
"settings-theme-desc3": "ใช้แถบชื่อหน้าต่างเริ่มต้นของระบบปฏิบัติการที่กำลังใช้อยู่ (เช่น Windows 7/10) ตัวเลือกคล้ายกันกับ\n แอป Discord ใน Linux",
|
||||||
|
"settings-csp-desc": "ArmCord CSP คือระบบที่จัดการการโหลดเนื้อหากำหนดเองลงไปในแอป Discord สิ่งอย่างเช่น สิ่งอย่างเช่น\n ไคลแอนต์มอด ธีม ต้องใช้มัน สามารถปิดใช้งานได้หากต้องการปิดมอดและหน้าตากำหนดเอง",
|
||||||
|
"settings-tray-desc": "เมื่อปิด ArmCord จะปิดเหมือนหน้าตาอื่น ๆ เมื่อปิด ไม่อย่างนั้นมันจะนั่งนิ่ง\n ในถาดระบบภายหลัง",
|
||||||
|
"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! None of the client mods\n bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.",
|
||||||
|
"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-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-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
}
|
}
|
||||||
|
|
57
assets/lang/tr-TR.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
57
assets/lang/zh-Hans.json
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
"settings-theme-default": "Default",
|
||||||
|
"settings-tray": "Minimize to tray",
|
||||||
|
"settings-patches": "Automatic Patches",
|
||||||
|
"settings-mod-desc4": "heavily work in progress, doesn't have a working UI.",
|
||||||
|
"loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.",
|
||||||
|
"loading_screen_start": "启动ArmCord…",
|
||||||
|
"setup_question1": "Select what kind of setup you want to perform:",
|
||||||
|
"loading_screen_offline": "You appear to be offline. Please connect to the Internet and try again.",
|
||||||
|
"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:",
|
||||||
|
"settings-updater": "检查更新",
|
||||||
|
"setup_question3": "Should ArmCord handle client mods installation?",
|
||||||
|
"yes": "是的",
|
||||||
|
"no": "不是",
|
||||||
|
"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-desc1": "ArmCord \"themes\" manage apps behaviour and looks.",
|
||||||
|
"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-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-native": "Native",
|
||||||
|
"settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.",
|
||||||
|
"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-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": "Discord channel",
|
||||||
|
"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": "Alternative Paste",
|
||||||
|
"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-performance": "Performance",
|
||||||
|
"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-storageFolder": "Open storage folder",
|
||||||
|
"settings-none": "None",
|
||||||
|
"settings-save": "保存设置",
|
||||||
|
"settings-restart": "Restart App"
|
||||||
|
}
|
BIN
assets/ping.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
build/icon.icns
BIN
build/icon.ico
Normal file
After Width: | Height: | Size: 66 KiB |
8
build/installer.nsh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
!macro preInit
|
||||||
|
SetRegView 64
|
||||||
|
WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord"
|
||||||
|
WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord"
|
||||||
|
SetRegView 32
|
||||||
|
WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord"
|
||||||
|
WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord"
|
||||||
|
!macroend
|
23
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "ArmCord",
|
"name": "ArmCord",
|
||||||
"version": "3.0.7",
|
"version": "3.0.8",
|
||||||
"description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.",
|
"description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.",
|
||||||
"main": "ts-out/main.js",
|
"main": "ts-out/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -8,9 +8,12 @@
|
||||||
"watch": "tsc -w",
|
"watch": "tsc -w",
|
||||||
"start": "npm run build && electron ./ts-out/main.js",
|
"start": "npm run build && electron ./ts-out/main.js",
|
||||||
"package": "npm run build && electron-builder",
|
"package": "npm run build && electron-builder",
|
||||||
|
"packageQuick": "npm run build && electron-builder --dir",
|
||||||
"format": "prettier --write src/**/*",
|
"format": "prettier --write src/**/*",
|
||||||
"CIbuild": "npm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip",
|
"CIbuild": "npm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip",
|
||||||
"postinstall": "husky install"
|
"postinstall": "husky install",
|
||||||
|
"precommit-fix": "husky uninstall && echo - && echo !Make sure to run 'npm run format' before commiting! | chalk --stdin yellow inverse && echo -",
|
||||||
|
"precommit-fix:format": "husky uninstall && npm run format"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -25,8 +28,9 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^17.0.42",
|
"@types/node": "^17.0.42",
|
||||||
"@types/ws": "^8.5.3",
|
"@types/ws": "^8.5.3",
|
||||||
|
"chalk-cli": "^5.0.0",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"electron": "^19.0.5",
|
"electron": "^20.1.0",
|
||||||
"electron-builder": "^23.0.3",
|
"electron-builder": "^23.0.3",
|
||||||
"husky": "^8.0.1",
|
"husky": "^8.0.1",
|
||||||
"prettier": "^2.7.0",
|
"prettier": "^2.7.0",
|
||||||
|
@ -39,6 +43,17 @@
|
||||||
"ws": "^8.8.0"
|
"ws": "^8.8.0"
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
|
"nsis": {
|
||||||
|
"include": "build/installer.nsh"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"!*",
|
||||||
|
"assets",
|
||||||
|
"node_modules",
|
||||||
|
"ts-out",
|
||||||
|
"package.json",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
"appId": "com.smartfridge.armcord",
|
"appId": "com.smartfridge.armcord",
|
||||||
"productName": "ArmCord",
|
"productName": "ArmCord",
|
||||||
"mac": {
|
"mac": {
|
||||||
|
@ -47,7 +62,7 @@
|
||||||
"linux": {
|
"linux": {
|
||||||
"icon": "build/icon.icns",
|
"icon": "build/icon.icns",
|
||||||
"category": "Network",
|
"category": "Network",
|
||||||
"maintainer": "smartfrigde@gmail.com",
|
"maintainer": "smartfridge@vivaldi.net",
|
||||||
"target": [
|
"target": [
|
||||||
"deb",
|
"deb",
|
||||||
"tar.gz",
|
"tar.gz",
|
||||||
|
|
|
@ -1,14 +1,20 @@
|
||||||
.notice-2HEN-u {
|
.notice-2HEN-u {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.sidebar-1tnWFu {
|
[customTitlebar] .sidebar-1tnWFu {
|
||||||
border-top-left-radius: 8px;
|
border-top-left-radius: 8px;
|
||||||
}
|
}
|
||||||
.scroller-3X7KbA {
|
[customTitlebar] .scroller-3X7KbA {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
padding-top: 4px;
|
padding-top: 4px;
|
||||||
}
|
}
|
||||||
|
[customTitlebar] .backdrop-2ByYRN {
|
||||||
|
top: -30px;
|
||||||
|
padding-top: 30px;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
[class^="socialLinks-"] + [class^="info-"] {
|
[class^="socialLinks-"] + [class^="info-"] {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +37,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.none-2-_0dP:hover::-webkit-scrollbar {
|
.none-2-_0dP:hover::-webkit-scrollbar {
|
||||||
width: 0.29em !important;
|
width: 0.3em !important;
|
||||||
border-radius: 25px;
|
border-radius: 25px;
|
||||||
height: 0px !important;
|
height: 0px !important;
|
||||||
background: transparent !important;
|
background: transparent !important;
|
||||||
|
|
6
src/content/css/mobile.css
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[aria-label~="Mute"] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
[aria-label~="Deafen"] {
|
||||||
|
display: none;
|
||||||
|
}
|
68
src/content/css/screenshare.css
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
.desktop-capturer-selection {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
background: rgba(30, 30, 30, 0.75);
|
||||||
|
color: #ffffff;
|
||||||
|
z-index: 10000000;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__scroller {
|
||||||
|
width: 100%;
|
||||||
|
max-height: 100vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__list {
|
||||||
|
max-width: calc(100% - 100px);
|
||||||
|
margin: 50px;
|
||||||
|
padding: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
list-style: none;
|
||||||
|
overflow: hidden;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__item {
|
||||||
|
display: flex;
|
||||||
|
margin: 4px;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__btn {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
width: 145px;
|
||||||
|
margin: 0;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 4px;
|
||||||
|
background: #2c2f33;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__btn:hover,
|
||||||
|
.desktop-capturer-selection__btn:focus {
|
||||||
|
background: #7289da;
|
||||||
|
box-shadow: 0 0 4px rgba(0, 0, 0, 0.45), 0 0 2px rgba(0, 0, 0, 0.25);
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__thumbnail {
|
||||||
|
width: 100%;
|
||||||
|
height: 81px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__name {
|
||||||
|
margin: 6px 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
color: white;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.desktop-capturer-selection__name--cancel {
|
||||||
|
margin: auto 0;
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*MIT License
|
/*MIT License
|
||||||
|
|
||||||
Copyright (c) 2021 GooseMod
|
Copyright (c) 2022 GooseMod
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -20,69 +20,151 @@ 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
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.*/
|
SOFTWARE.*/
|
||||||
:root {
|
:root {
|
||||||
--background-primary: #282b30;
|
--background-secondary: #2f3136;
|
||||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
--background-secondary-alt: #292b2f;
|
||||||
--brand-experiment: #5865f2;
|
--background-floating: #18191c;
|
||||||
--header-primary: #fff;
|
--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;
|
--text-muted: #72767d;
|
||||||
|
--font-primary: "Whitney";
|
||||||
|
--header-primary: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: Whitney;
|
font-family: Whitney;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
src: url(https://armcord.smartfridge.space/whitney_400.woff) format("woff");
|
src: url(https://armcord.xyz/whitney_400.woff) format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
overflow: hidden;
|
overflow-x: hidden;
|
||||||
|
overflow-y: scroll;
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 2%;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
font-family: "Whitney", sans-serif;
|
font-family: "Whitney", sans-serif;
|
||||||
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
.left {
|
.left {
|
||||||
float: right;
|
float: right;
|
||||||
vertical-align: right !important;
|
}
|
||||||
|
p {
|
||||||
|
pointer-events: none;
|
||||||
|
user-select: none;
|
||||||
}
|
}
|
||||||
.switch {
|
.switch {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: var(--background-floating);
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
border-color: var(--background-floating);
|
||||||
|
border-style: solid;
|
||||||
}
|
}
|
||||||
|
.saveBar {
|
||||||
|
position: fixed;
|
||||||
|
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;
|
||||||
|
z-index: 999;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
.saveBar > button {
|
||||||
|
width: 90px;
|
||||||
|
transform: translateX(56%);
|
||||||
|
}
|
||||||
|
.restartBar > button {
|
||||||
|
width: 90px;
|
||||||
|
transform: translateX(50%);
|
||||||
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
color: white;
|
color: var(--header-primary);
|
||||||
font-size: 1.5em;
|
font-size: 1.5em;
|
||||||
|
position: relative;
|
||||||
|
font-weight: bold;
|
||||||
|
top: 15px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.description {
|
||||||
|
position: relative;
|
||||||
|
color: white;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: lighter;
|
||||||
|
}
|
||||||
|
.dropdown {
|
||||||
|
position: relative;
|
||||||
|
font-size: 25px;
|
||||||
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
.center {
|
.center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
left: 50%;
|
||||||
|
margin-right: 50%;
|
||||||
|
transform: translateX(50%);
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.advancedText {
|
||||||
|
color: var(--header-primary);
|
||||||
|
font-size: 1.5em;
|
||||||
|
font-weight: bold;
|
||||||
|
width: max-content;
|
||||||
}
|
}
|
||||||
/*buttons*/
|
/*buttons*/
|
||||||
button {
|
button {
|
||||||
background-color: #7289da;
|
background: var(--brand-experiment);
|
||||||
font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
color: var(--header-primary);
|
||||||
color: #ffffff;
|
|
||||||
padding: 4px;
|
|
||||||
border-radius: 5px;
|
|
||||||
margin-top: 5px;
|
|
||||||
|
|
||||||
text-align: center;
|
|
||||||
border-style: none;
|
|
||||||
outline: none;
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 8px;
|
||||||
|
margin-top: 10px;
|
||||||
|
transition: 0.17s ease;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
background: var(--brand-experiment-560);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: 0.17s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
button:hover {
|
button:active {
|
||||||
background-color: #687dc6;
|
background: var(--brand-experiment-600);
|
||||||
border-style: none;
|
|
||||||
outline: none;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
transition: 0.17s ease;
|
||||||
|
}
|
||||||
|
#save {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
.acAdvSettings {
|
||||||
|
height: 400px !important;
|
||||||
}
|
}
|
||||||
.tgl {
|
.tgl {
|
||||||
display: none;
|
display: none;
|
||||||
|
@ -95,6 +177,7 @@ button:hover {
|
||||||
.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,
|
||||||
|
@ -135,42 +218,58 @@ button:hover {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.tgl + .tgl-btn:after {
|
.tgl + .tgl-btn:after {
|
||||||
left: 0;
|
left: 1px;
|
||||||
}
|
}
|
||||||
.tgl + .tgl-btn:before {
|
.tgl + .tgl-btn:before {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.tgl:checked + .tgl-btn:after {
|
.tgl:checked + .tgl-btn:after {
|
||||||
left: 50%;
|
left: 56%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tgl-light + .tgl-btn {
|
.tgl-light + .tgl-btn {
|
||||||
background: #5c5757;
|
background: var(--text-muted);
|
||||||
border-radius: 2em;
|
border-radius: 25px;
|
||||||
padding: 2px;
|
padding: 4px;
|
||||||
transition: all 0.4s ease;
|
transition: all 0.4s ease;
|
||||||
}
|
}
|
||||||
.tgl-light + .tgl-btn:after {
|
.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);
|
background: rgb(255, 255, 255);
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
}
|
}
|
||||||
.tgl-light:checked + .tgl-btn {
|
.tgl-light:checked + .tgl-btn {
|
||||||
background: #47ca5a;
|
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;
|
||||||
background-color: #2c2f33;
|
background-color: var(--background-secondary-alt);
|
||||||
background-position: center right;
|
background-position: center right;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
border: 1px solid #aaa;
|
border: 1px solid var(--background-floating);
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
outline: none !important;
|
||||||
}
|
}
|
||||||
|
|
33
src/content/css/settingsEng.css
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
.acTheme {
|
||||||
|
height: 15em !important;
|
||||||
|
}
|
||||||
|
.acCSP {
|
||||||
|
height: 10em !important;
|
||||||
|
}
|
||||||
|
.acPatches {
|
||||||
|
height: 10em !important;
|
||||||
|
}
|
||||||
|
.acWebsocket {
|
||||||
|
height: 10em !important;
|
||||||
|
}
|
||||||
|
.acMobileMode {
|
||||||
|
height: 11em !important;
|
||||||
|
}
|
||||||
|
.acAltPaste {
|
||||||
|
height: 11em !important;
|
||||||
|
}
|
||||||
|
.acChannel {
|
||||||
|
height: 21em !important;
|
||||||
|
}
|
||||||
|
.acClientMod {
|
||||||
|
height: 18em !important;
|
||||||
|
}
|
||||||
|
.acCordwood {
|
||||||
|
height: 8em !important;
|
||||||
|
}
|
||||||
|
.acPrfmMode {
|
||||||
|
height: 10em !important;
|
||||||
|
}
|
||||||
|
.acTray {
|
||||||
|
height: 8em !important;
|
||||||
|
}
|
|
@ -1,11 +1,11 @@
|
||||||
@import url("https://armcord.smartfridge.space/logofont.css");
|
|
||||||
|
|
||||||
/* Meta {{{ */
|
/* Meta {{{ */
|
||||||
:root {
|
:root {
|
||||||
--background-primary: #282b30;
|
--background-primary: #282b30;
|
||||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
--background-secondary: rgba(255, 255, 255, 0.1);
|
||||||
--background-modifier-hover: rgba(106, 116, 128, 0.16);
|
--background-modifier-hover: rgba(106, 116, 128, 0.16);
|
||||||
--brand-experiment: #7289da;
|
--brand-experiment: #7289da;
|
||||||
|
--brand-experiment-560: #5c6fb1;
|
||||||
|
--brand-experiment-600: #4e5d94;
|
||||||
--interactive-normal: #b9bbbe;
|
--interactive-normal: #b9bbbe;
|
||||||
--interactive-hover: #dcddde;
|
--interactive-hover: #dcddde;
|
||||||
--text-muted: #72767d;
|
--text-muted: #72767d;
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
font-family: Whitney;
|
font-family: Whitney;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
src: url(https://armcord.smartfridge.space/whitney_400.woff) format("woff");
|
src: url(https://armcord.xyz/whitney_400.woff) format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
html,
|
html,
|
||||||
|
@ -90,7 +90,18 @@ body {
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* Logo {{{ */
|
/* Titlebar {{{ */
|
||||||
|
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;
|
||||||
|
@ -100,16 +111,26 @@ body {
|
||||||
width: 292px;
|
width: 292px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.titlebar #window-controls-container #maximize {
|
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #maximize,
|
||||||
|
[armcord-platform="linux"] .titlebar #window-controls-container #maximize {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.titlebar #window-controls-container #spacer {
|
[armcord-platform="win32"] .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 {
|
||||||
|
width: 18% !important;
|
||||||
|
}
|
||||||
|
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize,
|
||||||
|
[armcord-platform="darwin"] .titlebar #window-controls-container #maximize #maximize-icon {
|
||||||
|
background-color: #d6d6d5 !important;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* Buttons {{{ */
|
/* Buttons {{{ */
|
||||||
|
@ -130,10 +151,18 @@ button {
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 8px 20px;
|
padding: 8px 20px;
|
||||||
|
transition: 0.17s ease;
|
||||||
}
|
}
|
||||||
button:hover {
|
button:hover {
|
||||||
filter: brightness(85%);
|
background: var(--brand-experiment-560);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
transition: 0.17s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active {
|
||||||
|
background: var(--brand-experiment-600);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: 0.17s ease;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -157,5 +186,9 @@ select {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
option {
|
||||||
|
text-align: left;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*MIT License
|
/*MIT License
|
||||||
|
|
||||||
Copyright (c) 2021 GooseMod
|
Copyright (c) 2022 GooseMod
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -22,7 +22,7 @@ SOFTWARE.*/
|
||||||
:root {
|
:root {
|
||||||
--background-primary: #282b30;
|
--background-primary: #282b30;
|
||||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
--background-secondary: rgba(255, 255, 255, 0.1);
|
||||||
--brand-experiment: #5865f2;
|
--brand-experiment: #7289da;
|
||||||
--header-primary: #fff;
|
--header-primary: #fff;
|
||||||
--text-muted: #72767d;
|
--text-muted: #72767d;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ SOFTWARE.*/
|
||||||
font-family: Whitney;
|
font-family: Whitney;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
src: url(https://armcord.smartfridge.space/whitney_400.woff) format("woff");
|
src: url(https://armcord.xyz/whitney_400.woff) format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
html,
|
html,
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
height: 30px;
|
height: 30px;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
width: 100%;
|
|
||||||
user-select: none;
|
user-select: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
@ -47,17 +46,105 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ArmCord on Linux */
|
/* 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 {
|
[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 {
|
[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 {
|
[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 on Windows */
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container {
|
||||||
|
width: 142px;
|
||||||
|
}
|
||||||
[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover {
|
[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover {
|
||||||
background-color: var(--background-modifier-hover);
|
background-color: var(--background-modifier-hover);
|
||||||
transition: 0.2s ease;
|
transition: 0.2s ease;
|
||||||
|
@ -102,8 +189,7 @@
|
||||||
background-color: #000000cc;
|
background-color: #000000cc;
|
||||||
transition: 0.1s ease;
|
transition: 0.1s ease;
|
||||||
}
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #quit-icon {
|
||||||
.titlebar #window-controls-container #quit-icon {
|
|
||||||
background-color: var(--interactive-normal);
|
background-color: var(--interactive-normal);
|
||||||
display: list-item;
|
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")
|
-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 +197,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")
|
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%;
|
no-repeat 50% 50%;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #minimize-icon {
|
[armcord-platform="win32"] .titlebar #window-controls-container #minimize-icon {
|
||||||
background-color: var(--interactive-normal);
|
background-color: var(--interactive-normal);
|
||||||
display: list-item;
|
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")
|
-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 +205,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")
|
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%;
|
no-repeat 50% 50%;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #maximize-icon {
|
[armcord-platform="win32"] .titlebar #window-controls-container #maximize-icon {
|
||||||
background-color: var(--interactive-normal);
|
background-color: var(--interactive-normal);
|
||||||
display: list-item;
|
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")
|
-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 +214,7 @@
|
||||||
no-repeat 50% 50%;
|
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);
|
background-color: var(--interactive-normal);
|
||||||
display: list-item;
|
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")
|
-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 +223,138 @@
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-title {
|
/* ArmCord on MacOS (Why would you do this?) */
|
||||||
|
[armcord-platform="darwin"] .withFrame-haYltI {
|
||||||
|
height: 0px !important;
|
||||||
|
}
|
||||||
|
[armcord-platform="darwin"] .sidebar-1tnWFu {
|
||||||
|
border-top-left-radius: 0px !important;
|
||||||
|
}
|
||||||
|
[armcord-platform="darwin"] .scroller-3X7KbA {
|
||||||
|
padding-top: 35px !important;
|
||||||
|
}
|
||||||
|
[armcord-platform="darwin"] .container-2RRFHK {
|
||||||
|
padding-top: 48px;
|
||||||
|
top: -48px;
|
||||||
|
}
|
||||||
|
[armcord-platform="darwin"] .titlebar {
|
||||||
|
height: 48px;
|
||||||
|
line-height: 48px;
|
||||||
|
}
|
||||||
|
[armcord-platform="darwin"] .titlebar #window-controls-container {
|
||||||
|
float: left;
|
||||||
|
width: 150px;
|
||||||
|
height: 60%;
|
||||||
|
line-height: 45px;
|
||||||
|
-webkit-app-region: no-drag;
|
||||||
|
transform: translate(-82px, 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"][unFocused] .titlebar #window-controls-container #minimize,
|
||||||
|
[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #maximize,
|
||||||
|
[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #quit {
|
||||||
|
background-color: #d6d6d5 !important;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: background-color 0.1s ease-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
[armcord-platform="darwin"]:not([unFocused]) .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"]:not([unFocused]) .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"]:not([unFocused]) .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;
|
||||||
|
transition: background-color 0.1s ease-in;
|
||||||
|
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;
|
||||||
|
transition: background-color 0.1s ease-in;
|
||||||
|
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;
|
||||||
|
transition: background-color 0.1s ease-in;
|
||||||
|
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 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[armcord-platform="linux"] .window-title,
|
||||||
|
[armcord-platform="win32"] .window-title {
|
||||||
content: var(--wordmark-svg);
|
content: var(--wordmark-svg);
|
||||||
height: 10px;
|
height: 10px;
|
||||||
margin-left: initial;
|
margin-left: initial;
|
||||||
|
@ -146,6 +363,12 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[wordmark="discord"] .window-title {
|
||||||
|
content: var(--discord-wordmark-svg);
|
||||||
|
height: 11.7px;
|
||||||
|
width: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
.withFrame-haYltI {
|
.withFrame-haYltI {
|
||||||
height: 30px !important;
|
height: 30px !important;
|
||||||
}
|
}
|
||||||
|
|
BIN
src/content/favicon.ico
Normal file
After Width: | Height: | Size: 24 KiB |
|
@ -2,6 +2,7 @@
|
||||||
<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>
|
||||||
|
@ -12,9 +13,7 @@
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div id="warning" class="hidden">
|
<div id="warning" class="hidden">
|
||||||
<p id="setup_offline">
|
<p id="setup_offline">You appear to be offline. Please connect to the internet and restart ArmCord.</p>
|
||||||
You appear to be offline. Please connect to the internet and restart ArmCord Setup.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div id="setup">
|
<div id="setup">
|
||||||
<div id="logo" class="hidden"></div>
|
<div id="logo" class="hidden"></div>
|
||||||
|
@ -33,7 +32,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="foss">Fosscord</option>
|
<option value="hummus">Hummus (unofficial)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-center setup-ask" id="setup_question3">
|
<p class="text-center setup-ask" id="setup_question3">
|
||||||
|
@ -118,11 +117,13 @@
|
||||||
windowStyle: "default",
|
windowStyle: "default",
|
||||||
channel: "stable",
|
channel: "stable",
|
||||||
armcordCSP: true,
|
armcordCSP: true,
|
||||||
autoLaunch: true,
|
|
||||||
minimizeToTray: true,
|
minimizeToTray: true,
|
||||||
|
alternativePaste: false,
|
||||||
automaticPatches: false,
|
automaticPatches: false,
|
||||||
mods: "cumcord",
|
mods: "cumcord",
|
||||||
inviteWebsocket: true,
|
inviteWebsocket: true,
|
||||||
|
mobileMode: false,
|
||||||
|
trayIcon: "default",
|
||||||
performanceMode: "none"
|
performanceMode: "none"
|
||||||
});
|
});
|
||||||
setTimeout(() => window.armcordinternal.restart(), 5000);
|
setTimeout(() => window.armcordinternal.restart(), 5000);
|
||||||
|
@ -149,10 +150,12 @@
|
||||||
windowStyle: "default",
|
windowStyle: "default",
|
||||||
channel: options.channel,
|
channel: options.channel,
|
||||||
armcordCSP: true,
|
armcordCSP: true,
|
||||||
autoLaunch: true,
|
|
||||||
minimizeToTray: true,
|
minimizeToTray: true,
|
||||||
|
mobileMode: false,
|
||||||
automaticPatches: false,
|
automaticPatches: false,
|
||||||
performanceMode: "none",
|
performanceMode: "none",
|
||||||
|
alternativePaste: false,
|
||||||
|
trayIcon: "default",
|
||||||
mods: options.mod,
|
mods: options.mod,
|
||||||
inviteWebsocket: true
|
inviteWebsocket: true
|
||||||
});
|
});
|
||||||
|
@ -165,14 +168,17 @@
|
||||||
armcordCSP: true,
|
armcordCSP: true,
|
||||||
minimizeToTray: true,
|
minimizeToTray: true,
|
||||||
automaticPatches: false,
|
automaticPatches: false,
|
||||||
autoLaunch: true,
|
mobileMode: false,
|
||||||
mods: "none",
|
mods: "none",
|
||||||
|
alternativePaste: false,
|
||||||
performanceMode: "none",
|
performanceMode: "none",
|
||||||
|
trayIcon: "default",
|
||||||
inviteWebsocket: true
|
inviteWebsocket: true
|
||||||
});
|
});
|
||||||
setTimeout(() => window.armcordinternal.restart(), 500);
|
setTimeout(() => window.armcordinternal.restart(), 500);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
document.body.setAttribute("insetup", "");
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -2,16 +2,24 @@
|
||||||
<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");
|
||||||
</style>
|
</style>
|
||||||
|
<script>
|
||||||
|
window.onbeforeunload = function () {
|
||||||
|
const style = document.createElement("style");
|
||||||
|
style.textContent = "body { display: none; }";
|
||||||
|
document.head.append(style);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<video autoplay loop class="logo" id="splashscreen-armcord">
|
<video autoplay loop class="logo" id="splashscreen-armcord">
|
||||||
<source src="https://armcord.smartfridge.space/discord_loading.webm" type="video/webm" />
|
<source src="https://armcord.xyz/discord_loading.webm" type="video/webm" />
|
||||||
</video>
|
</video>
|
||||||
<p id="text-splashscreen"></p>
|
<p id="text-splashscreen"></p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,7 +31,7 @@
|
||||||
text.innerHTML = await armcord.getLang("loading_screen_offline");
|
text.innerHTML = await armcord.getLang("loading_screen_offline");
|
||||||
} else {
|
} else {
|
||||||
text.innerHTML = await armcord.getLang("loading_screen_start");
|
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.");
|
console.log("Running a development build of ArmCord. Skipping updater.");
|
||||||
} else {
|
} else {
|
||||||
const response = await fetch("https://armcord.xyz/latest.json");
|
const response = await fetch("https://armcord.xyz/latest.json");
|
||||||
|
@ -31,7 +39,7 @@
|
||||||
if (data.version !== window.armcord.version) {
|
if (data.version !== window.armcord.version) {
|
||||||
var elem = document.createElement("img");
|
var elem = document.createElement("img");
|
||||||
elem.classList.add("logo");
|
elem.classList.add("logo");
|
||||||
elem.src = "https://armcord.smartfridge.space/update.webp";
|
elem.src = "https://armcord.xyz/update.webp";
|
||||||
document.body.prepend(elem);
|
document.body.prepend(elem);
|
||||||
document.getElementById("splashscreen-armcord").remove();
|
document.getElementById("splashscreen-armcord").remove();
|
||||||
text.innerHTML = await armcord.getLang("loading_screen_update");
|
text.innerHTML = await armcord.getLang("loading_screen_update");
|
||||||
|
@ -40,7 +48,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.armcordinternal.splashEnd();
|
window.armcord.splashEnd();
|
||||||
switch (window.armcord.channel) {
|
switch (window.armcord.channel) {
|
||||||
case "stable":
|
case "stable":
|
||||||
window.location.replace("https://discord.com/app");
|
window.location.replace("https://discord.com/app");
|
||||||
|
@ -51,8 +59,8 @@
|
||||||
case "ptb":
|
case "ptb":
|
||||||
window.location.replace("https://ptb.discord.com/app");
|
window.location.replace("https://ptb.discord.com/app");
|
||||||
break;
|
break;
|
||||||
case "foss":
|
case "hummus":
|
||||||
window.location.replace("https://dev.fosscord.com/app");
|
window.location.replace("https://hummus.sys42.net/");
|
||||||
break;
|
break;
|
||||||
case undefined:
|
case undefined:
|
||||||
window.location.replace("https://discord.com/app");
|
window.location.replace("https://discord.com/app");
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//https://github.com/GooseMod/GooseMod/wiki/Stuck-Updater-or-Blank-Window-Fix
|
//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:
|
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:
|
||||||
|
|
||||||
|
@ -27,7 +27,8 @@ const unstrictCSP = () => {
|
||||||
"https://api.goosemod.com/inject.js",
|
"https://api.goosemod.com/inject.js",
|
||||||
"https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.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/Cumcord/Cumcord/master/dist/build.js",
|
||||||
"https://raw.githubusercontent.com/FlickerMod/dist/main/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) => {
|
||||||
|
@ -60,6 +61,6 @@ electron.app.whenReady().then(async () => {
|
||||||
if (await getConfig("armcordCSP")) {
|
if (await getConfig("armcordCSP")) {
|
||||||
unstrictCSP();
|
unstrictCSP();
|
||||||
} else {
|
} 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).");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
59
src/ipc.ts
|
@ -1,9 +1,20 @@
|
||||||
//ipc stuff
|
//ipc stuff
|
||||||
import {app, ipcMain, shell, desktopCapturer} from "electron";
|
import {app, ipcMain, shell, desktopCapturer, nativeImage} from "electron";
|
||||||
import {mainWindow} from "./window";
|
import {mainWindow} from "./window";
|
||||||
import {setConfigBulk, getVersion, getConfig, setLang, getLang, getWindowState} from "./utils";
|
import {
|
||||||
|
setConfigBulk,
|
||||||
|
getVersion,
|
||||||
|
getConfig,
|
||||||
|
setLang,
|
||||||
|
getLang,
|
||||||
|
getWindowState,
|
||||||
|
packageVersion,
|
||||||
|
getDisplayVersion
|
||||||
|
} from "./utils";
|
||||||
import {customTitlebar} from "./main";
|
import {customTitlebar} from "./main";
|
||||||
import {createSettingsWindow} from "./settings/main";
|
import {createSettingsWindow} from "./settings/main";
|
||||||
|
import os from "os";
|
||||||
|
import path from "path";
|
||||||
export function registerIpc() {
|
export function registerIpc() {
|
||||||
ipcMain.on("get-app-path", (event, arg) => {
|
ipcMain.on("get-app-path", (event, arg) => {
|
||||||
event.reply("app-path", app.getAppPath());
|
event.reply("app-path", app.getAppPath());
|
||||||
|
@ -17,12 +28,30 @@ export function registerIpc() {
|
||||||
ipcMain.on("open-external-link", (event, href: string) => {
|
ipcMain.on("open-external-link", (event, href: string) => {
|
||||||
shell.openExternal(href);
|
shell.openExternal(href);
|
||||||
});
|
});
|
||||||
|
ipcMain.on("setPing", (event, pingCount: number) => {
|
||||||
|
switch (os.platform()) {
|
||||||
|
case "linux" ?? "macos":
|
||||||
|
app.setBadgeCount(pingCount);
|
||||||
|
break;
|
||||||
|
case "win32":
|
||||||
|
if (pingCount > 0) {
|
||||||
|
var image = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ping.png`));
|
||||||
|
mainWindow.setOverlayIcon(image, "badgeCount");
|
||||||
|
} else {
|
||||||
|
mainWindow.setOverlayIcon(null, "badgeCount");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
ipcMain.on("win-maximize", (event, arg) => {
|
ipcMain.on("win-maximize", (event, arg) => {
|
||||||
mainWindow.maximize();
|
mainWindow.maximize();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-isMaximized", (event, arg) => {
|
ipcMain.on("win-isMaximized", (event, arg) => {
|
||||||
event.returnValue = mainWindow.isMaximized();
|
event.returnValue = mainWindow.isMaximized();
|
||||||
});
|
});
|
||||||
|
ipcMain.on("win-isNormal", (event, arg) => {
|
||||||
|
event.returnValue = mainWindow.isNormal();
|
||||||
|
});
|
||||||
ipcMain.on("win-minimize", (event, arg) => {
|
ipcMain.on("win-minimize", (event, arg) => {
|
||||||
mainWindow.minimize();
|
mainWindow.minimize();
|
||||||
});
|
});
|
||||||
|
@ -41,21 +70,27 @@ export function registerIpc() {
|
||||||
ipcMain.on("get-app-version", (event) => {
|
ipcMain.on("get-app-version", (event) => {
|
||||||
event.returnValue = getVersion();
|
event.returnValue = getVersion();
|
||||||
});
|
});
|
||||||
ipcMain.on("splashEnd", async (event, arg) => {
|
ipcMain.on("displayVersion", (event) => {
|
||||||
|
event.returnValue = getDisplayVersion();
|
||||||
|
});
|
||||||
|
ipcMain.on("get-package-version", (event) => {
|
||||||
|
event.returnValue = packageVersion;
|
||||||
|
});
|
||||||
|
ipcMain.on("splashEnd", async () => {
|
||||||
try {
|
try {
|
||||||
var width = await getWindowState("width") ?? 800;
|
var width = (await getWindowState("width")) ?? 800;
|
||||||
var height= await getWindowState("height") ?? 600;
|
var height = (await getWindowState("height")) ?? 600;
|
||||||
var isMaximized = await getWindowState("isMaximized") ?? false;
|
var isMaximized = (await getWindowState("isMaximized")) ?? false;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("No window state file found. Fallbacking to default values.")
|
console.log("[Window state manager] No window state file found. Fallbacking to default values.");
|
||||||
mainWindow.setSize(800, 600);
|
mainWindow.setSize(800, 600);
|
||||||
}
|
}
|
||||||
if (isMaximized) {
|
if (isMaximized) {
|
||||||
mainWindow.setSize(800, 600); //just so the whole thing doesn't cover whole screen
|
mainWindow.setSize(800, 600); //just so the whole thing doesn't cover whole screen
|
||||||
mainWindow.maximize()
|
mainWindow.maximize();
|
||||||
} else {
|
} else {
|
||||||
mainWindow.setSize(width, height);
|
mainWindow.setSize(width, height);
|
||||||
console.log("Not maximized.")
|
console.log("[Window state manager] Not maximized.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ipcMain.on("restart", (event, arg) => {
|
ipcMain.on("restart", (event, arg) => {
|
||||||
|
@ -74,9 +109,15 @@ export function registerIpc() {
|
||||||
ipcMain.on("clientmod", async (event, arg) => {
|
ipcMain.on("clientmod", async (event, arg) => {
|
||||||
event.returnValue = await getConfig("mods");
|
event.returnValue = await getConfig("mods");
|
||||||
});
|
});
|
||||||
|
ipcMain.on("trayIcon", async (event, arg) => {
|
||||||
|
event.returnValue = await getConfig("trayIcon");
|
||||||
|
});
|
||||||
ipcMain.on("titlebar", (event, arg) => {
|
ipcMain.on("titlebar", (event, arg) => {
|
||||||
event.returnValue = customTitlebar;
|
event.returnValue = customTitlebar;
|
||||||
});
|
});
|
||||||
|
ipcMain.on("mobileMode", async (event, arg) => {
|
||||||
|
event.returnValue = await getConfig("mobileMode");
|
||||||
|
});
|
||||||
ipcMain.on("shouldPatch", async (event, arg) => {
|
ipcMain.on("shouldPatch", async (event, arg) => {
|
||||||
event.returnValue = await getConfig("automaticPatches");
|
event.returnValue = await getConfig("automaticPatches");
|
||||||
});
|
});
|
||||||
|
|
35
src/main.ts
|
@ -6,10 +6,11 @@ import "./extensions/mods";
|
||||||
import "./extensions/plugin";
|
import "./extensions/plugin";
|
||||||
import "./tray";
|
import "./tray";
|
||||||
import {createCustomWindow, createNativeWindow} from "./window";
|
import {createCustomWindow, createNativeWindow} from "./window";
|
||||||
import "./shortcuts";
|
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";
|
||||||
|
|
||||||
if (process.platform == "linux") {
|
if (process.platform == "linux") {
|
||||||
if (process.env.$XDG_SESSION_TYPE == "wayland") {
|
if (process.env.$XDG_SESSION_TYPE == "wayland") {
|
||||||
|
@ -25,6 +26,12 @@ 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() {
|
||||||
switch (await getConfig("windowStyle")) {
|
switch (await getConfig("windowStyle")) {
|
||||||
case "default":
|
case "default":
|
||||||
createCustomWindow();
|
createCustomWindow();
|
||||||
|
@ -33,7 +40,7 @@ app.whenReady().then(async () => {
|
||||||
case "native":
|
case "native":
|
||||||
createNativeWindow();
|
createNativeWindow();
|
||||||
break;
|
break;
|
||||||
case "discord":
|
case "basic":
|
||||||
createNativeWindow();
|
createNativeWindow();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -41,6 +48,8 @@ app.whenReady().then(async () => {
|
||||||
customTitlebar = true;
|
customTitlebar = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
await init();
|
||||||
session.fromPartition("some-partition").setPermissionRequestHandler((webContents, permission, callback) => {
|
session.fromPartition("some-partition").setPermissionRequestHandler((webContents, permission, callback) => {
|
||||||
if (permission === "notifications") {
|
if (permission === "notifications") {
|
||||||
// Approves the permissions request
|
// Approves the permissions request
|
||||||
|
@ -52,24 +61,6 @@ app.whenReady().then(async () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
app.on("activate", async function () {
|
app.on("activate", async function () {
|
||||||
if (BrowserWindow.getAllWindows().length === 0)
|
if (BrowserWindow.getAllWindows().length === 0) await init();
|
||||||
switch (await getConfig("windowStyle")) {
|
|
||||||
case "default":
|
|
||||||
createCustomWindow();
|
|
||||||
break;
|
|
||||||
case "native":
|
|
||||||
createNativeWindow();
|
|
||||||
break;
|
|
||||||
case "discord":
|
|
||||||
createNativeWindow();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
createCustomWindow();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.on("window-all-closed", function () {
|
|
||||||
if (process.platform !== "darwin") app.quit();
|
|
||||||
});
|
|
||||||
|
|
106
src/menu.ts
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
import {Menu, app, clipboard, globalShortcut} from "electron";
|
||||||
|
import {mainWindow} from "./window";
|
||||||
|
import {getConfig} from "./utils";
|
||||||
|
import {createSettingsWindow} from "./settings/main";
|
||||||
|
|
||||||
|
function paste(contents: any) {
|
||||||
|
const contentTypes = clipboard.availableFormats().toString();
|
||||||
|
//Workaround: fix pasting the images.
|
||||||
|
if (contentTypes.includes("image/") && contentTypes.includes("text/html")) {
|
||||||
|
clipboard.writeImage(clipboard.readImage());
|
||||||
|
}
|
||||||
|
contents.paste();
|
||||||
|
}
|
||||||
|
export async function setMenu() {
|
||||||
|
if ((await getConfig("alternativePaste")) == true) {
|
||||||
|
mainWindow.on("focus", function () {
|
||||||
|
console.log("[Window state manager] Focus");
|
||||||
|
globalShortcut.register("CmdOrCtrl+V", function () {
|
||||||
|
if (mainWindow.isFocused()) {
|
||||||
|
paste(mainWindow.webContents);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
mainWindow.on("show", function () {
|
||||||
|
console.log("[Window state manager] Show");
|
||||||
|
mainWindow.focus();
|
||||||
|
globalShortcut.register("CmdOrCtrl+V", function () {
|
||||||
|
if (mainWindow.isFocused()) {
|
||||||
|
paste(mainWindow.webContents);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
mainWindow.on("blur", function () {
|
||||||
|
console.log("[Window state manager] Defocus");
|
||||||
|
globalShortcut.unregister("CmdOrCtrl+V");
|
||||||
|
});
|
||||||
|
mainWindow.on("hide", function () {
|
||||||
|
console.log("[Window state manager] Hide");
|
||||||
|
globalShortcut.unregister("CmdOrCtrl+V");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var template: Electron.MenuItemConstructorOptions[] = [
|
||||||
|
{
|
||||||
|
label: "ArmCord",
|
||||||
|
submenu: [
|
||||||
|
{label: "About ArmCord", role: "about"}, //orderFrontStandardAboutPanel
|
||||||
|
{type: "separator"},
|
||||||
|
{
|
||||||
|
label: "Developer tools",
|
||||||
|
accelerator: "CmdOrCtrl+Shift+I",
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.openDevTools();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Open settings",
|
||||||
|
accelerator: "CmdOrCtrl+Shift+'",
|
||||||
|
click: function () {
|
||||||
|
createSettingsWindow();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Reload",
|
||||||
|
accelerator: "CmdOrCtrl+R",
|
||||||
|
click: function () {
|
||||||
|
mainWindow.reload();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Quit",
|
||||||
|
accelerator: "CmdOrCtrl+Q",
|
||||||
|
click: function () {
|
||||||
|
app.quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Edit",
|
||||||
|
submenu: [
|
||||||
|
{label: "Undo", accelerator: "CmdOrCtrl+Z", role: "undo"},
|
||||||
|
{label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", role: "redo"},
|
||||||
|
{type: "separator"},
|
||||||
|
{label: "Cut", accelerator: "CmdOrCtrl+X", role: "cut"},
|
||||||
|
{label: "Copy", accelerator: "CmdOrCtrl+C", role: "copy"},
|
||||||
|
{
|
||||||
|
label: "Paste",
|
||||||
|
accelerator: "CmdOrCtrl+V",
|
||||||
|
click: function () {
|
||||||
|
paste(mainWindow.webContents);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{label: "Select All", accelerator: "CmdOrCtrl+A", role: "selectAll"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Zoom",
|
||||||
|
submenu: [
|
||||||
|
{label: "Zoom in", accelerator: "CmdOrCtrl+Plus", role: "zoomIn"},
|
||||||
|
{label: "Zoom out", accelerator: "CmdOrCtrl+-", role: "zoomOut"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
Menu.setApplicationMenu(Menu.buildFromTemplate(template));
|
||||||
|
}
|
|
@ -16,19 +16,22 @@ 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),
|
setLang: (lang: string) => ipcRenderer.send("setLang", lang),
|
||||||
|
setPingCount: (pingCount: number) => ipcRenderer.send("setPing", pingCount),
|
||||||
|
setTrayIcon: (favicon: string) => ipcRenderer.send("sendTrayIcon", favicon),
|
||||||
getLang: (toGet: string) =>
|
getLang: (toGet: string) =>
|
||||||
ipcRenderer.invoke("getLang", toGet).then((result) => {
|
ipcRenderer.invoke("getLang", toGet).then((result) => {
|
||||||
return result;
|
return result;
|
||||||
}),
|
}),
|
||||||
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
||||||
|
packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"),
|
||||||
getDisplayMediaSelector: getDisplayMediaSelector,
|
getDisplayMediaSelector: getDisplayMediaSelector,
|
||||||
|
splashEnd: () => ipcRenderer.send("splashEnd"),
|
||||||
openSettingsWindow: () => ipcRenderer.send("openSettingsWindow")
|
openSettingsWindow: () => ipcRenderer.send("openSettingsWindow")
|
||||||
});
|
});
|
||||||
//to be only used inside armcord internal setup/splash etc
|
//to be only used inside armcord internal setup/splash etc
|
||||||
if (window.location.href.indexOf("splash.html") > -1 || window.location.href.indexOf("setup.html") > -1) {
|
if (window.location.href.indexOf("splash.html") > -1 || window.location.href.indexOf("setup.html") > -1) {
|
||||||
contextBridge.exposeInMainWorld("armcordinternal", {
|
contextBridge.exposeInMainWorld("armcordinternal", {
|
||||||
restart: () => ipcRenderer.send("restart"),
|
restart: () => ipcRenderer.send("restart"),
|
||||||
saveSettings: (...args: any) => ipcRenderer.send("saveSettings", ...args),
|
saveSettings: (...args: any) => ipcRenderer.send("saveSettings", ...args)
|
||||||
splashEnd: () => ipcRenderer.send("splashEnd")
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
//original https://github.com/electron/electron/issues/16513#issuecomment-602070250
|
//original https://github.com/electron/electron/issues/16513#issuecomment-602070250
|
||||||
import {ipcRenderer} from "electron";
|
import {ipcRenderer} from "electron";
|
||||||
import {addStyle, addScript} from "../utils";
|
import {addStyle, addScript} from "../utils";
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
const desktopCapturer = {
|
const desktopCapturer = {
|
||||||
getSources: (opts: any) => ipcRenderer.invoke("DESKTOP_CAPTURER_GET_SOURCES", opts)
|
getSources: (opts: any) => ipcRenderer.invoke("DESKTOP_CAPTURER_GET_SOURCES", opts)
|
||||||
};
|
};
|
||||||
|
@ -40,79 +42,6 @@ export async function getDisplayMediaSelector() {
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const screenShareCSS = `
|
|
||||||
.desktop-capturer-selection {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100vh;
|
|
||||||
background: rgba(30,30,30,.75);
|
|
||||||
color: #FFFFFF;
|
|
||||||
z-index: 10000000;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__scroller {
|
|
||||||
width: 100%;
|
|
||||||
max-height: 100vh;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__list {
|
|
||||||
max-width: calc(100% - 100px);
|
|
||||||
margin: 50px;
|
|
||||||
padding: 0;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
list-style: none;
|
|
||||||
overflow: hidden;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__item {
|
|
||||||
display: flex;
|
|
||||||
margin: 4px;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__btn {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: stretch;
|
|
||||||
width: 145px;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 4px;
|
|
||||||
background: #2C2F33;
|
|
||||||
text-align: left;
|
|
||||||
@media (prefers-reduced-motion: no-preference) {
|
|
||||||
transition: background-color .15s, box-shadow .15s, color .15s;
|
|
||||||
}
|
|
||||||
color: #dedede;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__btn:hover,
|
|
||||||
.desktop-capturer-selection__btn:focus {
|
|
||||||
background: #7289DA;
|
|
||||||
box-shadow: 0 0 4px rgba(0,0,0,0.45), 0 0 2px rgba(0,0,0,0.25);
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__thumbnail {
|
|
||||||
width: 100%;
|
|
||||||
height: 81px;
|
|
||||||
object-fit: cover;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__name {
|
|
||||||
margin: 6px 0;
|
|
||||||
white-space: nowrap;
|
|
||||||
color: white;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
text-align: center;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.desktop-capturer-selection__name--cancel {
|
|
||||||
margin: auto 0;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const screenShareJS = `
|
const screenShareJS = `
|
||||||
window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => {
|
window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
|
@ -155,6 +84,7 @@ window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
addScript(screenShareJS);
|
addScript(screenShareJS);
|
||||||
addStyle(screenShareCSS);
|
const screenshareCss = path.join(__dirname, "../", "/content/css/screenshare.css");
|
||||||
|
addStyle(fs.readFileSync(screenshareCss, "utf8"));
|
||||||
console.log("Capturer injected.");
|
console.log("Capturer injected.");
|
||||||
});
|
});
|
||||||
|
|
15
src/preload/mobile.ts
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import {ipcRenderer} from "electron";
|
||||||
|
import {addStyle} from "../utils";
|
||||||
|
import * as fs from "fs";
|
||||||
|
import * as path from "path";
|
||||||
|
export function injectMobileStuff() {
|
||||||
|
document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const mobileCSS = path.join(__dirname, "../", "/content/css/mobile.css");
|
||||||
|
addStyle(fs.readFileSync(mobileCSS, "utf8"));
|
||||||
|
// TO-DO: clicking on the logo, or additional button triggers ESC button to move around the UI quicker
|
||||||
|
// var logo = document.getElementById("window-title");
|
||||||
|
// logo!.addEventListener("click", () => {
|
||||||
|
//
|
||||||
|
// });
|
||||||
|
});
|
||||||
|
}
|
|
@ -3,10 +3,12 @@ import "./capturer";
|
||||||
import "./patch";
|
import "./patch";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import {injectTitlebar} from "./titlebar";
|
import {injectHummusTitlebar, injectTitlebar} from "./titlebar";
|
||||||
import {sleep, addStyle, injectJS, addScript} from "../utils";
|
import {sleep, addStyle, injectJS, addScript} from "../utils";
|
||||||
import {ipcRenderer} from "electron";
|
import {ipcRenderer} from "electron";
|
||||||
var version = ipcRenderer.sendSync("get-app-version", "app-version");
|
import {injectMobileStuff} from "./mobile";
|
||||||
|
var version = ipcRenderer.sendSync("displayVersion");
|
||||||
|
var channel = ipcRenderer.sendSync("channel");
|
||||||
async function updateLang() {
|
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");
|
||||||
|
@ -24,10 +26,11 @@ 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",
|
cumcord: "https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js",
|
||||||
flicker: "https://raw.githubusercontent.com/FlickerMod/dist/main/build.js"
|
flicker: "https://raw.githubusercontent.com/FlickerMod/dist/main/build.js",
|
||||||
|
cordwood: "https://raw.githubusercontent.com/Cordwood/builds/master/index.js"
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log("ArmCord");
|
console.log("ArmCord " + version);
|
||||||
ipcRenderer.on("themeLoader", (event, message) => {
|
ipcRenderer.on("themeLoader", (event, message) => {
|
||||||
addStyle(message);
|
addStyle(message);
|
||||||
});
|
});
|
||||||
|
@ -35,8 +38,15 @@ if (window.location.href.indexOf("splash.html") > -1) {
|
||||||
console.log("Skipping titlebar injection and client mod injection.");
|
console.log("Skipping titlebar injection and client mod injection.");
|
||||||
} else {
|
} else {
|
||||||
if (ipcRenderer.sendSync("titlebar")) {
|
if (ipcRenderer.sendSync("titlebar")) {
|
||||||
|
if (channel == "hummus") {
|
||||||
|
injectHummusTitlebar();
|
||||||
|
} else {
|
||||||
injectTitlebar();
|
injectTitlebar();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (ipcRenderer.sendSync("mobileMode")) {
|
||||||
|
injectMobileStuff();
|
||||||
|
}
|
||||||
sleep(5000).then(async () => {
|
sleep(5000).then(async () => {
|
||||||
const cssPath = path.join(__dirname, "../", "/content/css/discord.css");
|
const cssPath = path.join(__dirname, "../", "/content/css/discord.css");
|
||||||
addStyle(fs.readFileSync(cssPath, "utf8"));
|
addStyle(fs.readFileSync(cssPath, "utf8"));
|
||||||
|
@ -57,6 +67,11 @@ if (window.location.href.indexOf("splash.html") > -1) {
|
||||||
console.log("Loading FlickerMod...");
|
console.log("Loading FlickerMod...");
|
||||||
await updateLang();
|
await updateLang();
|
||||||
break;
|
break;
|
||||||
|
case "cordwood":
|
||||||
|
injectJS(clientMods.cordwood);
|
||||||
|
console.log("Loading Cordwood...");
|
||||||
|
await updateLang();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -93,6 +108,5 @@ setInterval(() => {
|
||||||
|
|
||||||
el.textContent = `\nArmCord Version: ${version}`;
|
el.textContent = `\nArmCord Version: ${version}`;
|
||||||
el.onclick = () => ipcRenderer.send("openSettingsWindow");
|
el.onclick = () => ipcRenderer.send("openSettingsWindow");
|
||||||
|
|
||||||
host.append(el);
|
host.append(el);
|
||||||
}, 2000);
|
}, 2000);
|
||||||
|
|
|
@ -2,7 +2,7 @@ import {ipcRenderer} from "electron";
|
||||||
import {addStyle} from "../utils";
|
import {addStyle} from "../utils";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import {platform} from "node:process";
|
import os from "os";
|
||||||
export function injectTitlebar() {
|
export function injectTitlebar() {
|
||||||
document.addEventListener("DOMContentLoaded", function (event) {
|
document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
var elem = document.createElement("div");
|
var elem = document.createElement("div");
|
||||||
|
@ -25,7 +25,8 @@ export function injectTitlebar() {
|
||||||
const wordmarkcssPath = path.join(__dirname, "../", "/content/css/logos.css");
|
const wordmarkcssPath = path.join(__dirname, "../", "/content/css/logos.css");
|
||||||
addStyle(fs.readFileSync(titlebarcssPath, "utf8"));
|
addStyle(fs.readFileSync(titlebarcssPath, "utf8"));
|
||||||
addStyle(fs.readFileSync(wordmarkcssPath, "utf8"));
|
addStyle(fs.readFileSync(wordmarkcssPath, "utf8"));
|
||||||
document.body.setAttribute("armcord-platform", platform);
|
document.body.setAttribute("customTitlebar", "");
|
||||||
|
document.body.setAttribute("armcord-platform", os.platform());
|
||||||
|
|
||||||
var minimize = document.getElementById("minimize");
|
var minimize = document.getElementById("minimize");
|
||||||
var maximize = document.getElementById("maximize");
|
var maximize = document.getElementById("maximize");
|
||||||
|
@ -38,7 +39,56 @@ export function injectTitlebar() {
|
||||||
maximize!.addEventListener("click", () => {
|
maximize!.addEventListener("click", () => {
|
||||||
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
||||||
ipcRenderer.send("win-unmaximize");
|
ipcRenderer.send("win-unmaximize");
|
||||||
} else {
|
document.body.removeAttribute("isMaximized");
|
||||||
|
} else if (ipcRenderer.sendSync("win-isNormal") == true) {
|
||||||
|
ipcRenderer.send("win-maximize");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
quit!.addEventListener("click", () => {
|
||||||
|
if (ipcRenderer.sendSync("minimizeToTray") === true) {
|
||||||
|
ipcRenderer.send("win-hide");
|
||||||
|
} else if (ipcRenderer.sendSync("minimizeToTray") === false) {
|
||||||
|
ipcRenderer.send("win-quit");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
export function injectHummusTitlebar() {
|
||||||
|
document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
var elem = document.createElement("div");
|
||||||
|
elem.innerHTML = `
|
||||||
|
<button class="win-minimize" id="minimize"></button><button class="win-maximize" id="maximize"></button><button class="win-close" id="quit"></button>
|
||||||
|
`;
|
||||||
|
elem.classList.add("win-buttons");
|
||||||
|
elem.classList.add("win-buttons-light");
|
||||||
|
document.getElementsByClassName("titlebar")[0].appendChild(elem);
|
||||||
|
document.body.setAttribute("customTitlebar", "");
|
||||||
|
document.body.setAttribute("hummus", "");
|
||||||
|
document.body.setAttribute("armcord-platform", os.platform());
|
||||||
|
addStyle(`
|
||||||
|
html, body {
|
||||||
|
background-color: #1e2124;
|
||||||
|
}
|
||||||
|
|
||||||
|
.friends-header,
|
||||||
|
.chat > .title-wrap {
|
||||||
|
float: right !important;
|
||||||
|
padding-right: 140px !important;
|
||||||
|
}`);
|
||||||
|
var minimize = document.getElementById("minimize");
|
||||||
|
var maximize = document.getElementById("maximize");
|
||||||
|
var quit = document.getElementById("quit");
|
||||||
|
|
||||||
|
minimize!.addEventListener("click", () => {
|
||||||
|
ipcRenderer.send("win-minimize");
|
||||||
|
});
|
||||||
|
|
||||||
|
maximize!.addEventListener("click", () => {
|
||||||
|
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
||||||
|
ipcRenderer.send("win-unmaximize");
|
||||||
|
document.body.removeAttribute("isMaximized");
|
||||||
|
} else if (ipcRenderer.sendSync("win-isNormal") == true) {
|
||||||
ipcRenderer.send("win-maximize");
|
ipcRenderer.send("win-maximize");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
234
src/settings/hummus.html
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<style>
|
||||||
|
@import url("../content/css/settings.css");
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="saveBar">
|
||||||
|
<button id="settings-save" class="center">Save Settings</button>
|
||||||
|
</div>
|
||||||
|
<div class="restartBar">
|
||||||
|
<button id="settings-restart" class="center">Restart App</button>
|
||||||
|
</div>
|
||||||
|
<div class="switch acTheme">
|
||||||
|
<select name="theme" id="theme" class="left dropdown">
|
||||||
|
<option value="default">Default</option>
|
||||||
|
<option value="native">Native</option>
|
||||||
|
</select>
|
||||||
|
<p class="header" id="settings-theme">ArmCord theme</p>
|
||||||
|
<p class="description">
|
||||||
|
ArmCord "themes" manage apps behaviour and looks.
|
||||||
|
<br />
|
||||||
|
<b>Default</b> - this is how ArmCord looks when you first launch it. It includes recreation of Discord's
|
||||||
|
custom titlebar and ArmCord specific styles injected into Discord.
|
||||||
|
<br />
|
||||||
|
<b>Native</b> - uses native titlebar of OS you're currently running (e.g Windows 7/10). Functions more
|
||||||
|
similar to actual Discord app on Linux.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acCSP">
|
||||||
|
<label class="header">ArmCord CSP</label>
|
||||||
|
<input class="tgl tgl-light left" id="csp" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="csp"></label>
|
||||||
|
<p class="description">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acTray">
|
||||||
|
<label class="header" id="settings-tray">Minimize to tray</label>
|
||||||
|
<input class="tgl tgl-light left" id="tray" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="tray"></label>
|
||||||
|
<p class="description">
|
||||||
|
When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax
|
||||||
|
in your system tray for later.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acPatches">
|
||||||
|
<label class="header" id="settings-patches">Automatic Patches</label>
|
||||||
|
<input class="tgl tgl-light left" id="patches" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="patches"></label>
|
||||||
|
<p class="description">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acAltPaste">
|
||||||
|
<label class="header" id="settings-alternativePaste">Alternative paste</label>
|
||||||
|
<input class="tgl tgl-light left" id="alternativePaste" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="alternativePaste"></label>
|
||||||
|
<p class="description">
|
||||||
|
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
|
||||||
|
issues.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acChannel">
|
||||||
|
<select name="channel" id="channel" class="left dropdown">
|
||||||
|
<option value="stable">Stable</option>
|
||||||
|
<option value="canary">Canary</option>
|
||||||
|
<option value="ptb">PTB</option>
|
||||||
|
<option value="hummus">Hummus (unofficial)</option>
|
||||||
|
</select>
|
||||||
|
<div>
|
||||||
|
<p class="header" id="settings-channel">Discord channel:</p>
|
||||||
|
<p class="description">
|
||||||
|
You can use this setting to change current instance of Discord:
|
||||||
|
<br />
|
||||||
|
<b>Stable</b> - you're probably most familiar with this one. It's the one you see in default Discord
|
||||||
|
client!
|
||||||
|
<br />
|
||||||
|
<b>Canary</b> - this is alpha test release of Discord. By using it you gain access to newest
|
||||||
|
features and fixes.
|
||||||
|
<br />
|
||||||
|
<b>PTB</b> - public test build. Gets features earlier than stable but is a bit older than Canary.
|
||||||
|
<br />
|
||||||
|
<b>Hummus</b> - unofficial instance of Discord that takes you back to 2016! None of the client mods
|
||||||
|
bundled with ArmCord work with it. It's run by community, so you take all the risk by using it.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acCordwood">
|
||||||
|
<label class="header" id="settings-cordwood">Cordwood client mod</label>
|
||||||
|
<input class="tgl tgl-light left" id="cordwood" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="cordwood"></label>
|
||||||
|
<p class="description">
|
||||||
|
Client mod for Hummus that focuses on making the plugin development experience easier. Minimal, light,
|
||||||
|
and easy to use
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acPrfmMode">
|
||||||
|
<select name="prfmMode" id="prfmMode" class="left dropdown">
|
||||||
|
<option value="performance">Performance</option>
|
||||||
|
<option value="battery">Battery</option>
|
||||||
|
<option value="none">None</option>
|
||||||
|
</select>
|
||||||
|
<p class="header" id="settings-prfmMode">Performance mode:</p>
|
||||||
|
<p class="description">
|
||||||
|
Performance mode is an experimental function that may either increase responsiveness and performance of
|
||||||
|
ArmCord or... decrease it. Please try every option and see which fits you the best.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acTray">
|
||||||
|
<select name="trayIcon" id="trayIcon" class="left dropdown">
|
||||||
|
<optgroup label="- Discord -">
|
||||||
|
<option value="default">Dynamic</option>
|
||||||
|
<option value="dsc-tray">Discord Icon</option>
|
||||||
|
<option value="clsc-dsc-tray">Classic Discord Icon</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="- ArmCord -">
|
||||||
|
<option value="ac_plug_colored">Colored Plug</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>
|
||||||
|
<p class="header" id="settings-trayIcon">Tray icon:</p>
|
||||||
|
<p class="description">Set the icon which will appear in tray menu.</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<div class="switch acAdvSettings">
|
||||||
|
<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>
|
||||||
|
<br />
|
||||||
|
<button id="settings-themesFolder" class="center">Open Themes Folder</button>
|
||||||
|
<br />
|
||||||
|
<button id="settings-storageFolder" class="center">Open Storage Folder</button>
|
||||||
|
<br />
|
||||||
|
<button id="settings-copyDebugInfo" class="center">Copy Debug Info</button>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
<script>
|
||||||
|
async function loadLang() {
|
||||||
|
document.getElementById("settings-save").innerHTML = await settings.getLang("settings-save");
|
||||||
|
document.getElementById("settings-channel").innerHTML = await settings.getLang("settings-channel");
|
||||||
|
document.getElementById("settings-patches").innerHTML = await settings.getLang("settings-patches");
|
||||||
|
document.getElementById("settings-tray").innerHTML = await settings.getLang("settings-tray");
|
||||||
|
document.getElementById("settings-theme").innerHTML = await settings.getLang("settings-theme");
|
||||||
|
document.getElementById("prfmMode").options[2].text = await settings.getLang("settings-none");
|
||||||
|
document.getElementById("prfmMode").options[1].text = await settings.getLang("settings-prfmMode-battery");
|
||||||
|
document.getElementById("prfmMode").options[0].text = await settings.getLang(
|
||||||
|
"settings-prfmMode-performance"
|
||||||
|
);
|
||||||
|
document.getElementById("theme").options[1].text = await settings.getLang("settings-theme-native");
|
||||||
|
document.getElementById("theme").options[0].text = await settings.getLang("settings-theme-default");
|
||||||
|
}
|
||||||
|
loadLang();
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
async function loadSettings() {
|
||||||
|
document.getElementById("csp").checked = await settings.get("armcordCSP");
|
||||||
|
document.getElementById("tray").checked = await settings.get("minimizeToTray");
|
||||||
|
document.getElementById("alternativePaste").checked = await settings.get("alternativePaste");
|
||||||
|
document.getElementById("patches").value = await settings.get("automaticPatches");
|
||||||
|
if ((await settings.get("mods")) == "cordwood") {
|
||||||
|
document.getElementById("cordwood").checked = true;
|
||||||
|
} else {
|
||||||
|
document.getElementById("cordwood").checked = false;
|
||||||
|
}
|
||||||
|
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 () {
|
||||||
|
settings.save({
|
||||||
|
windowStyle: document.getElementById("theme").value,
|
||||||
|
channel: document.getElementById("channel").value,
|
||||||
|
armcordCSP: document.getElementById("csp").checked,
|
||||||
|
minimizeToTray: document.getElementById("tray").checked,
|
||||||
|
alternativePaste: document.getElementById("alternativePaste").checked,
|
||||||
|
skipSplash: document.getElementById("skipSplash").checked,
|
||||||
|
automaticPatches: document.getElementById("patches").checked,
|
||||||
|
mods: cordwood,
|
||||||
|
mobileMode: document.getElementById("mobile").checked,
|
||||||
|
inviteWebsocket: document.getElementById("websocket").checked,
|
||||||
|
performanceMode: document.getElementById("prfmMode").value,
|
||||||
|
trayIcon: document.getElementById("trayIcon").value,
|
||||||
|
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 () {
|
||||||
|
settings.openPluginsFolder();
|
||||||
|
await new Promise((r) => setTimeout(r, 2000));
|
||||||
|
});
|
||||||
|
document.getElementById("settings-themesFolder").addEventListener("click", async function () {
|
||||||
|
settings.openThemesFolder();
|
||||||
|
await new Promise((r) => setTimeout(r, 2000));
|
||||||
|
});
|
||||||
|
document.getElementById("settings-storageFolder").addEventListener("click", async function () {
|
||||||
|
settings.openStorageFolder();
|
||||||
|
await new Promise((r) => setTimeout(r, 2000));
|
||||||
|
});
|
||||||
|
document.getElementById("settings-copyDebugInfo").addEventListener("click", function () {
|
||||||
|
settings.copyDebugInfo();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</html>
|
|
@ -1,9 +1,25 @@
|
||||||
import {BrowserWindow, shell, ipcMain} from "electron";
|
import {BrowserWindow, shell, ipcMain, app, clipboard} from "electron";
|
||||||
import {getConfig, setConfigBulk, Settings, getLang} from "../utils";
|
import {
|
||||||
|
getConfig,
|
||||||
|
setConfigBulk,
|
||||||
|
Settings,
|
||||||
|
getLang,
|
||||||
|
getVersion,
|
||||||
|
getConfigLocation,
|
||||||
|
getLangName,
|
||||||
|
sleep,
|
||||||
|
getDisplayVersion
|
||||||
|
} from "../utils";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
import os from "os";
|
||||||
|
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 storagePath = path.join(userDataPath, "/storage/");
|
||||||
|
const themesPath = path.join(userDataPath, "/themes/");
|
||||||
|
const pluginsPath = path.join(userDataPath, "/plugins/");
|
||||||
export function createSettingsWindow() {
|
export function createSettingsWindow() {
|
||||||
console.log("Creating a settings window.");
|
console.log("Creating a settings window.");
|
||||||
instance = instance + 1;
|
instance = instance + 1;
|
||||||
|
@ -14,28 +30,90 @@ export function createSettingsWindow() {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
settingsWindow = new BrowserWindow({
|
settingsWindow = new BrowserWindow({
|
||||||
width: 500,
|
width: 660,
|
||||||
height: 555,
|
height: 670,
|
||||||
title: "ArmCord Settings",
|
title: `ArmCord Settings | Version: ${getDisplayVersion()}`,
|
||||||
darkTheme: true,
|
darkTheme: true,
|
||||||
frame: true,
|
frame: true,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
|
sandbox: false,
|
||||||
preload: path.join(__dirname, "preload.js")
|
preload: path.join(__dirname, "preload.js")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
async function settingsLoadPage() {
|
||||||
|
if ((await getConfig("channel")) == "hummus") {
|
||||||
|
settingsWindow.loadURL(`file://${__dirname}/hummus.html`);
|
||||||
|
} else {
|
||||||
|
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) => {
|
||||||
|
shell.openPath(storagePath);
|
||||||
|
await sleep(1000);
|
||||||
|
});
|
||||||
|
ipcMain.on("openThemesFolder", async (event) => {
|
||||||
|
shell.openPath(themesPath);
|
||||||
|
await sleep(1000);
|
||||||
|
});
|
||||||
|
ipcMain.on("openPluginsFolder", async (event) => {
|
||||||
|
shell.openPath(pluginsPath);
|
||||||
|
await sleep(1000);
|
||||||
|
});
|
||||||
|
ipcMain.on("getLangName", async (event) => {
|
||||||
|
event.returnValue = await getLangName();
|
||||||
|
});
|
||||||
ipcMain.handle("getSetting", (event, toGet: string) => {
|
ipcMain.handle("getSetting", (event, toGet: string) => {
|
||||||
return getConfig(toGet);
|
return getConfig(toGet);
|
||||||
});
|
});
|
||||||
|
ipcMain.on("copyDebugInfo", (event) => {
|
||||||
|
let settingsFileContent = fs.readFileSync(getConfigLocation(), "utf-8");
|
||||||
|
clipboard.writeText(
|
||||||
|
"**OS:** " +
|
||||||
|
os.platform() +
|
||||||
|
" " +
|
||||||
|
os.version() +
|
||||||
|
"\n**Architecture:** " +
|
||||||
|
os.arch() +
|
||||||
|
"\n**ArmCord version:** " +
|
||||||
|
getVersion() +
|
||||||
|
"\n**Electron version:** " +
|
||||||
|
process.versions.electron +
|
||||||
|
"\n`" +
|
||||||
|
settingsFileContent +
|
||||||
|
"`"
|
||||||
|
);
|
||||||
|
});
|
||||||
settingsWindow.webContents.setWindowOpenHandler(({url}) => {
|
settingsWindow.webContents.setWindowOpenHandler(({url}) => {
|
||||||
shell.openExternal(url);
|
shell.openExternal(url);
|
||||||
return {action: "deny"};
|
return {action: "deny"};
|
||||||
});
|
});
|
||||||
settingsWindow.loadURL(`file://${__dirname}/settings.html`);
|
settingsLoadPage();
|
||||||
settingsWindow.on("close", (event: Event) => {
|
settingsWindow.on("close", (event: Event) => {
|
||||||
ipcMain.removeHandler("getSetting");
|
ipcMain.removeHandler("getSetting");
|
||||||
ipcMain.removeAllListeners("saveSettings");
|
ipcMain.removeAllListeners("saveSettings");
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
import {contextBridge, ipcRenderer} from "electron";
|
import {contextBridge, ipcRenderer} from "electron";
|
||||||
|
import * as path from "path";
|
||||||
|
import {addStyle} from "../utils";
|
||||||
|
import fs from "fs";
|
||||||
console.log("ArmCord Settings");
|
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;
|
||||||
|
@ -9,5 +15,12 @@ contextBridge.exposeInMainWorld("settings", {
|
||||||
get: (toGet: string) =>
|
get: (toGet: string) =>
|
||||||
ipcRenderer.invoke("getSetting", toGet).then((result) => {
|
ipcRenderer.invoke("getSetting", toGet).then((result) => {
|
||||||
return result;
|
return result;
|
||||||
}) //jank but works
|
}), //jank but works
|
||||||
|
openThemesFolder: () => ipcRenderer.send("openThemesFolder"),
|
||||||
|
openPluginsFolder: () => ipcRenderer.send("openPluginsFolder"),
|
||||||
|
openStorageFolder: () => ipcRenderer.send("openStorageFolder"),
|
||||||
|
copyDebugInfo: () => ipcRenderer.send("copyDebugInfo")
|
||||||
|
});
|
||||||
|
ipcRenderer.on("themeLoader", (event, message) => {
|
||||||
|
addStyle(message);
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,74 +2,201 @@
|
||||||
<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");
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="switch">
|
<div class="saveBar">
|
||||||
<select name="theme" id="theme" class="left">
|
<button id="settings-save" class="center">Save Settings</button>
|
||||||
|
</div>
|
||||||
|
<div class="restartBar">
|
||||||
|
<button id="settings-restart" class="center">Restart App</button>
|
||||||
|
</div>
|
||||||
|
<div class="switch acTheme">
|
||||||
|
<select name="theme" id="theme" class="left dropdown">
|
||||||
<option value="default">Default</option>
|
<option value="default">Default</option>
|
||||||
<option value="native">Native</option>
|
<option value="native">Native</option>
|
||||||
</select>
|
</select>
|
||||||
<p class="header" id="settings-theme">ArmCord theme:</p>
|
<p class="header" id="settings-theme">ArmCord theme</p>
|
||||||
|
<p class="description">
|
||||||
|
ArmCord "themes" manage apps behaviour and looks.
|
||||||
|
<br />
|
||||||
|
<b>Default</b> - this is how ArmCord looks when you first launch it. It includes recreation of Discord's
|
||||||
|
custom titlebar and ArmCord specific styles injected into Discord.
|
||||||
|
<br />
|
||||||
|
<b>Native</b> - uses native titlebar of OS you're currently running (e.g Windows 7/10). Functions more
|
||||||
|
similar to actual Discord app on Linux.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<div class="switch">
|
<div class="switch acCSP">
|
||||||
<label class="header">ArmCord CSP</label>
|
<label class="header">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">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<div class="switch">
|
<div class="switch acTray">
|
||||||
<label class="header" id="settings-tray">Minimize to tray</label>
|
<label class="header" 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">
|
||||||
|
When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax
|
||||||
|
in your system tray for later.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<div class="switch">
|
<div class="switch acPatches">
|
||||||
<label class="header" id="settings-patches">Automatic Patches</label>
|
<label class="header" 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">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<div class="switch">
|
<div class="switch acWebsocket">
|
||||||
<label class="header" id="settings-invitewebsocket">Invite Websocket</label>
|
<label class="header" 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">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="switch">
|
<br />
|
||||||
<select name="channel" id="channel" class="left">
|
<div class="switch acMobileMode">
|
||||||
|
<label class="header" id="settings-mobileMode">Mobile mode</label>
|
||||||
|
<input class="tgl tgl-light left" id="mobile" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="mobile"></label>
|
||||||
|
<p class="description">
|
||||||
|
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
|
||||||
|
users on PinePhone and similar.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acAltPaste">
|
||||||
|
<label class="header" id="settings-alternativePaste">Alternative paste</label>
|
||||||
|
<input class="tgl tgl-light left" id="alternativePaste" type="checkbox" />
|
||||||
|
<label class="tgl-btn left" for="alternativePaste"></label>
|
||||||
|
<p class="description">
|
||||||
|
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
|
||||||
|
issues.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acChannel">
|
||||||
|
<select name="channel" id="channel" class="left dropdown">
|
||||||
<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="foss">Fosscord</option>
|
<option value="hummus">Hummus (Experimental)</option>
|
||||||
</select>
|
</select>
|
||||||
<p class="header" id="settings-channel">Discord channel:</p>
|
<div>
|
||||||
|
<p class="header" id="settings-channel">Discord channel</p>
|
||||||
|
<p class="description">
|
||||||
|
You can use this setting to change current instance of Discord:
|
||||||
|
<br />
|
||||||
|
<b>Stable</b> - you're probably most familiar with this one. It's the one you see in default Discord
|
||||||
|
client!
|
||||||
|
<br />
|
||||||
|
<b>Canary</b> - this is alpha test release of Discord. By using it you gain access to the newest
|
||||||
|
features and fixes.
|
||||||
|
<br />
|
||||||
|
<b>PTB</b> - public test build. Receives features earlier than stable but is a bit older than
|
||||||
|
Canary.
|
||||||
|
<br />
|
||||||
|
<b>Hummus</b> - unofficial instance of Discord that takes you back to 2016! Only client mod
|
||||||
|
available to run alongside with it is Cordwood. It's run by community, so you take all the risk by
|
||||||
|
using it.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="switch">
|
</div>
|
||||||
<select name="mod" id="mod" class="left">
|
<br />
|
||||||
|
<div class="switch acClientMod">
|
||||||
|
<select name="mod" id="mod" class="left dropdown">
|
||||||
<option value="cumcord">Cumcord</option>
|
<option value="cumcord">Cumcord</option>
|
||||||
<option value="goosemod">GooseMod</option>
|
<option value="goosemod">GooseMod</option>
|
||||||
<option value="flicker">Flicker</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>
|
||||||
|
<p class="description">
|
||||||
|
Client mods are programs that allow you customize your Discord experience. They can change appearance of
|
||||||
|
the client, modify behaviours or add new features!
|
||||||
|
<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
|
||||||
|
store for plugins.
|
||||||
|
<br />
|
||||||
|
<b>Flicker</b> - heavily work in progress, doesn't have a working UI.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="switch">
|
<br />
|
||||||
<select name="prfmMode" id="prfmMode" class="left">
|
<div class="switch acPrfmMode">
|
||||||
|
<select name="prfmMode" id="prfmMode" class="left dropdown">
|
||||||
<option value="performance">Performance</option>
|
<option value="performance">Performance</option>
|
||||||
<option value="battery">Battery</option>
|
<option value="battery">Battery</option>
|
||||||
<option value="none">None</option>
|
<option value="none">None</option>
|
||||||
</select>
|
</select>
|
||||||
<p class="header" id="settings-prfmMode">Performance mode:</p>
|
<p class="header" id="settings-prfmMode">Performance mode</p>
|
||||||
|
<p class="description">
|
||||||
|
Performance mode is an experimental function that may either increase responsiveness and performance of
|
||||||
|
ArmCord or... decrease it. Please try every option and see which fits you the best.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<div class="switch acTray">
|
||||||
|
<select name="trayIcon" id="trayIcon" class="left dropdown">
|
||||||
|
<optgroup label="- Discord -">
|
||||||
|
<option value="default">Dynamic</option>
|
||||||
|
<option value="dsc-tray">Discord Icon</option>
|
||||||
|
<option value="clsc-dsc-tray">Classic Discord Icon</option>
|
||||||
|
</optgroup>
|
||||||
|
<optgroup label="- ArmCord -">
|
||||||
|
<option value="ac_plug_colored">Colored Plug</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>
|
||||||
|
<p class="header" id="settings-trayIcon">Tray icon</p>
|
||||||
|
<p class="description">Set the icon which will appear in tray menu.</p>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<div class="switch acAdvSettings">
|
||||||
|
<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>
|
||||||
|
<br />
|
||||||
|
<button id="settings-themesFolder" class="center">Open Themes Folder</button>
|
||||||
|
<br />
|
||||||
|
<button id="settings-storageFolder" class="center">Open Storage Folder</button>
|
||||||
|
<br />
|
||||||
|
<button id="settings-copyDebugInfo" class="center">Copy Debug Info</button>
|
||||||
</div>
|
</div>
|
||||||
<button id="settings-save" class="center">Save settings</button>
|
|
||||||
</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");
|
||||||
|
@ -78,6 +205,7 @@
|
||||||
);
|
);
|
||||||
document.getElementById("settings-patches").innerHTML = await settings.getLang("settings-patches");
|
document.getElementById("settings-patches").innerHTML = await settings.getLang("settings-patches");
|
||||||
document.getElementById("settings-tray").innerHTML = await settings.getLang("settings-tray");
|
document.getElementById("settings-tray").innerHTML = await settings.getLang("settings-tray");
|
||||||
|
document.getElementById("settings-mobileMode").innerHTML = await settings.getLang("settings-mobileMode");
|
||||||
document.getElementById("settings-theme").innerHTML = await settings.getLang("settings-theme");
|
document.getElementById("settings-theme").innerHTML = await settings.getLang("settings-theme");
|
||||||
//select stuff
|
//select stuff
|
||||||
document.getElementById("mod").options[3].text = await settings.getLang("settings-none");
|
document.getElementById("mod").options[3].text = await settings.getLang("settings-none");
|
||||||
|
@ -96,11 +224,15 @@
|
||||||
document.getElementById("csp").checked = await settings.get("armcordCSP");
|
document.getElementById("csp").checked = await settings.get("armcordCSP");
|
||||||
document.getElementById("tray").checked = await settings.get("minimizeToTray");
|
document.getElementById("tray").checked = await settings.get("minimizeToTray");
|
||||||
document.getElementById("websocket").checked = await settings.get("inviteWebsocket");
|
document.getElementById("websocket").checked = await settings.get("inviteWebsocket");
|
||||||
document.getElementById("patches").checked = await settings.get("automaticPatches");
|
document.getElementById("alternativePaste").checked = await settings.get("alternativePaste");
|
||||||
|
document.getElementById("skipSplash").checked = await settings.get("skipSplash");
|
||||||
|
document.getElementById("mobile").checked = await settings.get("mobileMode");
|
||||||
|
document.getElementById("patches").value = await settings.get("automaticPatches");
|
||||||
document.getElementById("mod").value = await settings.get("mods");
|
document.getElementById("mod").value = await settings.get("mods");
|
||||||
document.getElementById("channel").value = await settings.get("channel");
|
document.getElementById("channel").value = await settings.get("channel");
|
||||||
document.getElementById("theme").value = await settings.get("windowStyle");
|
document.getElementById("theme").value = await settings.get("windowStyle");
|
||||||
document.getElementById("prfmMode").value = await settings.get("performanceMode");
|
document.getElementById("prfmMode").value = await settings.get("performanceMode");
|
||||||
|
document.getElementById("trayIcon").value = await settings.get("trayIcon");
|
||||||
}
|
}
|
||||||
loadSettings();
|
loadSettings();
|
||||||
document.getElementById("settings-save").addEventListener("click", function () {
|
document.getElementById("settings-save").addEventListener("click", function () {
|
||||||
|
@ -109,12 +241,37 @@
|
||||||
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,
|
||||||
|
skipSplash: document.getElementById("skipSplash").checked,
|
||||||
automaticPatches: document.getElementById("patches").checked,
|
automaticPatches: document.getElementById("patches").checked,
|
||||||
mods: document.getElementById("mod").value,
|
mods: document.getElementById("mod").value,
|
||||||
|
mobileMode: document.getElementById("mobile").checked,
|
||||||
inviteWebsocket: document.getElementById("websocket").checked,
|
inviteWebsocket: document.getElementById("websocket").checked,
|
||||||
performanceMode: document.getElementById("prfmMode").value,
|
performanceMode: document.getElementById("prfmMode").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 () {
|
||||||
|
settings.openPluginsFolder();
|
||||||
|
});
|
||||||
|
document.getElementById("settings-themesFolder").addEventListener("click", function () {
|
||||||
|
settings.openThemesFolder();
|
||||||
|
});
|
||||||
|
document.getElementById("settings-storageFolder").addEventListener("click", function () {
|
||||||
|
settings.openStorageFolder();
|
||||||
|
});
|
||||||
|
document.getElementById("settings-copyDebugInfo").addEventListener("click", function () {
|
||||||
|
settings.copyDebugInfo();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
import {app} from "electron";
|
|
||||||
import {mainWindow} from "./window";
|
|
||||||
//https://github.com/electron/electron/issues/1334#issuecomment-716080005
|
|
||||||
// TO-DO add more
|
|
||||||
app.on("web-contents-created", (webContentsCreatedEvent, webContents) => {
|
|
||||||
webContents.on("before-input-event", (beforeInputEvent, input) => {
|
|
||||||
// console.log('Main console::', input)
|
|
||||||
const {code, alt, control, shift, meta} = input;
|
|
||||||
// Shortcut: toggle devTools
|
|
||||||
if (shift && control && !alt && !meta && code === "KeyI") {
|
|
||||||
mainWindow.webContents.toggleDevTools();
|
|
||||||
}
|
|
||||||
// Shortcut: window reload
|
|
||||||
if (shift && control && !alt && !meta && code === "KeyR") {
|
|
||||||
mainWindow.reload();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,29 +1,30 @@
|
||||||
// MIT License
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2022 Dawid Papiewski "SpacingBat3"
|
|
||||||
|
|
||||||
// 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:
|
|
||||||
|
|
||||||
// The above copyright notice and this permission notice shall be included in all
|
|
||||||
// copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// 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.
|
|
||||||
import type {Server, WebSocket} from "ws";
|
import type {Server, WebSocket} from "ws";
|
||||||
import {inviteWindow, createInviteWindow} from "./window";
|
import {inviteWindow, createInviteWindow} from "./window";
|
||||||
|
/*
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020-2022 Dawid Papiewski "SpacingBat3"
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
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.
|
||||||
|
*/
|
||||||
async function wsLog(message: string, ...args: unknown[]) {
|
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`. */
|
/** Generates an inclusive range (as `Array`) from `start` to `end`. */
|
||||||
|
|
130
src/tray.ts
|
@ -1,52 +1,105 @@
|
||||||
import { app, Menu, Tray } from "electron";
|
import * as fs from "fs";
|
||||||
import { mainWindow } from "./window";
|
import {app, Menu, Tray, nativeImage} from "electron";
|
||||||
import { getConfig, setWindowState } from "./utils";
|
import {mainWindow} from "./window";
|
||||||
|
import {getConfig, getConfigLocation, setWindowState, getDisplayVersion} from "./utils";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import { createSettingsWindow } from "./settings/main";
|
import {createSettingsWindow} from "./settings/main";
|
||||||
import { platform } from "process";
|
export let tray: any = null;
|
||||||
let tray: any = null;
|
|
||||||
let defaultIcon = "ac_plug_colored";
|
|
||||||
app.whenReady().then(async () => {
|
app.whenReady().then(async () => {
|
||||||
if (platform == "darwin") {
|
let finishedSetup = await getConfig("doneSetup");
|
||||||
defaultIcon = "macos"
|
var trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored";
|
||||||
|
let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
|
||||||
|
let trayVerIcon;
|
||||||
|
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});
|
||||||
}
|
}
|
||||||
if ((await getConfig("windowStyle")) == "discord") {
|
};
|
||||||
tray = new Tray(path.join(__dirname, "../", "/assets/dsc-tray.png"));
|
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
if (process.platform == "darwin" && trayPath.getSize().height > 22)
|
||||||
|
trayPath = trayPath.resize({height: 22});
|
||||||
|
|
||||||
|
if ((await getConfig("windowStyle")) == "basic") {
|
||||||
|
var clientName = (await getConfig("clientName")) ?? "ArmCord";
|
||||||
|
tray = new Tray(trayPath);
|
||||||
|
const contextMenu = function () {
|
||||||
|
if (finishedSetup == false) {
|
||||||
|
return Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
label: "Open ArmCord",
|
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 () {
|
click: function () {
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
label: `Quit ${clientName}`,
|
||||||
label: "Quit ArmCord",
|
|
||||||
click: function () {
|
click: function () {
|
||||||
let [width, height] = mainWindow.getSize()
|
let [width, height] = mainWindow.getSize();
|
||||||
setWindowState({
|
setWindowState({width: width, height: height, isMaximized: mainWindow.isMaximized()});
|
||||||
width: width,
|
|
||||||
height: height,
|
|
||||||
isMaximized: mainWindow.isMaximized()
|
|
||||||
})
|
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
tray.setToolTip("Discord");
|
tray.setToolTip(clientName);
|
||||||
tray.setContextMenu(contextMenu);
|
tray.setContextMenu(contextMenu);
|
||||||
} else {
|
} else {
|
||||||
var trayIcon = (await getConfig("trayIcon")) ?? defaultIcon;
|
var clientName = (await getConfig("clientName")) ?? "ArmCord";
|
||||||
tray = new Tray(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
|
tray = new Tray(trayPath);
|
||||||
|
if (finishedSetup == false) {
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
label: "ArmCord"
|
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} ` + getDisplayVersion(),
|
||||||
|
icon: trayVerIcon(),
|
||||||
|
enabled: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "separator"
|
type: "separator"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open ArmCord",
|
label: `Open ${clientName}`,
|
||||||
click: function () {
|
click: function () {
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
}
|
}
|
||||||
|
@ -56,32 +109,25 @@ 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 ArmCord",
|
|
||||||
click: function () {
|
click: function () {
|
||||||
let [width, height] = mainWindow.getSize()
|
|
||||||
setWindowState({
|
|
||||||
width: width,
|
|
||||||
height: height,
|
|
||||||
isMaximized: mainWindow.isMaximized()
|
|
||||||
})
|
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
tray.setToolTip("ArmCord " + app.getVersion());
|
|
||||||
tray.setContextMenu(contextMenu);
|
tray.setContextMenu(contextMenu);
|
||||||
}
|
}
|
||||||
|
} tray.setToolTip(clientName);
|
||||||
|
tray.on("click", function () {
|
||||||
|
mainWindow.show();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
122
src/utils.ts
|
@ -1,11 +1,9 @@
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { app, dialog } from "electron";
|
import {app, dialog} from "electron";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { defaultMaxListeners } from "events";
|
|
||||||
export var firstRun: boolean;
|
export var firstRun: boolean;
|
||||||
export var isSetup: boolean;
|
|
||||||
export var contentPath: string;
|
export var contentPath: string;
|
||||||
//utillity functions that are used all over the codebase or just too obscure to be put in the file used in
|
//utility functions that are used all over the codebase or just too obscure to be put in the file used in
|
||||||
export function addStyle(styleString: string) {
|
export function addStyle(styleString: string) {
|
||||||
const style = document.createElement("style");
|
const style = document.createElement("style");
|
||||||
style.textContent = styleString;
|
style.textContent = styleString;
|
||||||
|
@ -41,9 +39,13 @@ export function setup() {
|
||||||
armcordCSP: true,
|
armcordCSP: true,
|
||||||
minimizeToTray: true,
|
minimizeToTray: true,
|
||||||
automaticPatches: false,
|
automaticPatches: false,
|
||||||
|
alternativePaste: false,
|
||||||
mods: "cumcord",
|
mods: "cumcord",
|
||||||
performanceMode: "none",
|
performanceMode: "none",
|
||||||
|
skipSplash: false,
|
||||||
inviteWebsocket: true,
|
inviteWebsocket: true,
|
||||||
|
mobileMode: false,
|
||||||
|
trayIcon: "default",
|
||||||
doneSetup: false
|
doneSetup: false
|
||||||
};
|
};
|
||||||
setConfigBulk({
|
setConfigBulk({
|
||||||
|
@ -51,9 +53,23 @@ export function setup() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Get the version value from the "package.json" file
|
||||||
|
export var packageVersion = require("../package.json").version;
|
||||||
|
|
||||||
export function getVersion() {
|
export function getVersion() {
|
||||||
//to-do better way of doing this
|
return packageVersion;
|
||||||
return "3.0.7";
|
}
|
||||||
|
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
|
||||||
|
if ((app.getVersion() == packageVersion) == false) {
|
||||||
|
if ((app.getVersion() == process.versions.electron) == true) {
|
||||||
|
return `Dev Build (${packageVersion})`;
|
||||||
|
} else {
|
||||||
|
return `${packageVersion} [Modified]`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return packageVersion;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
export async function injectJS(inject: string) {
|
export async function injectJS(inject: string) {
|
||||||
const js = await (await fetch(`${inject}`)).text();
|
const js = await (await fetch(`${inject}`)).text();
|
||||||
|
@ -104,9 +120,7 @@ export async function injectElectronFlags() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export async function setLang(language: string) {
|
export async function setLang(language: string) {
|
||||||
const userDataPath = app.getPath("userData");
|
const langConfigFile = path.join(app.getPath("userData"), "/storage/") + "lang.json";
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
|
||||||
const langConfigFile = storagePath + "lang.json";
|
|
||||||
if (!fs.existsSync(langConfigFile)) {
|
if (!fs.existsSync(langConfigFile)) {
|
||||||
fs.writeFileSync(langConfigFile, "{}", "utf-8");
|
fs.writeFileSync(langConfigFile, "{}", "utf-8");
|
||||||
}
|
}
|
||||||
|
@ -127,8 +141,8 @@ export async function getLang(object: string) {
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
language = parsed["lang"];
|
language = parsed["lang"];
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("Language config file doesn't exist. Fallback to English.")
|
console.log("Language config file doesn't exist. Fallback to English.");
|
||||||
language = "en-US"
|
language = "en-US";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (language.length == 2) {
|
if (language.length == 2) {
|
||||||
|
@ -140,9 +154,35 @@ export async function getLang(object: string) {
|
||||||
}
|
}
|
||||||
let rawdata = fs.readFileSync(langPath, "utf-8");
|
let rawdata = fs.readFileSync(langPath, "utf-8");
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
|
if (parsed[object] == undefined) {
|
||||||
|
console.log(object + " is undefined in " + language);
|
||||||
|
langPath = path.join(__dirname, "../", "/assets/lang/en-US.json");
|
||||||
|
rawdata = fs.readFileSync(langPath, "utf-8");
|
||||||
|
parsed = JSON.parse(rawdata);
|
||||||
return parsed[object];
|
return parsed[object];
|
||||||
|
} else {
|
||||||
|
return parsed[object];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export async function getLangName() {
|
||||||
|
if (language == undefined) {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
return language;
|
||||||
}
|
}
|
||||||
|
|
||||||
//ArmCord Window State manager
|
//ArmCord Window State manager
|
||||||
export interface WindowState {
|
export interface WindowState {
|
||||||
width: number;
|
width: number;
|
||||||
|
@ -165,9 +205,8 @@ export async function getWindowState(object: string) {
|
||||||
const settingsFile = storagePath + "window.json";
|
const settingsFile = storagePath + "window.json";
|
||||||
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
||||||
let returndata = JSON.parse(rawdata);
|
let returndata = JSON.parse(rawdata);
|
||||||
console.log(object + ": " + returndata[object]);
|
console.log("[Window state manager] " + object + ": " + returndata[object]);
|
||||||
return returndata[object];
|
return returndata[object];
|
||||||
|
|
||||||
}
|
}
|
||||||
//ArmCord Settings/Storage manager
|
//ArmCord Settings/Storage manager
|
||||||
|
|
||||||
|
@ -177,54 +216,39 @@ export interface Settings {
|
||||||
armcordCSP: boolean;
|
armcordCSP: boolean;
|
||||||
minimizeToTray: boolean;
|
minimizeToTray: boolean;
|
||||||
automaticPatches: boolean;
|
automaticPatches: boolean;
|
||||||
|
alternativePaste: boolean;
|
||||||
mods: string;
|
mods: string;
|
||||||
|
mobileMode: boolean;
|
||||||
|
skipSplash: boolean;
|
||||||
performanceMode: string;
|
performanceMode: string;
|
||||||
inviteWebsocket: boolean;
|
inviteWebsocket: boolean;
|
||||||
|
trayIcon: string;
|
||||||
doneSetup: boolean;
|
doneSetup: boolean;
|
||||||
}
|
}
|
||||||
export async function getConfig(object: string) {
|
export function getConfigLocation() {
|
||||||
try {
|
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const settingsFile = storagePath + "settings.json";
|
return storagePath + "settings.json";
|
||||||
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
}
|
||||||
|
export async function getConfig(object: string) {
|
||||||
|
let rawdata = fs.readFileSync(getConfigLocation(), "utf-8");
|
||||||
let returndata = JSON.parse(rawdata);
|
let returndata = JSON.parse(rawdata);
|
||||||
console.log(object + ": " + returndata[object]);
|
console.log("[Config manager] " + object + ": " + returndata[object]);
|
||||||
return returndata[object];
|
return returndata[object];
|
||||||
} 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) {
|
export async function setConfig(object: string, toSet: any) {
|
||||||
try {
|
let rawdata = fs.readFileSync(getConfigLocation(), "utf-8");
|
||||||
const userDataPath = app.getPath("userData");
|
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
|
||||||
const settingsFile = storagePath + "settings.json";
|
|
||||||
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
parsed[object] = toSet;
|
parsed[object] = toSet;
|
||||||
let toSave = JSON.stringify(parsed);
|
let toSave = JSON.stringify(parsed);
|
||||||
fs.writeFileSync(settingsFile, toSave, "utf-8");
|
fs.writeFileSync(getConfigLocation(), toSave, "utf-8");
|
||||||
} catch (e) {
|
|
||||||
console.log("Config probably doesn't exist yet. Returning setup value.");
|
|
||||||
firstRun = true;
|
|
||||||
return "setup";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
export async function setConfigBulk(object: Settings) {
|
export async function setConfigBulk(object: Settings) {
|
||||||
try {
|
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const settingsFile = storagePath + "settings.json";
|
const settingsFile = storagePath + "settings.json";
|
||||||
let toSave = JSON.stringify(object);
|
let toSave = JSON.stringify(object);
|
||||||
fs.writeFileSync(settingsFile, toSave, "utf-8");
|
fs.writeFileSync(settingsFile, toSave, "utf-8");
|
||||||
} catch (e) {
|
|
||||||
console.log("Config probably doesn't exist yet. Returning setup value.");
|
|
||||||
firstRun = true;
|
|
||||||
return "setup";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
export async function checkIfConfigExists() {
|
export async function checkIfConfigExists() {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
|
@ -238,26 +262,14 @@ export async function checkIfConfigExists() {
|
||||||
}
|
}
|
||||||
console.log("First run of the ArmCord. Starting setup.");
|
console.log("First run of the ArmCord. Starting setup.");
|
||||||
setup();
|
setup();
|
||||||
isSetup = true;
|
firstRun = true;
|
||||||
contentPath = path.join(__dirname, "/content/setup.html");
|
|
||||||
if (!contentPath.includes("ts-out")) {
|
|
||||||
contentPath = path.join(__dirname, "/ts-out/content/setup.html");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if ((await getConfig("doneSetup")) == false) {
|
if ((await getConfig("doneSetup")) == false) {
|
||||||
console.log("First run of the ArmCord. Starting setup.");
|
console.log("First run of the ArmCord. Starting setup.");
|
||||||
setup();
|
setup();
|
||||||
isSetup = true;
|
firstRun = true;
|
||||||
contentPath = path.join(__dirname, "/content/setup.html");
|
|
||||||
if (!contentPath.includes("ts-out")) {
|
|
||||||
contentPath = path.join(__dirname, "/ts-out/content/setup.html");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
console.log("ArmCord has been run before. Skipping setup.");
|
console.log("ArmCord has been run before. Skipping setup.");
|
||||||
contentPath = path.join(__dirname, "/content/splash.html");
|
|
||||||
if (!contentPath.includes("ts-out")) {
|
|
||||||
contentPath = path.join(__dirname, "/ts-out/content/splash.html");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
181
src/window.ts
|
@ -2,36 +2,72 @@
|
||||||
// I had to add most of the window creation code here to split both into seperete functions
|
// 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
|
// 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.
|
// 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, nativeImage} from "electron";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { checkIfConfigIsBroken, firstRun, getConfig, contentPath, isSetup, 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 * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import startServer from "./socket";
|
import startServer from "./socket";
|
||||||
import contextMenu from "electron-context-menu";
|
import contextMenu from "electron-context-menu";
|
||||||
import os from "os";
|
import os from "os";
|
||||||
export var icon: string;
|
import {tray} from "./tray";
|
||||||
|
import {iconPath} from "./main";
|
||||||
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: true
|
showSearchWithGoogle: false,
|
||||||
|
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");
|
||||||
checkIfConfigIsBroken();
|
await checkIfConfigIsBroken();
|
||||||
registerIpc();
|
registerIpc();
|
||||||
|
if (await getConfig("mobileMode")) {
|
||||||
|
mainWindow.webContents.userAgent =
|
||||||
|
"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.149 Mobile Safari/537.36";
|
||||||
|
} else {
|
||||||
// A little sloppy but it works :p
|
// A little sloppy but it works :p
|
||||||
if (osType == 'Windows_NT') {
|
if (osType == "Windows_NT") {
|
||||||
osType = "Windows " + os.release().split('.')[0] + " (" + os.release() + ")";
|
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.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 }) => {
|
}
|
||||||
|
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}) => {
|
||||||
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);
|
||||||
} else {
|
} else {
|
||||||
|
@ -49,7 +85,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
checkboxChecked: false
|
checkboxChecked: false
|
||||||
};
|
};
|
||||||
|
|
||||||
dialog.showMessageBox(mainWindow, options).then(({ response, checkboxChecked }) => {
|
dialog.showMessageBox(mainWindow, options).then(({response, checkboxChecked}) => {
|
||||||
console.log(response, checkboxChecked);
|
console.log(response, checkboxChecked);
|
||||||
if (checkboxChecked) {
|
if (checkboxChecked) {
|
||||||
if (response == 0) {
|
if (response == 0) {
|
||||||
|
@ -66,38 +102,66 @@ async function doAfterDefiningTheWindow() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { action: "deny" };
|
return {action: "deny"};
|
||||||
});
|
});
|
||||||
mainWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
|
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({});
|
return callback({});
|
||||||
});
|
});
|
||||||
|
if ((await getConfig("trayIcon")) == "default") {
|
||||||
|
mainWindow.webContents.on("page-favicon-updated", async (event) => {
|
||||||
|
var faviconBase64 = await mainWindow.webContents.executeJavaScript(`
|
||||||
|
var getFavicon = function(){
|
||||||
|
var favicon = undefined;
|
||||||
|
var nodeList = document.getElementsByTagName("link");
|
||||||
|
for (var i = 0; i < nodeList.length; i++)
|
||||||
|
{
|
||||||
|
if((nodeList[i].getAttribute("rel") == "icon")||(nodeList[i].getAttribute("rel") == "shortcut icon"))
|
||||||
|
{
|
||||||
|
favicon = nodeList[i].getAttribute("href");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return favicon;
|
||||||
|
}
|
||||||
|
getFavicon()
|
||||||
|
`);
|
||||||
|
var buf = new Buffer(faviconBase64.replace(/^data:image\/\w+;base64,/, ""), "base64");
|
||||||
|
fs.writeFileSync(path.join(app.getPath("temp"), "/", "tray.png"), buf, "utf-8");
|
||||||
|
let trayPath = nativeImage.createFromPath(path.join(app.getPath("temp"), "/", "tray.png"));
|
||||||
|
if (process.platform === "darwin" && trayPath.getSize().height > 22)
|
||||||
|
trayPath = trayPath.resize({height: 22});
|
||||||
|
tray.setImage(trayPath);
|
||||||
|
});
|
||||||
|
}
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const themesFolder = userDataPath + "/themes/";
|
const themesFolder = userDataPath + "/themes/";
|
||||||
if (!fs.existsSync(themesFolder)) {
|
if (!fs.existsSync(themesFolder)) {
|
||||||
fs.mkdirSync(themesFolder);
|
fs.mkdirSync(themesFolder);
|
||||||
console.log("Created missing theme folder");
|
console.log("Created missing theme folder");
|
||||||
}
|
}
|
||||||
mainWindow.webContents.on('did-finish-load', () => {
|
mainWindow.webContents.on("did-finish-load", () => {
|
||||||
fs.readdirSync(themesFolder).forEach((file) => {
|
fs.readdirSync(themesFolder).forEach((file) => {
|
||||||
try {
|
try {
|
||||||
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
|
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
|
||||||
var themeFile = JSON.parse(manifest);
|
var themeFile = JSON.parse(manifest);
|
||||||
mainWindow.webContents.send("themeLoader", fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8"))
|
mainWindow.webContents.send(
|
||||||
|
"themeLoader",
|
||||||
|
fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8")
|
||||||
|
);
|
||||||
console.log(`%cLoaded ${themeFile.name} made by ${themeFile.author}`, "color:red");
|
console.log(`%cLoaded ${themeFile.name} made by ${themeFile.author}`, "color:red");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
await setMenu();
|
||||||
mainWindow.on("close", async (e) => {
|
mainWindow.on("close", async (e) => {
|
||||||
let [width, height] = mainWindow.getSize()
|
let [width, height] = mainWindow.getSize();
|
||||||
setWindowState({
|
await setWindowState({
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
isMaximized: mainWindow.isMaximized()
|
isMaximized: mainWindow.isMaximized()
|
||||||
})
|
});
|
||||||
if (await getConfig("minimizeToTray")) {
|
if (await getConfig("minimizeToTray")) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
mainWindow.hide();
|
mainWindow.hide();
|
||||||
|
@ -106,43 +170,51 @@ async function doAfterDefiningTheWindow() {
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mainWindow.on('maximize', () => {
|
|
||||||
mainWindow.webContents.executeJavaScript(`document.body.setAttribute("isMaximized", "");`)
|
mainWindow.on("focus", () => {
|
||||||
})
|
mainWindow.webContents.executeJavaScript(`document.body.removeAttribute("unFocused");`);
|
||||||
mainWindow.on('unmaximize', () => {
|
});
|
||||||
mainWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`)
|
mainWindow.on("blur", () => {
|
||||||
})
|
mainWindow.webContents.executeJavaScript(`document.body.setAttribute("unFocused", "");`);
|
||||||
|
});
|
||||||
|
|
||||||
|
mainWindow.on("maximize", () => {
|
||||||
|
mainWindow.webContents.executeJavaScript(`document.body.setAttribute("isMaximized", "");`);
|
||||||
|
});
|
||||||
|
mainWindow.on("unmaximize", () => {
|
||||||
|
mainWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`);
|
||||||
|
});
|
||||||
console.log(contentPath);
|
console.log(contentPath);
|
||||||
if ((await getConfig("inviteWebsocket")) == true) {
|
if ((await getConfig("inviteWebsocket")) == true) {
|
||||||
startServer();
|
await startServer();
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
mainWindow.loadFile(contentPath);
|
|
||||||
if (isSetup) {
|
|
||||||
await setLang(Intl.DateTimeFormat().resolvedOptions().locale)
|
|
||||||
mainWindow.setSize(390, 470);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.log(
|
|
||||||
"Major error detected while starting up. User is most likely on Windows platform. Fallback to alternative startup."
|
|
||||||
);
|
|
||||||
console.log(process.platform);
|
|
||||||
if (process.platform === "win32") {
|
|
||||||
if (firstRun) {
|
if (firstRun) {
|
||||||
await setLang(Intl.DateTimeFormat().resolvedOptions().locale)
|
await setLang(Intl.DateTimeFormat().resolvedOptions().locale);
|
||||||
mainWindow.setSize(390, 470);
|
mainWindow.setSize(390, 470);
|
||||||
mainWindow.loadURL(`file://${__dirname}/content/setup.html`);
|
await mainWindow.loadFile(path.join(__dirname, "/content/setup.html"));
|
||||||
} else {
|
} else {
|
||||||
mainWindow.loadURL(`file://${__dirname}/content/splash.html`);
|
if ((await getConfig("skipSplash")) == true) {
|
||||||
|
switch (await getConfig("channel")) {
|
||||||
|
case "stable":
|
||||||
|
await mainWindow.loadURL("https://discord.com/app");
|
||||||
|
break;
|
||||||
|
case "canary":
|
||||||
|
await mainWindow.loadURL("https://canary.discord.com/app");
|
||||||
|
break;
|
||||||
|
case "ptb":
|
||||||
|
await mainWindow.loadURL("https://ptb.discord.com/app");
|
||||||
|
break;
|
||||||
|
case "hummus":
|
||||||
|
await mainWindow.loadURL("https://hummus.sys42.net/");
|
||||||
|
break;
|
||||||
|
case undefined:
|
||||||
|
await mainWindow.loadURL("https://discord.com/app");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
await mainWindow.loadURL("https://discord.com/app");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (firstRun) {
|
await mainWindow.loadFile(path.join(__dirname, "/content/splash.html"));
|
||||||
await setLang(Intl.DateTimeFormat().resolvedOptions().locale)
|
|
||||||
mainWindow.setSize(390, 470);
|
|
||||||
mainWindow.loadURL(`file://${__dirname}/ts-out/content/setup.html`);
|
|
||||||
} else {
|
|
||||||
mainWindow.loadURL(`file://${__dirname}/ts-out/content/splash.html`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,10 +224,11 @@ export function createCustomWindow() {
|
||||||
height: 350,
|
height: 350,
|
||||||
title: "ArmCord",
|
title: "ArmCord",
|
||||||
darkTheme: true,
|
darkTheme: true,
|
||||||
icon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png"),
|
icon: iconPath,
|
||||||
frame: false,
|
frame: false,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
|
sandbox: false,
|
||||||
preload: path.join(__dirname, "preload/preload.js"),
|
preload: path.join(__dirname, "preload/preload.js"),
|
||||||
spellcheck: true
|
spellcheck: true
|
||||||
}
|
}
|
||||||
|
@ -168,10 +241,11 @@ export function createNativeWindow() {
|
||||||
height: 350,
|
height: 350,
|
||||||
title: "ArmCord",
|
title: "ArmCord",
|
||||||
darkTheme: true,
|
darkTheme: true,
|
||||||
icon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png"),
|
icon: iconPath,
|
||||||
frame: true,
|
frame: true,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
|
sandbox: false,
|
||||||
preload: path.join(__dirname, "preload/preload.js"),
|
preload: path.join(__dirname, "preload/preload.js"),
|
||||||
spellcheck: true
|
spellcheck: true
|
||||||
}
|
}
|
||||||
|
@ -185,10 +259,11 @@ export function createInviteWindow() {
|
||||||
height: 600,
|
height: 600,
|
||||||
title: "ArmCord Invite Manager",
|
title: "ArmCord Invite Manager",
|
||||||
darkTheme: true,
|
darkTheme: true,
|
||||||
icon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png"),
|
icon: iconPath,
|
||||||
frame: true,
|
frame: true,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
|
sandbox: false,
|
||||||
spellcheck: true
|
spellcheck: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|