Compare commits
55 Commits
master
...
offline-mo
Author | SHA1 | Date | |
---|---|---|---|
3ae025e288 | |||
a3b5f2dd53 | |||
2fdd8410c7 | |||
7505a602b6 | |||
265129fd84 | |||
088ec70928 | |||
588801ea06 | |||
|
e401608c33 | ||
|
6aaeeff9a4 | ||
|
9cca37ca8a | ||
|
03dac9ed6d | ||
|
eb683f89ec | ||
|
ae0e9e227d | ||
|
dc15bbfde8 | ||
|
0d23f5c45b | ||
|
fc4823a01f | ||
f39b26a4ff | |||
7dcbc4c907 | |||
f768ce99e7 | |||
4089c9a47c | |||
9e078df32a | |||
494b221638 | |||
0795219071 | |||
346704ad1d | |||
c41402c525 | |||
fe5590287e | |||
5c373ca66c | |||
3e8f52a200 | |||
c1d8dbed47 | |||
f2840be1a6 | |||
496841a776 | |||
80e3c1cc6a | |||
34bdf62bbd | |||
a16b8a3643 | |||
58c7ab1865 | |||
aca9136137 | |||
4f82e5cb7f | |||
309873c959 | |||
b6a53e5e05 | |||
54f10a0c74 | |||
faed705340 | |||
2f38081026 | |||
7f11f5b247 | |||
291f5399b7 | |||
291a571b22 | |||
f813f9d675 | |||
f2a15f747f | |||
906b3942a7 | |||
ee3c7c5147 | |||
b43242db4a | |||
fcb7f22965 | |||
b5327c71fc | |||
|
95eebc18a7 | ||
|
d03ff90f78 | ||
30e635a3b9 |
2
.github/workflows/build.yml
vendored
@ -20,7 +20,7 @@ jobs:
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
node-version: 20
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
|
9
.idea/SkirdaElectronLauncher.iml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="Go" enabled="true" />
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
15
.idea/codeStyles/Project.xml
generated
Normal file
@ -0,0 +1,15 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<option name="LINE_SEPARATOR" value=" " />
|
||||
<JSCodeStyleSettings version="0">
|
||||
<option name="USE_SEMICOLON_AFTER_STATEMENT" value="false" />
|
||||
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
||||
<option name="USE_DOUBLE_QUOTES" value="false" />
|
||||
<option name="FORCE_QUOTE_STYlE" value="true" />
|
||||
</JSCodeStyleSettings>
|
||||
<codeStyleSettings language="JavaScript">
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
||||
<option name="ALIGN_MULTILINE_FOR" value="false" />
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</state>
|
||||
</component>
|
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
</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/SkirdaElectronLauncher.iml" filepath="$PROJECT_DIR$/.idea/SkirdaElectronLauncher.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="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
93
.idea/workspace.xml
generated
Normal file
@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="ALL" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="efee9cb0-966d-4623-845a-f3b0398ae3ab" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/assets/lang/en_US.toml" beforeDir="false" afterPath="$PROJECT_DIR$/app/assets/lang/en_US.toml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/assets/lang/ru_RU.toml" beforeDir="false" afterPath="$PROJECT_DIR$/app/assets/lang/ru_RU.toml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/loginSkirda.ejs" beforeDir="false" afterPath="$PROJECT_DIR$/app/loginSkirda.ejs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/settings.ejs" beforeDir="false" afterPath="$PROJECT_DIR$/app/settings.ejs" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="FileTemplateManagerImpl">
|
||||
<option name="RECENT_TEMPLATES">
|
||||
<list>
|
||||
<option value="JavaScript File" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="GOROOT" url="file:///usr/lib/go" />
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"customColor": "",
|
||||
"associatedIndex": 6
|
||||
}</component>
|
||||
<component name="ProjectId" id="2s9MOcrLwV3Eo1Om9BlW30GzkjW" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.go.formatter.settings.were.checked": "true",
|
||||
"RunOnceActivity.go.migrated.go.modules.settings": "true",
|
||||
"RunOnceActivity.go.modules.go.list.on.any.changes.was.set": "true",
|
||||
"git-widget-placeholder": "offline-mode",
|
||||
"go.import.settings.migrated": "true",
|
||||
"go.sdk.automatically.set": "true",
|
||||
"last_opened_file_path": "/home/dart/repo/skirda/yggdrasil-server",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"npm.start.executor": "Debug",
|
||||
"ts.external.directory.path": "/opt/goland/plugins/javascript-plugin/jsLanguageServicesImpl/external"
|
||||
}
|
||||
}</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="$PROJECT_DIR$/app" />
|
||||
</key>
|
||||
<key name="MoveFile.RECENT_KEYS">
|
||||
<recent name="$PROJECT_DIR$/app/assets/js/scripts/skirda/auth" />
|
||||
<recent name="$PROJECT_DIR$/app/assets/js/scripts" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager">
|
||||
<configuration name="start" type="js.build_tools.npm" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="start" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-gosdk-d297c17c1fbd-85c80fddc9a6-org.jetbrains.plugins.go.sharedIndexes.bundled-GO-243.23654.119" />
|
||||
<option value="bundled-js-predefined-d6986cc7102b-822845ee3bb5-JavaScript-GO-243.23654.119" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
<component name="VgoProject">
|
||||
<settings-migrated>true</settings-migrated>
|
||||
</component>
|
||||
</project>
|
BIN
Callback/fonts/Manrope-Light.ttf
Normal file
BIN
Callback/fonts/Manrope-Medium.ttf
Normal file
184
Callback/index.html
Normal file
@ -0,0 +1,184 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title></title>
|
||||
<style type="text/css">
|
||||
@font-face {
|
||||
font-family: 'Manrope-Light';
|
||||
src: url('fonts/Manrope-Light.ttf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Avenir Medium';
|
||||
src: url('fonts/Manrope-Medium.ttf');
|
||||
}
|
||||
|
||||
body {
|
||||
background-image: url(../../skirda/skirdaGoBackend/authskirda/templates/callback/img/bg.png);
|
||||
background-repeat:no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center center;
|
||||
background-attachment: fixed;
|
||||
font-family: "Manrope-Light";
|
||||
}
|
||||
|
||||
body, html, div {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#main {
|
||||
height: 100%;
|
||||
background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0) 100%);
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#settingsAboutCurrentContainer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: rgba(0, 0, 0, 0.25);
|
||||
border: 1px solid rgba(126, 126, 126, 0.57);
|
||||
border-radius: 3px;
|
||||
width: 75%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#settingsAboutCurrentContent {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
/* About header elements. */
|
||||
#settingsAboutCurrentHeadline {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-bottom: 5px;
|
||||
border-bottom: 1px solid rgba(126, 126, 126, 0.57);
|
||||
}
|
||||
#settingsAboutLogo {
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
padding: 5px;
|
||||
}
|
||||
#settingsAboutTitle {
|
||||
font-size: 23px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
/* Current version container. */
|
||||
#settingsAboutCurrentVersion {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-top: 10px;
|
||||
text-align: center;
|
||||
width: 95%;
|
||||
padding: 2rem 0 2rem 0;
|
||||
}
|
||||
|
||||
.Centered {
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
/* width: 100%; */
|
||||
}
|
||||
|
||||
.Centered > div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationWindow {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: rgba(0, 0, 0, 0.4);
|
||||
border: 1px solid rgb(83 83 83 / 60%);
|
||||
border-radius: 3px;
|
||||
margin-bottom: 20px;
|
||||
width: 22rem;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationNote {
|
||||
font-size: 10px;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationRetryButton {
|
||||
margin-bottom: 0.7rem;
|
||||
color: rgb(249 249 249);
|
||||
border: 1px solid rgb(209 209 209);
|
||||
border-radius: 4px;
|
||||
transition: 0.25s ease;
|
||||
font-size: 15px;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
background: none;
|
||||
padding: 0.4rem 1rem 0.4rem 1rem;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationRetryButton:hover {
|
||||
background: rgb(0 0 0 / 91%);
|
||||
border: 1px solid rgb(83 83 83 / 42%);
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationRetryButton:active {
|
||||
background: rgb(0 0 0 / 91%);
|
||||
border: 1px solid rgb(83 83 83 / 42%);
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationError {
|
||||
font-size: 15px;
|
||||
color: #bfbfbf;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="main">
|
||||
<div id="loginSkirdaDiscordContainer" class="Centered" >
|
||||
|
||||
<!--Окно открытия браузера (ожидание ответа)-->
|
||||
<div id="loginSkirdaAuthorizationWindow" style="display: none;">
|
||||
<div id="settingsAboutCurrentContent" class="Centered">
|
||||
<div id="settingsAboutCurrentHeadline">
|
||||
<img id="settingsAboutLogo" src="../../skirda/skirdaGoBackend/authskirda/templates/callback/img/Logo.png">
|
||||
<span id="settingsAboutTitle">Авторизация через Discord</span>
|
||||
</div>
|
||||
<div id="settingsAboutCurrentVersion">
|
||||
<span>Успешная авторизация! Для начала игры вам необходимо вернутся в лаунчер.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer-label">
|
||||
<span id="loginSkirdaAuthorizationNote">Skirda Launcher</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--Ошибка-->
|
||||
<div id="loginSkirdaAuthorizationWindow" >
|
||||
<div id="settingsAboutCurrentContent" class="Centered">
|
||||
<div id="settingsAboutCurrentHeadline">
|
||||
<img id="settingsAboutLogo" src="../../skirda/skirdaGoBackend/authskirda/templates/callback/img/Logo.png">
|
||||
<span id="settingsAboutTitle">Авторизация через Discord</span>
|
||||
</div>
|
||||
<div id="settingsAboutCurrentVersion" class="Centered">
|
||||
<span>Ошибка авторизации!</span>
|
||||
<span id="loginSkirdaAuthorizationError">(Eror Pizda Poezdu)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer-label">
|
||||
<span id="loginSkirdaAuthorizationNote">Skirda Launcher</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017-2022 Daniel D. Scalzi
|
||||
Copyright (c) 2017-2024 Daniel D. Scalzi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -84,7 +84,7 @@ This section details the setup of a basic developmentment environment.
|
||||
|
||||
**System Requirements**
|
||||
|
||||
* [Node.js][nodejs] v18
|
||||
* [Node.js][nodejs] v20
|
||||
|
||||
---
|
||||
|
||||
|
@ -33,6 +33,8 @@
|
||||
<%- include('login') %>
|
||||
<%- include('waiting') %>
|
||||
<%- include('loginOptions') %>
|
||||
<%- include('loginOffline') %>
|
||||
<%- include('loginSkirda') %>
|
||||
<%- include('settings') %>
|
||||
<%- include('landing') %>
|
||||
</div>
|
||||
|
@ -9,12 +9,12 @@
|
||||
|
||||
@font-face {
|
||||
font-family: 'Avenir Book';
|
||||
src: url('../fonts/Avenir-Book.ttf');
|
||||
src: url('../fonts/Manrope-Light.ttf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Avenir Medium';
|
||||
src: url('../fonts/Avenir-Medium.ttf');
|
||||
src: url('../fonts/Manrope-Medium.ttf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@ -2208,7 +2208,7 @@ input:checked + .toggleSwitchSlider:before {
|
||||
}
|
||||
|
||||
/* About information links. */
|
||||
#settingsAboutButtons {
|
||||
#footer-label {
|
||||
display: flex;
|
||||
padding: 0px 15px;
|
||||
margin-bottom: 5px;
|
||||
@ -3965,4 +3965,140 @@ input:checked + .toggleSwitchSlider:before {
|
||||
/* Class which is applied when the spinner image is spinning. */
|
||||
.rotating {
|
||||
animation: rotating 10s linear infinite;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* *
|
||||
* Custom patches *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/* iframe patch for full size window. */
|
||||
#iframecontainer {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#dynmapiframe {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
#mapsvg {
|
||||
-webkit-filter: invert(100%); /* safari 6.0 - 9.0 */
|
||||
filter: invert(100%);
|
||||
transition: 0.25s ease;
|
||||
}
|
||||
|
||||
/* Map icon hover effect */
|
||||
#newsButton:hover #mapsvg,
|
||||
#newsButton:focus #mapsvg {
|
||||
filter:invert(100%) drop-shadow(0 0 0.75rem white);
|
||||
}
|
||||
|
||||
/* Return from map button */
|
||||
.FloatingButtonContainer {
|
||||
position: absolute;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
left: 22em;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Return from map button style */
|
||||
#dynmapDoneButton {
|
||||
background-color: #222222;
|
||||
width: 100px;
|
||||
border-radius: 0px 0px 10px 10px;
|
||||
border-color: #333333;
|
||||
border: solid;
|
||||
border-width: 0px 1px 1px 1px;
|
||||
}
|
||||
|
||||
#dynmapDoneButtonText {
|
||||
color: white;
|
||||
font-weight: 900;
|
||||
letter-spacing: 2px;
|
||||
text-shadow: 0px 0px 0px #bebcbb;
|
||||
font-size: 11px;
|
||||
line-height: 30px;
|
||||
transition: 0.25s ease;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* *
|
||||
* Skirda Discord Authorization *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
.Centered {
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
/* width: 100%; */
|
||||
}
|
||||
|
||||
.Centered > div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationWindow {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: rgba(0, 0, 0, 0.4);
|
||||
border: 1px solid rgb(83 83 83 / 60%);
|
||||
border-radius: 3px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#settingsAboutCurrentVersion {
|
||||
text-align: center;
|
||||
width: 50%;
|
||||
padding: 2rem 0 2rem 0;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationNote {
|
||||
font-size: 10px;
|
||||
color: grey;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationRetryButton {
|
||||
margin-bottom: 0.7rem;
|
||||
color: rgb(249 249 249);
|
||||
border: 1px solid rgb(209 209 209);
|
||||
border-radius: 4px;
|
||||
transition: 0.25s ease;
|
||||
font-size: 15px;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
background: none;
|
||||
padding: 0.4rem 1rem 0.4rem 1rem;
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationRetryButton:hover {
|
||||
background: rgb(0 0 0 / 91%);
|
||||
border: 1px solid rgb(83 83 83 / 42%);
|
||||
}
|
||||
|
||||
#loginSkirdaAuthorizationRetryButton:active {
|
||||
background: rgb(0 0 0 / 91%);
|
||||
border: 1px solid rgb(83 83 83 / 42%);
|
||||
}
|
||||
|
||||
#loginOptionSkirdaFIDO:hover {
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
#loginOptionSkirdaFIDO:focus {
|
||||
text-shadow: none;
|
||||
}
|
BIN
app/assets/fonts/Manrope-Light.ttf
Normal file
BIN
app/assets/fonts/Manrope-Medium.ttf
Normal file
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 206 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 3.2 MiB |
Before Width: | Height: | Size: 502 KiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 3.7 MiB |
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 245 KiB |
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 565 KiB |
Before Width: | Height: | Size: 2.6 MiB After Width: | Height: | Size: 365 KiB |
Before Width: | Height: | Size: 5.0 MiB After Width: | Height: | Size: 92 KiB |
BIN
app/assets/images/icons/skirda.png
Normal file
After Width: | Height: | Size: 193 KiB |
9
app/assets/images/icons/telegram.svg
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 240.1 240.1">
|
||||
<linearGradient id="Oval_1_" gradientUnits="userSpaceOnUse" x1="-838.041" y1="660.581" x2="-838.041" y2="660.3427" gradientTransform="matrix(1000 0 0 -1000 838161 660581)">
|
||||
<stop offset="0" style="stop-color:#2AABEE"/>
|
||||
<stop offset="1" style="stop-color:#229ED9"/>
|
||||
</linearGradient>
|
||||
<circle fill-rule="evenodd" clip-rule="evenodd" fill="url(#Oval_1_)" cx="120.1" cy="120.1" r="120.1"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M54.3,118.8c35-15.2,58.3-25.3,70-30.2 c33.3-13.9,40.3-16.3,44.8-16.4c1,0,3.2,0.2,4.7,1.4c1.2,1,1.5,2.3,1.7,3.3s0.4,3.1,0.2,4.7c-1.8,19-9.6,65.1-13.6,86.3 c-1.7,9-5,12-8.2,12.3c-7,0.6-12.3-4.6-19-9c-10.6-6.9-16.5-11.2-26.8-18c-11.9-7.8-4.2-12.1,2.6-19.1c1.8-1.8,32.5-29.8,33.1-32.3 c0.1-0.3,0.1-1.5-0.6-2.1c-0.7-0.6-1.7-0.4-2.5-0.2c-1.1,0.2-17.9,11.4-50.6,33.5c-4.8,3.3-9.1,4.9-13,4.8 c-4.3-0.1-12.5-2.4-18.7-4.4c-7.5-2.4-13.5-3.7-13-7.9C45.7,123.3,48.7,121.1,54.3,118.8z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
@ -12,12 +12,122 @@
|
||||
const ConfigManager = require('./configmanager')
|
||||
const { LoggerUtil } = require('helios-core')
|
||||
const { RestResponseStatus } = require('helios-core/common')
|
||||
const { MojangRestAPI, mojangErrorDisplayable, MojangErrorCode } = require('helios-core/mojang')
|
||||
const { MicrosoftAuth, microsoftErrorDisplayable, MicrosoftErrorCode } = require('helios-core/microsoft')
|
||||
const { MojangRestAPI, MojangErrorCode } = require('helios-core/mojang')
|
||||
const { MicrosoftAuth, MicrosoftErrorCode } = require('helios-core/microsoft')
|
||||
const { AZURE_CLIENT_ID } = require('./ipcconstants')
|
||||
const Lang = require('./langloader')
|
||||
|
||||
const log = LoggerUtil.getLogger('AuthManager')
|
||||
|
||||
// Error messages
|
||||
|
||||
function microsoftErrorDisplayable(errorCode) {
|
||||
switch (errorCode) {
|
||||
case MicrosoftErrorCode.NO_PROFILE:
|
||||
return {
|
||||
title: Lang.queryJS('auth.microsoft.error.noProfileTitle'),
|
||||
desc: Lang.queryJS('auth.microsoft.error.noProfileDesc')
|
||||
}
|
||||
case MicrosoftErrorCode.NO_XBOX_ACCOUNT:
|
||||
return {
|
||||
title: Lang.queryJS('auth.microsoft.error.noXboxAccountTitle'),
|
||||
desc: Lang.queryJS('auth.microsoft.error.noXboxAccountDesc')
|
||||
}
|
||||
case MicrosoftErrorCode.XBL_BANNED:
|
||||
return {
|
||||
title: Lang.queryJS('auth.microsoft.error.xblBannedTitle'),
|
||||
desc: Lang.queryJS('auth.microsoft.error.xblBannedDesc')
|
||||
}
|
||||
case MicrosoftErrorCode.UNDER_18:
|
||||
return {
|
||||
title: Lang.queryJS('auth.microsoft.error.under18Title'),
|
||||
desc: Lang.queryJS('auth.microsoft.error.under18Desc')
|
||||
}
|
||||
case MicrosoftErrorCode.UNKNOWN:
|
||||
return {
|
||||
title: Lang.queryJS('auth.microsoft.error.unknownTitle'),
|
||||
desc: Lang.queryJS('auth.microsoft.error.unknownDesc')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function mojangErrorDisplayable(errorCode) {
|
||||
switch(errorCode) {
|
||||
case MojangErrorCode.ERROR_METHOD_NOT_ALLOWED:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.methodNotAllowedTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.methodNotAllowedDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_NOT_FOUND:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.notFoundTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.notFoundDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_USER_MIGRATED:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.accountMigratedTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.accountMigratedDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_INVALID_CREDENTIALS:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.invalidCredentialsTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.invalidCredentialsDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_RATELIMIT:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.tooManyAttemptsTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.tooManyAttemptsDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_INVALID_TOKEN:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.invalidTokenTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.invalidTokenDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_ACCESS_TOKEN_HAS_PROFILE:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.tokenHasProfileTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.tokenHasProfileDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_CREDENTIALS_MISSING:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.credentialsMissingTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.credentialsMissingDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_INVALID_SALT_VERSION:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.invalidSaltVersionTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.invalidSaltVersionDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_UNSUPPORTED_MEDIA_TYPE:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.unsupportedMediaTypeTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.unsupportedMediaTypeDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_GONE:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.accountGoneTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.accountGoneDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_UNREACHABLE:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.unreachableTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.unreachableDesc')
|
||||
}
|
||||
case MojangErrorCode.ERROR_NOT_PAID:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.gameNotPurchasedTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.gameNotPurchasedDesc')
|
||||
}
|
||||
case MojangErrorCode.UNKNOWN:
|
||||
return {
|
||||
title: Lang.queryJS('auth.mojang.error.unknownErrorTitle'),
|
||||
desc: Lang.queryJS('auth.mojang.error.unknownErrorDesc')
|
||||
}
|
||||
default:
|
||||
throw new Error(`Unknown error code: ${errorCode}`)
|
||||
}
|
||||
}
|
||||
|
||||
// Functions
|
||||
|
||||
/**
|
||||
@ -29,14 +139,20 @@ const log = LoggerUtil.getLogger('AuthManager')
|
||||
* @param {string} password The account password.
|
||||
* @returns {Promise.<Object>} Promise which resolves the resolved authenticated account object.
|
||||
*/
|
||||
exports.addMojangAccount = async function(username, password) {
|
||||
exports.addMojangAccount = async function(username, password){
|
||||
try {
|
||||
const response = await MojangRestAPI.authenticate(username, password, ConfigManager.getClientToken())
|
||||
console.log(response)
|
||||
if(response.responseStatus === RestResponseStatus.SUCCESS) {
|
||||
|
||||
const session = response.data
|
||||
console.log(session)
|
||||
session.selectedProfile = {
|
||||
id:'12039109283',
|
||||
acessToken:'asdasdas',
|
||||
clientToken: 'asdasldkjalskdj',
|
||||
}
|
||||
if(session.selectedProfile != null){
|
||||
// console.log("here")
|
||||
const ret = ConfigManager.addMojangAuthAccount(session.selectedProfile.id, session.accessToken, username, session.selectedProfile.name)
|
||||
if(ConfigManager.getClientToken() == null){
|
||||
ConfigManager.setClientToken(session.clientToken)
|
||||
@ -57,6 +173,23 @@ exports.addMojangAccount = async function(username, password) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param {string} uuid Minecraft profile uuid
|
||||
* @param {string} accessToken
|
||||
* @param {string} username
|
||||
* @param {string} skirdaToken
|
||||
* */
|
||||
exports.addSkirdaAccount = async function(uuid, accessToken, username, skirdaToken){
|
||||
const ret = ConfigManager.addSkirdaAccount(uuid, accessToken, username, skirdaToken)
|
||||
ConfigManager.save()
|
||||
return ret
|
||||
}
|
||||
|
||||
exports.addOfflineAccount = async function(usernameOffline){
|
||||
ConfigManager.addOfflineAccount(usernameOffline)
|
||||
}
|
||||
|
||||
const AUTH_MODE = { FULL: 0, MS_REFRESH: 1, MC_REFRESH: 2 }
|
||||
|
||||
/**
|
||||
@ -72,7 +205,8 @@ const AUTH_MODE = { FULL: 0, MS_REFRESH: 1, MC_REFRESH: 2 }
|
||||
*/
|
||||
async function fullMicrosoftAuthFlow(entryCode, authMode) {
|
||||
try {
|
||||
|
||||
console.error('try auth from ms')
|
||||
return Promise.reject(microsoftErrorDisplayable(MicrosoftErrorCode.UNKNOWN))
|
||||
let accessTokenRaw
|
||||
let accessToken
|
||||
if(authMode !== AUTH_MODE.MC_REFRESH) {
|
||||
@ -199,6 +333,42 @@ exports.removeMicrosoftAccount = async function(uuid){
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a Offline account. It is expected that the caller will invoke the OAuth logout
|
||||
* through the ipc renderer.
|
||||
*
|
||||
* @param {string} uuid The UUID of the account to be removed.
|
||||
* @returns {Promise.<void>} Promise which resolves to void when the action is complete.
|
||||
*/
|
||||
exports.removeOfflineAccount = async function(uuid){
|
||||
try {
|
||||
ConfigManager.removeAuthAccount(uuid)
|
||||
ConfigManager.save()
|
||||
return Promise.resolve()
|
||||
} catch (err){
|
||||
log.error('Error while removing account', err)
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a Skirda account. It is expected that the caller will invoke the OAuth logout
|
||||
* through the ipc renderer.
|
||||
*
|
||||
* @param {string} uuid The UUID of the account to be removed.
|
||||
* @returns {Promise.<void>} Promise which resolves to void when the action is complete.
|
||||
*/
|
||||
exports.removeSkirdaAccount = async function(uuid){
|
||||
try {
|
||||
ConfigManager.removeAuthAccount(uuid)
|
||||
ConfigManager.save()
|
||||
return Promise.resolve()
|
||||
} catch (err){
|
||||
log.error('Error while removing account', err)
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the selected account with Mojang's authserver. If the account is not valid,
|
||||
* we will attempt to refresh the access token and update that value. If that fails, a
|
||||
@ -231,7 +401,19 @@ async function validateSelectedMojangAccount(){
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the selected account with Skirda's authserver. If the account is not valid,
|
||||
* we will attempt to refresh the access token and update that value. If that fails, a
|
||||
* new login will be required.
|
||||
*
|
||||
* @returns {Promise.<boolean>} Promise which resolves to true if the access token is valid,
|
||||
* otherwise false.
|
||||
*/
|
||||
async function validateSelectedSkirdaAccount(){
|
||||
const current = ConfigManager.getSelectedAccount()
|
||||
return await SkirdaAuth.YggRefresh(current.accessToken)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -306,10 +488,14 @@ async function validateSelectedMicrosoftAccount(){
|
||||
exports.validateSelected = async function(){
|
||||
const current = ConfigManager.getSelectedAccount()
|
||||
|
||||
if(current.type === 'microsoft') {
|
||||
return await validateSelectedMicrosoftAccount()
|
||||
} else {
|
||||
return await validateSelectedMojangAccount()
|
||||
switch (current.type) {
|
||||
case 'mojang':
|
||||
return await validateSelectedMojangAccount()
|
||||
// break
|
||||
case 'microsoft':
|
||||
return await validateSelectedMicrosoftAccount()
|
||||
// break
|
||||
case 'skirda':
|
||||
return await validateSelectedSkirdaAccount()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ const logger = LoggerUtil.getLogger('ConfigManager')
|
||||
|
||||
const sysRoot = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME)
|
||||
|
||||
const dataPath = path.join(sysRoot, '.helioslauncher')
|
||||
const dataPath = path.join(sysRoot, '.skirdalauncher')
|
||||
|
||||
const launcherDir = require('@electron/remote').app.getPath('userData')
|
||||
|
||||
@ -349,6 +349,34 @@ exports.addMojangAuthAccount = function(uuid, accessToken, username, displayName
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
exports.addOfflineAccount = function(usernameOffline){
|
||||
console.log("pizda")
|
||||
fake_uuid = usernameOffline
|
||||
config.selectedAccount = fake_uuid
|
||||
accessToken = ""
|
||||
config.authenticationDatabase[fake_uuid] = {
|
||||
type: 'offline',
|
||||
accessToken,
|
||||
username: usernameOffline.trim(),
|
||||
uuid: fake_uuid.trim(),
|
||||
displayName: usernameOffline.trim()
|
||||
}
|
||||
return config.authenticationDatabase[fake_uuid]
|
||||
}
|
||||
|
||||
exports.addSkirdaAccount = function(uuid, accessToken, username, skirdaToken){
|
||||
config.selectedAccount = uuid
|
||||
config.authenticationDatabase[uuid] = {
|
||||
type: 'skirda',
|
||||
accessToken,
|
||||
username: username.trim(),
|
||||
uuid: uuid.trim(),
|
||||
displayName: username.trim(),
|
||||
skirdaJWT: skirdaToken.trim()
|
||||
}
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the tokens of an authenticated microsoft account.
|
||||
*
|
||||
|
@ -1,10 +1,18 @@
|
||||
const { DistributionAPI } = require('helios-core/common')
|
||||
|
||||
const {DistributionAPI} = require('helios-core/common')
|
||||
const ConfigManager = require('./configmanager')
|
||||
|
||||
// Old WesterosCraft url.
|
||||
// exports.REMOTE_DISTRO_URL = 'http://mc.westeroscraft.com/WesterosCraftLauncher/distribution.json'
|
||||
exports.REMOTE_DISTRO_URL = 'https://helios-files.geekcorner.eu.org/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'http://localhost:8090/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'https://helios-files.geekcorner.eu.org/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'https://skirda-minecraft-distribution.brzezinski.ru/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'https://helios-files.geekcorner.eu.org/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'http://192.168.88.10:8081/distribution/manifest'
|
||||
// exports.REMOTE_DISTRO_URL = 'http://skirda-nebula.brzezinski.ru/distribution/manifest'
|
||||
// exports.REMOTE_DISTRO_URL = 'http://skirda-nebula.brzezinski.ru/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'http://gregbrzezinski:8080/distribution/manifest'
|
||||
// exports.REMOTE_DISTRO_URL = 'http://localhost:8080/distribution/files/files/distribution.json'
|
||||
exports.REMOTE_DISTRO_URL = 'https://cdn.brzezinski.ru/nebula/distribution.json'
|
||||
|
||||
const api = new DistributionAPI(
|
||||
ConfigManager.getLauncherDirectory(),
|
||||
|
@ -36,7 +36,7 @@ exports.setupLanguage = function(){
|
||||
// Load Language Files
|
||||
exports.loadLanguage('en_US')
|
||||
// Uncomment this when translations are ready
|
||||
//exports.loadLanguage('xx_XX')
|
||||
exports.loadLanguage('ru_RU')
|
||||
|
||||
// Load Custom Language File for Launcher Customizer
|
||||
exports.loadLanguage('_custom')
|
||||
|
@ -144,6 +144,7 @@ document.getElementById('avatarOverlay').onclick = async e => {
|
||||
// Bind selected account
|
||||
function updateSelectedAccount(authUser){
|
||||
let username = Lang.queryJS('landing.selectedAccount.noAccountSelected')
|
||||
// console.log(authUser)
|
||||
if(authUser != null){
|
||||
if(authUser.displayName != null){
|
||||
username = authUser.displayName
|
||||
@ -245,7 +246,7 @@ const refreshServerStatus = async (fade = false) => {
|
||||
try {
|
||||
|
||||
const servStat = await getServerStatus(47, serv.hostname, serv.port)
|
||||
console.log(servStat)
|
||||
// console.log(servStat)
|
||||
pLabel = Lang.queryJS('landing.serverStatus.players')
|
||||
pVal = servStat.players.online + '/' + servStat.players.max
|
||||
|
||||
@ -712,12 +713,12 @@ document.getElementById('newsButton').onclick = () => {
|
||||
} else {
|
||||
$('#landingContainer *').attr('tabindex', '-1')
|
||||
$('#newsContainer, #newsContainer *, #lower, #lower #center *').removeAttr('tabindex')
|
||||
if(newsAlertShown){
|
||||
$('#newsButtonAlert').fadeOut(2000)
|
||||
newsAlertShown = false
|
||||
ConfigManager.setNewsCacheDismissed(true)
|
||||
ConfigManager.save()
|
||||
}
|
||||
// if(newsAlertShown){
|
||||
// $('#newsButtonAlert').fadeOut(2000)
|
||||
// newsAlertShown = false
|
||||
// ConfigManager.setNewsCacheDismissed(true)
|
||||
// ConfigManager.save()
|
||||
// }
|
||||
}
|
||||
slide_(!newsActive)
|
||||
newsActive = !newsActive
|
||||
@ -909,24 +910,24 @@ async function initNews(){
|
||||
* between articles. If you are on the landing page, the up arrow will
|
||||
* open the news UI.
|
||||
*/
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if(newsActive){
|
||||
if(e.key === 'ArrowRight' || e.key === 'ArrowLeft'){
|
||||
document.getElementById(e.key === 'ArrowRight' ? 'newsNavigateRight' : 'newsNavigateLeft').click()
|
||||
}
|
||||
// Interferes with scrolling an article using the down arrow.
|
||||
// Not sure of a straight forward solution at this point.
|
||||
// if(e.key === 'ArrowDown'){
|
||||
// document.getElementById('newsButton').click()
|
||||
// }
|
||||
} else {
|
||||
if(getCurrentView() === VIEWS.landing){
|
||||
if(e.key === 'ArrowUp'){
|
||||
document.getElementById('newsButton').click()
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
// document.addEventListener('keydown', (e) => {
|
||||
// if(newsActive){
|
||||
// if(e.key === 'ArrowRight' || e.key === 'ArrowLeft'){
|
||||
// document.getElementById(e.key === 'ArrowRight' ? 'newsNavigateRight' : 'newsNavigateLeft').click()
|
||||
// }
|
||||
// // Interferes with scrolling an article using the down arrow.
|
||||
// // Not sure of a straight forward solution at this point.
|
||||
// // if(e.key === 'ArrowDown'){
|
||||
// // document.getElementById('newsButton').click()
|
||||
// // }
|
||||
// } else {
|
||||
// if(getCurrentView() === VIEWS.landing){
|
||||
// if(e.key === 'ArrowUp'){
|
||||
// document.getElementById('newsButton').click()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
|
||||
/**
|
||||
* Display a news article on the UI.
|
||||
|
39
app/assets/js/scripts/loginOffline.js
Normal file
@ -0,0 +1,39 @@
|
||||
//const loggerOfflineLogin = LoggerUtil1('%c[LoginOffline]', 'color: #000668; font-weight: bold')
|
||||
|
||||
const loginOfflineButton = document.getElementById('loginOfflineButton')
|
||||
const loginOfflineCancelContainer = document.getElementById('loginOfflineCancelContainer')
|
||||
const loginOfflineCancelButton = document.getElementById('loginOfflineCancelButton')
|
||||
|
||||
function loginOfflineDisabled(v){
|
||||
if(loginOfflineButton.disabled !== v){
|
||||
loginOfflineButton.disabled = v
|
||||
}
|
||||
}
|
||||
|
||||
function formOfflineDisabled(v){
|
||||
loginOfflineDisabled(v)
|
||||
loginOfflineUsername.disabled = v
|
||||
}
|
||||
|
||||
|
||||
|
||||
loginOfflineButton.addEventListener('click', () => {
|
||||
formOfflineDisabled(true)
|
||||
AuthManager.addOfflineAccount(loginOfflineUsername.value).then((value) =>{
|
||||
switchView(VIEWS.loginOffline, VIEWS.landing, 500, 500)
|
||||
|
||||
})
|
||||
loginOfflineUsername = ''
|
||||
})
|
||||
|
||||
loginOfflineCancelButton.addEventListener('click', () => {
|
||||
if (Object.keys(ConfigManager.getAuthAccounts()).length === 0) {
|
||||
loginOfflineUsername.value = ''
|
||||
switchView(VIEWS.loginOffline, VIEWS.loginOptions, 500, 500)
|
||||
}
|
||||
else
|
||||
{
|
||||
loginOfflineUsername.value = ''
|
||||
switchView(VIEWS.loginOffline, VIEWS.landing, 500, 500)
|
||||
}
|
||||
})
|
@ -1,6 +1,12 @@
|
||||
const loginOptionsCancelContainer = document.getElementById('loginOptionCancelContainer')
|
||||
const loginOptionMicrosoft = document.getElementById('loginOptionMicrosoft')
|
||||
const loginOptionMojang = document.getElementById('loginOptionMojang')
|
||||
const loginOptionOffline = document.getElementById('loginOptionOffline')
|
||||
const loginOptionSkirdaAuth = document.getElementById('loginOptionSkirdaAuth')
|
||||
// const loginOptionSkirdaAuthStage1 = document.getElementById('loginOptionSkirdaStage1')
|
||||
// const loginOptionSkirdaAuthStage2 = document.getElementById('loginOptionSkirdaStage2')
|
||||
const loginOptionSkirdaDiskord = document.getElementById('loginOptionSkirdaDiscord')
|
||||
const loginOptionSkirdaTelegram = document.getElementById('loginOptionSkirdaTelegram')
|
||||
const loginOptionsCancelButton = document.getElementById('loginOptionCancelButton')
|
||||
|
||||
let loginOptionsCancellable = false
|
||||
@ -17,22 +23,107 @@ function loginOptionsCancelEnabled(val){
|
||||
$(loginOptionsCancelContainer).hide()
|
||||
}
|
||||
}
|
||||
//
|
||||
// loginOptionMicrosoft.onclick = (e) => {
|
||||
// switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
// ipcRenderer.send(
|
||||
// MSFT_OPCODE.OPEN_LOGIN,
|
||||
// loginOptionsViewOnLoginSuccess,
|
||||
// loginOptionsViewOnLoginCancel
|
||||
// )
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// loginOptionMojang.onclick = (e) => {
|
||||
// switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
||||
// loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
// loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
// loginCancelEnabled(true)
|
||||
// })
|
||||
// }
|
||||
//
|
||||
//
|
||||
// loginOptionOffline.onclick = (e) => {
|
||||
// switchView(getCurrentView(), VIEWS.loginOffline, 500, 500, () => {
|
||||
// loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
// loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
// loginCancelEnabled(true)
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// loginOptionSkirdaDiskord.onclick = (e) => {
|
||||
// InitSkirdaDiscordLogin()
|
||||
// switchView(getCurrentView(), VIEWS.loginSkirdaDiscord, 500, 500, () => {
|
||||
// loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
// loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
// loginCancelEnabled(true)
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// loginOptionSkirdaTelegram.onclick = (e) => {
|
||||
// InitSkirdaTelegramAuth()
|
||||
// switchView(getCurrentView(), VIEWS.loginSkirdaTelegram, 500, 500, () => {
|
||||
// loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
// loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
// // loginCancelEnabled(true)
|
||||
// })
|
||||
// }
|
||||
|
||||
loginOptionMicrosoft.onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
ipcRenderer.send(
|
||||
MSFT_OPCODE.OPEN_LOGIN,
|
||||
loginOptionsViewOnLoginSuccess,
|
||||
loginOptionsViewOnLoginCancel
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
loginOptionMojang.onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
||||
|
||||
loginOptionSkirdaAuth.onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.loginSkirdaAuth, 500, 500, () => {
|
||||
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
loginCancelEnabled(true)
|
||||
// const stage1 = document.getElementById('loginOptionSkirdaStage1')
|
||||
// const stage2 = document.getElementById('loginOptionSkirdaStage2')
|
||||
// /** @type {HTMLInputElement}*/
|
||||
// const usernameInput = document.getElementById('loginOptionSkirdaSubmitUsername')
|
||||
// /** @type {HTMLButtonElement}*/
|
||||
// const submitButton = document.getElementById('loginOptionSkirdaSubmitUsernameButton')
|
||||
//
|
||||
//
|
||||
// stage1.style.display = 'none'
|
||||
// stage2.style.display = 'block'
|
||||
//
|
||||
// submitButton.addEventListener('click', (e) => {
|
||||
// SkirdaAuth.CheckFreeUsername('aaa', usernameInput.value).then((res) => {
|
||||
// if (res.error !== undefined){
|
||||
// console.error(res.error)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// console.log('ok')
|
||||
// })
|
||||
// })
|
||||
//
|
||||
// usernameInput.addEventListener('input', (input) =>{
|
||||
// submitButton.disabled = !usernameInput.checkValidity()
|
||||
// })
|
||||
|
||||
SkirdaAuth.Init().then((result) => {
|
||||
if (result.error) {
|
||||
console.error(result)
|
||||
switchView(getCurrentView(), VIEWS.loginOptions, 500, 500, async () => {})
|
||||
} else {
|
||||
SkirdaAuth.YggdrasilAuth(result.token).then(ygg_res => {
|
||||
if (ygg_res.error !== undefined) {
|
||||
console.error(ygg_res)
|
||||
switchView(getCurrentView(), VIEWS.loginOptions, 500, 500, async () => {})
|
||||
} else {
|
||||
AuthManager.addSkirdaAccount(
|
||||
ygg_res.profile.id,
|
||||
ygg_res.accessToken,
|
||||
ygg_res.profile.name,
|
||||
result.token).then((value) => {
|
||||
updateSelectedAccount(value)
|
||||
}).then((value) => {
|
||||
switchView(getCurrentView(), VIEWS.landing, 500, 500, async () => {})
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
172
app/assets/js/scripts/loginSkirda.js
Normal file
@ -0,0 +1,172 @@
|
||||
/** @typedef {Object} SkirdaAuthError
|
||||
* @property {string} error
|
||||
*/
|
||||
|
||||
/** @typedef {Object} YggdrasilError
|
||||
* @property {string} error
|
||||
* @property {string} path
|
||||
*/
|
||||
|
||||
/** @typedef {Object} SkirdaAuthInitResponse
|
||||
* @property {string} redirect_url
|
||||
* @property {string} subscribe_url
|
||||
*/
|
||||
|
||||
/** @typedef {Object} SkirdaAuthResponse
|
||||
* @property {string} id
|
||||
* @property {string} name
|
||||
* @property {string} token
|
||||
*/
|
||||
|
||||
/** @typedef {Object} SkirdaYggdrasilAuthResponse
|
||||
* @property {string} clientToken
|
||||
* @property {string} accessToken //jwt from skirda yggdrasil service with minecraft username
|
||||
* @property {YggdrasilProfile} profile
|
||||
*/
|
||||
|
||||
/** @typedef {Object} YggdrasilProfile
|
||||
* @property {string} id
|
||||
* @property {string} name
|
||||
*/
|
||||
|
||||
|
||||
class SkirdaAuth {
|
||||
static #ygg_auth_api_url = 'https://skirda.brzezinski.ru/yggdrasil'
|
||||
static #sk_tg_auth_api_url = 'https://skirda.brzezinski.ru/auth'
|
||||
|
||||
|
||||
constructor() {
|
||||
console.log('Skirda Auth')
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<SkirdaAuthResponse|SkirdaAuthError>}
|
||||
*/
|
||||
static async #fetchInit() {
|
||||
const resp = await fetch(`${SkirdaAuth.#sk_tg_auth_api_url}/telegram/init`, {})
|
||||
if (!resp.ok) {
|
||||
return {
|
||||
error: 'unknown error on auth request'
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
return await resp.json()
|
||||
} catch (error) {
|
||||
console.error(error.message)
|
||||
return {
|
||||
error: error.message,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return {Promise<SkirdaAuthResponse|SkirdaAuthError>}
|
||||
* */
|
||||
static async Init() {
|
||||
const initResp = await SkirdaAuth.#fetchInit()
|
||||
|
||||
if (initResp.error !== undefined) {
|
||||
return initResp
|
||||
}
|
||||
|
||||
await shell.openExternal(initResp.redirect_url)
|
||||
|
||||
// const yggResp = await SkirdaAuth.#yggdrasilAuth(authResult.token)
|
||||
// console.log(yggResp)
|
||||
|
||||
return await SkirdaAuth.#subscribe(initResp.subscribe_url)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param subscribe_url
|
||||
* @returns {Promise<SkirdaAuthResponse|SkirdaAuthError>}
|
||||
*/
|
||||
static async #subscribe(subscribe_url) {
|
||||
const resp = await fetch(subscribe_url, {})
|
||||
try {
|
||||
if (!resp.ok) {
|
||||
return {
|
||||
error: 'unknown error on subscribe to auth result',
|
||||
}
|
||||
}
|
||||
return await resp.json()
|
||||
} catch (error) {
|
||||
return {
|
||||
error: error.message,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} skirdaToken
|
||||
* @return {Promise<SkirdaYggdrasilAuthResponse|YggdrasilError>}
|
||||
* */
|
||||
static async YggdrasilAuth(skirdaToken) {
|
||||
const resp = await fetch(`${SkirdaAuth.#ygg_auth_api_url}/skirda/authenticate`, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': skirdaToken
|
||||
},
|
||||
})
|
||||
|
||||
try {
|
||||
return await resp.json()
|
||||
} catch (error) {
|
||||
return {
|
||||
error: error.message,
|
||||
path: 'skirda/authenticate',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} token
|
||||
* @param {string} username
|
||||
* @return {Promise<bool|YggdrasilError>}
|
||||
* */
|
||||
static async CheckFreeUsername(token, username) {
|
||||
const resp = await fetch(`${SkirdaAuth.#ygg_auth_api_url}/skirda/checkFreeUsername`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': token
|
||||
}
|
||||
})
|
||||
|
||||
try {
|
||||
return await resp.json()
|
||||
} catch (error) {
|
||||
return {
|
||||
error: error.message,
|
||||
path: 'skirda/checkFreeUsername',
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} yggToken
|
||||
* @param {string} skirdaToken
|
||||
* @return {Promise<boolean>}
|
||||
* */
|
||||
static async YggRefresh(yggToken, skirdaToken) {
|
||||
const resp = await fetch(`${SkirdaAuth.#ygg_auth_api_url}/refresh`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
'accessToken': yggToken,
|
||||
'clientToken': skirdaToken, // This is skirda token
|
||||
})
|
||||
})
|
||||
|
||||
try {
|
||||
const respJSON = await resp.json()
|
||||
return respJSON.error === undefined
|
||||
} catch (error) {
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -351,6 +351,14 @@ document.getElementById('settingsAddMojangAccount').onclick = (e) => {
|
||||
})
|
||||
}
|
||||
|
||||
document.getElementById('settingsAddSkirdaDiscord').onclick = (e) => {
|
||||
// console.log("kekekekekek")
|
||||
switchView(getCurrentView(), VIEWS.loginSkirdaDiscord, 500, 500, () => {
|
||||
loginViewOnCancel = VIEWS.settings
|
||||
loginViewOnSuccess = VIEWS.settings
|
||||
})
|
||||
}
|
||||
|
||||
// Bind the add microsoft account button.
|
||||
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
@ -513,30 +521,50 @@ function processLogOut(val, isLastAccount){
|
||||
const uuid = parent.getAttribute('uuid')
|
||||
const prevSelAcc = ConfigManager.getSelectedAccount()
|
||||
const targetAcc = ConfigManager.getAuthAccount(uuid)
|
||||
if(targetAcc.type === 'microsoft') {
|
||||
msAccDomElementCache = parent
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
|
||||
})
|
||||
} else {
|
||||
AuthManager.removeMojangAccount(uuid).then(() => {
|
||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||
const selAcc = ConfigManager.getSelectedAccount()
|
||||
refreshAuthAccountSelected(selAcc.uuid)
|
||||
updateSelectedAccount(selAcc)
|
||||
validateSelectedAccount()
|
||||
}
|
||||
if(isLastAccount) {
|
||||
loginOptionsCancelEnabled(false)
|
||||
loginOptionsViewOnLoginSuccess = VIEWS.settings
|
||||
loginOptionsViewOnLoginCancel = VIEWS.loginOptions
|
||||
switchView(getCurrentView(), VIEWS.loginOptions)
|
||||
}
|
||||
})
|
||||
$(parent).fadeOut(250, () => {
|
||||
parent.remove()
|
||||
})
|
||||
switch (targetAcc.type){
|
||||
case 'microsoft':
|
||||
msAccDomElementCache = parent
|
||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
|
||||
})
|
||||
break
|
||||
case 'mojang':
|
||||
AuthManager.removeMojangAccount(uuid).then(() => {
|
||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||
const selAcc = ConfigManager.getSelectedAccount()
|
||||
refreshAuthAccountSelected(selAcc.uuid)
|
||||
updateSelectedAccount(selAcc)
|
||||
validateSelectedAccount()
|
||||
}
|
||||
if(isLastAccount) {
|
||||
loginOptionsCancelEnabled(false)
|
||||
loginOptionsViewOnLoginSuccess = VIEWS.settings
|
||||
loginOptionsViewOnLoginCancel = VIEWS.loginOptions
|
||||
switchView(getCurrentView(), VIEWS.loginOptions)
|
||||
}
|
||||
})
|
||||
$(parent).fadeOut(250, () => {
|
||||
parent.remove()
|
||||
})
|
||||
break
|
||||
case 'offline':
|
||||
AuthManager.removeOfflineAccount(uuid)
|
||||
break
|
||||
case 'skirda':
|
||||
AuthManager.removeSkirdaAccount(uuid)
|
||||
break
|
||||
}
|
||||
if(isLastAccount) {
|
||||
loginOptionsCancelEnabled(false)
|
||||
loginOptionsViewOnLoginSuccess = VIEWS.settings
|
||||
loginOptionsViewOnLoginCancel = VIEWS.loginOptions
|
||||
switchView(getCurrentView(), VIEWS.loginOptions)
|
||||
}
|
||||
// if(targetAcc.type === 'microsoft') {
|
||||
//
|
||||
// } else {
|
||||
//
|
||||
// }
|
||||
}
|
||||
|
||||
// Bind reply for Microsoft Logout.
|
||||
@ -620,6 +648,8 @@ function refreshAuthAccountSelected(uuid){
|
||||
|
||||
const settingsCurrentMicrosoftAccounts = document.getElementById('settingsCurrentMicrosoftAccounts')
|
||||
const settingsCurrentMojangAccounts = document.getElementById('settingsCurrentMojangAccounts')
|
||||
const settingsCurrentSkirdaDiscord = document.getElementById('settingsCurrentSkirdaDiscord')
|
||||
const settingsCurrentOfflineDiscord = document.getElementById('settingsCurrentOfflineDiscord')
|
||||
|
||||
/**
|
||||
* Add auth account elements for each one stored in the authentication database.
|
||||
@ -634,9 +664,12 @@ function populateAuthAccounts(){
|
||||
|
||||
let microsoftAuthAccountStr = ''
|
||||
let mojangAuthAccountStr = ''
|
||||
let skirdaAuthAccountStr = ''
|
||||
let offlineAuthAccountStr = ''
|
||||
|
||||
authKeys.forEach((val) => {
|
||||
const acc = authAccounts[val]
|
||||
// console.log(acc)
|
||||
|
||||
const accHtml = `<div class="settingsAuthAccount" uuid="${acc.uuid}">
|
||||
<div class="settingsAuthAccountLeft">
|
||||
@ -662,16 +695,33 @@ function populateAuthAccounts(){
|
||||
</div>
|
||||
</div>`
|
||||
|
||||
if(acc.type === 'microsoft') {
|
||||
microsoftAuthAccountStr += accHtml
|
||||
} else {
|
||||
mojangAuthAccountStr += accHtml
|
||||
|
||||
switch (acc.type){
|
||||
case 'microsoft':
|
||||
microsoftAuthAccountStr += accHtml
|
||||
break
|
||||
case 'mojang':
|
||||
mojangAuthAccountStr += accHtml
|
||||
break
|
||||
case 'offline':
|
||||
offlineAuthAccountStr += accHtml
|
||||
break
|
||||
case 'skirda':
|
||||
skirdaAuthAccountStr += accHtml
|
||||
break
|
||||
}
|
||||
// if(acc.type === 'microsoft') {
|
||||
// microsoftAuthAccountStr += accHtml
|
||||
// } else {
|
||||
// mojangAuthAccountStr += accHtml
|
||||
// }
|
||||
|
||||
})
|
||||
|
||||
settingsCurrentMicrosoftAccounts.innerHTML = microsoftAuthAccountStr
|
||||
settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
|
||||
settingsCurrentSkirdaAccounts.innerHTML = skirdaAuthAccountStr
|
||||
settingsCurrentOfflineAccounts.innerHTML = offlineAuthAccountStr
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1453,7 +1503,7 @@ function populateAboutVersionInformation(){
|
||||
*/
|
||||
function populateReleaseNotes(){
|
||||
$.ajax({
|
||||
url: 'https://github.com/dscalzi/HeliosLauncher/releases.atom',
|
||||
url: 'https://git.brzezinski.ru/Skirda/SkirdaElectronLauncher/releases.atom',
|
||||
success: (data) => {
|
||||
const version = 'v' + remote.app.getVersion()
|
||||
const entries = $(data).find('entry')
|
||||
|
@ -18,9 +18,14 @@ const VIEWS = {
|
||||
landing: '#landingContainer',
|
||||
loginOptions: '#loginOptionsContainer',
|
||||
login: '#loginContainer',
|
||||
loginSkirdaAuth: '#loginSkirdaAuthContainer',
|
||||
loginSkirdaDiscord: '#loginSkirdaDiscordContainer',
|
||||
loginSkirdaTelegram: '#loginSkirdaTelegramContainer',
|
||||
loginOffline: '#loginOfflineContainer',
|
||||
settings: '#settingsContainer',
|
||||
welcome: '#welcomeContainer',
|
||||
waiting: '#waitingContainer'
|
||||
waiting: '#waitingContainer',
|
||||
dynmap: '#dynmapContainer'
|
||||
}
|
||||
|
||||
// The currently shown view container.
|
||||
@ -76,9 +81,9 @@ async function showMainUI(data){
|
||||
|
||||
// If this is enabled in a development environment we'll get ratelimited.
|
||||
// The relaunch frequency is usually far too high.
|
||||
if(!isDev && isLoggedIn){
|
||||
validateSelectedAccount()
|
||||
}
|
||||
// if(!isDev && isLoggedIn){
|
||||
validateSelectedAccount()
|
||||
// }
|
||||
|
||||
if(ConfigManager.isFirstLaunch()){
|
||||
currentView = VIEWS.welcome
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Custom Language File for Launcher Customizer
|
||||
|
||||
[ejs.app]
|
||||
title = "Helios Launcher"
|
||||
title = "Skirda Launcher"
|
||||
|
||||
[ejs.landing]
|
||||
mediaGitHubURL = "https://github.com/dscalzi/HeliosLauncher"
|
||||
|
@ -17,6 +17,7 @@ newsErrorLoadSpan = "Checking for News.."
|
||||
newsErrorFailedSpan = "Failed to Load News"
|
||||
newsErrorRetryButton = "Try Again"
|
||||
newsErrorNoneSpan = "No News"
|
||||
mapButton = "MAP"
|
||||
|
||||
[ejs.login]
|
||||
loginCancelText = "Cancel"
|
||||
@ -33,11 +34,14 @@ loginNeedAccountLink = "https://minecraft.net/store/minecraft-java-edition/"
|
||||
loginNeedAccountText = "Need an Account?"
|
||||
loginPasswordDisclaimer1 = "Your password is sent directly to mojang and never stored."
|
||||
loginPasswordDisclaimer2 = "{appName} is not affiliated with Mojang AB."
|
||||
loginSkirdaTitle = "Skirda Authorization"
|
||||
loginSkirdaInit = "For authorization proceed we opened auth page in your system-preffered browser"
|
||||
|
||||
[ejs.loginOptions]
|
||||
loginOptionsTitle = "Login Options"
|
||||
loginWithMicrosoft = "Login with Microsoft"
|
||||
loginWithMojang = "Login with Mojang"
|
||||
loginWithSkirda = "Login with Skirda"
|
||||
cancelButton = "Cancel"
|
||||
|
||||
[ejs.overlay]
|
||||
@ -122,6 +126,8 @@ launcherUpdatesHeaderDesc = "Download, install, and review updates for the launc
|
||||
checkForUpdates = "Check for Updates"
|
||||
whatsNew = "What's New"
|
||||
updateReleaseNotes = "Update Release Notes"
|
||||
skirdaAccount = "Skirda"
|
||||
addSkirdaAccount = "Authorize with Skirda"
|
||||
|
||||
[ejs.waiting]
|
||||
waitingText = "Waiting for Microsoft.."
|
||||
@ -279,6 +285,11 @@ latestVersionTitle = "You Are Running the Latest Version"
|
||||
checkForUpdatesButton = "Check for Updates"
|
||||
checkingForUpdatesButton = "Checking for Updates.."
|
||||
|
||||
[js.settings.msftLogin]
|
||||
errorTitle = "Microsoft Login Failed"
|
||||
errorMessage = "We were unable to authenticate your Microsoft account. Please try again."
|
||||
okButton = "OK"
|
||||
|
||||
[js.uibinder.startup]
|
||||
fatalErrorTitle = "Fatal Error: Unable to Load Distribution Index"
|
||||
fatalErrorMessage = "A connection could not be established to our servers to download the distribution index. No local copies were available to load. <br><br>The distribution index is an essential file which provides the latest server information. The launcher is unable to start without it. Ensure you are connected to the internet and relaunch the application."
|
||||
@ -295,3 +306,45 @@ selectAnotherAccountButton = "Select Another Account"
|
||||
checkingForUpdateButton = "Checking for Updates..."
|
||||
installNowButton = "Install Now"
|
||||
checkForUpdatesButton = "Check for Updates"
|
||||
|
||||
[js.auth.microsoft.error]
|
||||
noProfileTitle = "Error During Login:<br>Profile Not Set Up"
|
||||
noProfileDesc = "Your Microsoft account does not yet have a Minecraft profile set up. If you have recently purchased the game or redeemed it through Xbox Game Pass, you have to set up your profile on <a href=\"https://minecraft.net/\">Minecraft.net</a>.<br><br>If you have not yet purchased the game, you can also do that on <a href=\"https://minecraft.net/\">Minecraft.net</a>."
|
||||
noXboxAccountTitle = "Error During Login:<br>No Xbox Account"
|
||||
noXboxAccountDesc = "Your Microsoft account has no Xbox account associated with it."
|
||||
xblBannedTitle = "Error During Login:<br>Xbox Live Unavailable"
|
||||
xblBannedDesc = "Your Microsoft account is from a country where Xbox Live is not available or banned."
|
||||
under18Title = "Error During Login:<br>Parental Approval Required"
|
||||
under18Desc = "Accounts for users under the age of 18 must be added to a Family by an adult."
|
||||
unknownTitle = "Unknown Error During Login"
|
||||
unknownDesc = "An unknown error has occurred. Please see the console for details."
|
||||
|
||||
[js.auth.mojang.error]
|
||||
methodNotAllowedTitle = "Internal Error:<br>Method Not Allowed"
|
||||
methodNotAllowedDesc = "Method not allowed. Please report this error."
|
||||
notFoundTitle = "Internal Error:<br>Not Found"
|
||||
notFoundDesc = "The authentication endpoint was not found. Please report this issue."
|
||||
accountMigratedTitle = "Error During Login:<br>Account Migrated"
|
||||
accountMigratedDesc = "You've attempted to login with a migrated account. Try again using the account email as the username."
|
||||
invalidCredentialsTitle = "Error During Login:<br>Invalid Credentials"
|
||||
invalidCredentialsDesc = "The email or password you've entered is incorrect. Please try again."
|
||||
tooManyAttemptsTitle = "Error During Login:<br>Too Many Attempts"
|
||||
tooManyAttemptsDesc = "There have been too many login attempts with this account recently. Please try again later."
|
||||
invalidTokenTitle = "Error During Login:<br>Invalid Token"
|
||||
invalidTokenDesc = "The provided access token is invalid."
|
||||
tokenHasProfileTitle = "Error During Login:<br>Token Has Profile"
|
||||
tokenHasProfileDesc = "Access token already has a profile assigned. Selecting profiles is not implemented yet."
|
||||
credentialsMissingTitle = "Error During Login:<br>Credentials Missing"
|
||||
credentialsMissingDesc = "Username/password was not submitted or password is less than 3 characters."
|
||||
invalidSaltVersionTitle = "Error During Login:<br>Invalid Salt Version"
|
||||
invalidSaltVersionDesc = "Invalid salt version."
|
||||
unsupportedMediaTypeTitle = "Internal Error:<br>Unsupported Media Type"
|
||||
unsupportedMediaTypeDesc = "Unsupported media type. Please report this error."
|
||||
accountGoneTitle = "Error During Login:<br>Account Migrated"
|
||||
accountGoneDesc = "Account has been migrated to a Microsoft account. Please log in with Microsoft."
|
||||
unreachableTitle = "Error During Login:<br>Unreachable"
|
||||
unreachableDesc = "Unable to reach the authentication servers. Ensure that they are online and you are connected to the internet."
|
||||
gameNotPurchasedTitle = "Error During Login:<br>Game Not Purchased"
|
||||
gameNotPurchasedDesc = "The account you are trying to login with has not purchased a copy of Minecraft. You may purchase a copy on <a href=\"https://minecraft.net/\">Minecraft.net</a>"
|
||||
unknownErrorTitle = "Unknown Error During Login"
|
||||
unknownErrorDesc = "An unknown error has occurred. Please see the console for details."
|
||||
|
303
app/assets/lang/ru_RU.toml
Normal file
@ -0,0 +1,303 @@
|
||||
[ejs.landing]
|
||||
updateAvailableTooltip = "Доступно обновление"
|
||||
usernamePlaceholder = "Никнейм"
|
||||
usernameEditButton = "Изм."
|
||||
settingsTooltip = "Настройки"
|
||||
serverStatus = "СЕРВЕР"
|
||||
serverStatusPlaceholder = "ОФФЛАЙН"
|
||||
mojangStatus = "Статус серверов Mojang"
|
||||
mojangStatusTooltipTitle = "Сервисы"
|
||||
mojangStatusNETitle = "Остальное"
|
||||
newsButton = "КАРТА"
|
||||
launchButton = "ИГРАТЬ"
|
||||
launchButtonPlaceholder = "• Сервер не запущен"
|
||||
launchDetails = "Пожалуйста, подождите..."
|
||||
newsNavigationStatus = "{currentPage} из {totalPages}"
|
||||
newsErrorLoadSpan = "Checking for News.."
|
||||
newsErrorFailedSpan = "Failed to Load News"
|
||||
newsErrorRetryButton = "Try Again"
|
||||
newsErrorNoneSpan = "No News"
|
||||
mapButton = "КАРТА"
|
||||
|
||||
[ejs.login]
|
||||
loginCancelText = "Отмена"
|
||||
loginSubheader = "ОФИЦИАЛЬНАЯ АВТОРИЗАЦИЯ"
|
||||
loginEmailError = "* Неправильное значение"
|
||||
loginEmailPlaceholder = "ПОЧТА ИЛИ НИКНЕЙМ"
|
||||
loginPasswordError = "* Требуется"
|
||||
loginPasswordPlaceholder = "ПАРОЛЬ"
|
||||
loginForgotPasswordLink = "https://minecraft.net/password/forgot/"
|
||||
loginForgotPasswordText = "Забыли пароль?"
|
||||
loginRememberMeText = "Запомнить"
|
||||
loginButtonText = "ЛОГИН"
|
||||
loginNeedAccountLink = "https://minecraft.net/store/minecraft-java-edition/"
|
||||
loginNeedAccountText = "Нужен аккаунт?"
|
||||
loginPasswordDisclaimer1 = "Ваш пароль отправляется напрямую в Mojang и не сохраняется у нас."
|
||||
loginPasswordDisclaimer2 = "{appName} не имеет ничего общего с Mojang AB."
|
||||
loginSkirdaTitle = "Авторизация через Skirda"
|
||||
loginSkirdaInit = "Для продолжения авторизации мы открыли вкладку в вашем браузере по-умолчанию"
|
||||
|
||||
[ejs.loginOptions]
|
||||
loginOptionsTitle = "Опции входа"
|
||||
loginWithMicrosoft = "Зайти с помощью Microsoft"
|
||||
loginWithMojang = "Зайти с помощью Mojang"
|
||||
loginWithSkirda = "Зайти с помощью Skirda"
|
||||
cancelButton = "Отмена"
|
||||
|
||||
[ejs.overlay]
|
||||
serverSelectHeader = "Доступные сервера"
|
||||
serverSelectConfirm = "Выбрать"
|
||||
serverSelectCancel = "Отменить"
|
||||
accountSelectHeader = "Выбрать аккаунт"
|
||||
accountSelectConfirm = "Выбрать"
|
||||
accountSelectCancel = "Отменить"
|
||||
|
||||
[ejs.settings]
|
||||
navHeaderText = "Настройки"
|
||||
navAccount = "Аккаунт"
|
||||
navMinecraft = "Minecraft"
|
||||
navMods = "Моды"
|
||||
navJava = "Java"
|
||||
navLauncher = "Лаунчер"
|
||||
navAbout = "О лаунчере"
|
||||
navUpdates = "Обновления"
|
||||
navDone = "Готово"
|
||||
tabAccountHeaderText = "Настройки аккаунта"
|
||||
tabAccountHeaderDesc = "Добавить новый аккаунт или редактировать существующий."
|
||||
microsoftAccount = "Microsoft"
|
||||
addMicrosoftAccount = "+ добавить аккаунт Microsoft"
|
||||
mojangAccount = "Mojang"
|
||||
addMojangAccount = "+ добавить аккаунт Mojang"
|
||||
minecraftTabHeaderText = "Настройки Minecraft"
|
||||
minecraftTabHeaderDesc = "Опции для запуска игры"
|
||||
gameResolutionTitle = "Разрешение игры"
|
||||
launchFullscreenTitle = "Запуск в полноэкранном режиме"
|
||||
autoConnectTitle = "Автоматически подключаться при запуске"
|
||||
launchDetachedTitle = "Запускать игру отдельным процессом"
|
||||
launchDetachedDesc = "Если игра не откреплена, закрытие лаунчера приведет к закрытию игры."
|
||||
tabModsHeaderText = "Настройки модов"
|
||||
tabModsHeaderDesc = "Включение и отключение модов"
|
||||
switchServerButton = "Переключить"
|
||||
requiredMods = "Требуемые моды"
|
||||
optionalMods = "Опциональные моды"
|
||||
dropinMods = "Подключаемые моды"
|
||||
addMods = "Добавить моды"
|
||||
dropinRefreshNote = "(Нажмите F5, чтобы обновить)"
|
||||
shaderpacks = "Паки шейдеров"
|
||||
shaderpackDesc = "Включение и отключение шейдеров. Учтите, что шейдеры будут хорошо работать только на мощных системах. Вы можете добавить свои паки здесь."
|
||||
selectShaderpack = "Выберите пак шейдеров"
|
||||
tabJavaHeaderText = "Настройки Java"
|
||||
tabJavaHeaderDesc = "Настройка конфигурации Java (advanced)."
|
||||
memoryTitle = "Память"
|
||||
maxRAM = "Максимально допустимый объем ОЗУ"
|
||||
minRAM = "Минимально допустимый объем ОЗУ"
|
||||
memoryDesc = "Рекомендуемый минимум объема ОЗУ - 3 Гб. Установка одинакового максимального и миниального значений может увеличить производительность."
|
||||
memoryTotalTitle = "Всего"
|
||||
memoryAvailableTitle = "Доступно"
|
||||
javaExecutableTitle = "Исполняющие файлы Java"
|
||||
javaExecSelDialogTitle = "Выбрать исполняющий файл Java"
|
||||
javaExecSelButtonText = "Выберите файл"
|
||||
javaExecDesc = "Исполняющий файл Java проверяется перед запуском игры."
|
||||
javaPathDesc = "Путь должен окончаться <strong>{pathSuffix}</strong>."
|
||||
jvmOptsTitle = "Дополнительные опции JVM"
|
||||
jvmOptsDesc = "Опции JVM в процессе работы. <em>-Xms</em> и <em>-Xmx</em> не должны быть вписаны."
|
||||
launcherTabHeaderText = "Настройки лаунчера"
|
||||
launcherTabHeaderDesc = "Опции, относящиеся к лаунчеру."
|
||||
allowPrereleaseTitle = "Устанавливать бета-версии."
|
||||
allowPrereleaseDesc = "Бета-версии включают в себя новые функции, которые еще не были достаточно протестированы.<br>Всегда включено, если вы на бета-версии."
|
||||
dataDirectoryTitle = "Папка Minecraft"
|
||||
selectDataDirectory = "Выберите папку Minecraft"
|
||||
chooseFolder = "Выберите папку"
|
||||
dataDirectoryDesc = "Все игровые файлы и Java будут хранится в этой папке.<br>Скриншоты и одиночные миры хранятся в соответсвующей серверу папке."
|
||||
aboutTabHeaderText = "О"
|
||||
aboutTabHeaderDesc = "Посмотреть информацию и историю изменений этой версии."
|
||||
aboutTitle = "{appName}"
|
||||
stableRelease = "Стабильная версия"
|
||||
versionText = "Версия "
|
||||
sourceGithub = "Источник (GitHub)"
|
||||
support = "Поддержка"
|
||||
devToolsConsole = "DevTools Console"
|
||||
releaseNotes = "Примечания к релизу"
|
||||
changelog = "Изменения"
|
||||
noReleaseNotes = "Нет примечаний к релизу"
|
||||
viewReleaseNotes = "Посмотреть примечания к релизу"
|
||||
launcherUpdatesHeaderText = "Обновления лаунчера"
|
||||
launcherUpdatesHeaderDesc = "Проверить наличие новых версий и обновить."
|
||||
checkForUpdates = "Проверить на наличие обновлений"
|
||||
whatsNew = "Что нового?"
|
||||
updateReleaseNotes = "Причения к обновлению"
|
||||
skirdaAccount = "Скирда"
|
||||
addSkirdaAccount = "Авторизироватся через Скирду"
|
||||
|
||||
[ejs.waiting]
|
||||
waitingText = "Ожидание Microsoft.."
|
||||
|
||||
[ejs.welcome]
|
||||
continueButton = "ПРОДОЛЖИТЬ"
|
||||
|
||||
|
||||
[js.discord]
|
||||
waiting = "Ожидание клиента.."
|
||||
state = "Сервер: {shortId}"
|
||||
|
||||
[js.index]
|
||||
microsoftLoginTitle = "Логин через Microsoft"
|
||||
microsoftLogoutTitle = "Выход из Microsoft"
|
||||
|
||||
[js.login]
|
||||
login = "ЛОГИН"
|
||||
loggingIn = "АВТОРИЗАЦИЯ..."
|
||||
success = "АВТОРИЗИРОВАНО"
|
||||
tryAgain = "Попробуйте еще раз"
|
||||
|
||||
[js.login.error]
|
||||
invalidValue = "* Неверное значение"
|
||||
requiredValue = "* Требуется"
|
||||
|
||||
[js.login.error.unknown]
|
||||
title = "Неизвестная ошибка при авторизации"
|
||||
desc = "Произошла неизвестная ошибка. Проверте консоль (Ctrl + Shift + I) чтобы узнать, что случулось."
|
||||
|
||||
[js.landing.launch]
|
||||
pleaseWait = "Пожалуйста, подождите..."
|
||||
failureTitle = "Ошибка при запуске :("
|
||||
failureText = "Сделайте скриншот из консоли (CTRL + Shift + I) и скажите Грише, что все пошло по пизде."
|
||||
okay = "Окей"
|
||||
|
||||
[js.landing.selectedAccount]
|
||||
noAccountSelected = "Не выбран аккаунт"
|
||||
|
||||
[js.landing.selectedServer]
|
||||
noSelection = "Не выбран сервер"
|
||||
loading = "Загрузка..."
|
||||
|
||||
[js.landing.serverStatus]
|
||||
server = "СЕРВЕР"
|
||||
offline = "ОФФЛАЙН"
|
||||
players = "ИГРОКИ"
|
||||
|
||||
[js.landing.systemScan]
|
||||
checking = "Проверяю вашу систему..."
|
||||
noCompatibleJava = "Не найдено подходящей<br>Java системы!"
|
||||
installJavaMessage = "Для запуска Minecraft, вам нужна 64-бит Java {major}. Установить?"
|
||||
installJava = "Установить Java"
|
||||
installJavaManually = "Установить вручную"
|
||||
javaDownloadPrepare = "Подготовка к загрузке Java..."
|
||||
javaDownloadFailureTitle = "Ошибка при загрузке :("
|
||||
javaDownloadFailureText = "Смотрите консоль (CTRL + Shift + i) для информации."
|
||||
javaRequired = "Необходима Java<br>для запуска"
|
||||
javaRequiredMessage = 'Необходима x64 версия Java {major} для запуска.<br><br>Обратитесь к администраторам проекта для помощи.'
|
||||
javaRequiredDismiss = "Понятно"
|
||||
javaRequiredCancel = "Назад"
|
||||
|
||||
[js.landing.downloadJava]
|
||||
findJdkFailure = "Не нашел дистрибутив OpenJDK."
|
||||
javaDownloadCorruptedError = "Загруженный дистрибутив JDK, кажется, поврежден (несовпадение хеш-сумм)."
|
||||
extractingJava = "Распаковка Java"
|
||||
javaInstalled = "Java установлена!"
|
||||
|
||||
[js.landing.dlAsync]
|
||||
loadingServerInfo = "Загружаю информацию о сервере..."
|
||||
fatalError = "Критическая ошибка!"
|
||||
unableToLoadDistributionIndex = "Не могу загрузить копию дистрибутивов. Обратитесь к администрации проекта."
|
||||
pleaseWait = "Пожалуйста, подождите..."
|
||||
errorDuringLaunchTitle = "Ошибка при запуске"
|
||||
seeConsoleForDetails = "Обратитесь к администрации проекта."
|
||||
validatingFileIntegrity = "Проверка целостности файлов..."
|
||||
errorDuringFileVerificationTitle = "Ошибка при проверке!"
|
||||
downloadingFiles = "Загрузка файлов..."
|
||||
errorDuringFileDownloadTitle = "Ошибка при загрузке!"
|
||||
preparingToLaunch = "Подготовка к запуску..."
|
||||
launchingGame = "Запускаю игру..."
|
||||
launchWrapperNotDownloaded = "Ошибка загрузки главного файла (LaunchWrapper). Игра не может быть запущена.<br><br>Попробуйте отключить антивирус.<br><br>Если проблема не получится решить, то обратитесь к администрации проекта."
|
||||
doneEnjoyServer = "Готово. Приятной игры!"
|
||||
checkConsoleForDetails = "Смотрите консоль (CTRL + Shift + i) для информации об ошибке."
|
||||
|
||||
[js.landing.news]
|
||||
checking = "Checking for News"
|
||||
|
||||
[js.landing.discord]
|
||||
loading = "Загрузка игры..."
|
||||
joining = "Подключается к серверу!"
|
||||
joined = "Играет на сервере!"
|
||||
|
||||
[js.overlay]
|
||||
dismiss = "Скрыть"
|
||||
|
||||
[js.settings.fileSelectors]
|
||||
executables = "Исполняющие файлы"
|
||||
allFiles = "Все файлы"
|
||||
|
||||
[js.settings.mstfLogin]
|
||||
errorTitle = "Что-то пошло не так..."
|
||||
errorMessage = "Аутентификация через Microsoft не получилась. Попробуйте еще раз."
|
||||
okButton = "OK"
|
||||
|
||||
[js.settings.mstfLogout]
|
||||
errorTitle = "Что-то пошло не так..."
|
||||
errorMessage = "Выйти из аккаунта Microsoft не получилось. Попробуйте еще раз."
|
||||
okButton = "OK"
|
||||
|
||||
[js.settings.authAccountSelect]
|
||||
selectButton = "Выбрать аккаунт"
|
||||
selectedButton = "Выбранный аккаунт ✔"
|
||||
|
||||
[js.settings.authAccountLogout]
|
||||
lastAccountWarningTitle = "Внимание!<br>Это ваш единственный аккаунт"
|
||||
lastAccountWarningMessage = "Для захода в игру нужно быть авторизированым хотя бы в одном аккаунте. Будет необходимо снова авторизироваться.<br><br>Вы уверены?"
|
||||
confirmButton = "Подтвердить"
|
||||
cancelButton = "Отменить"
|
||||
|
||||
[js.settings.authAccountPopulate]
|
||||
username = "Никнейм"
|
||||
uuid = "UUID"
|
||||
selectAccount = "Выбрать аккаунт"
|
||||
selectedAccount = "Выбранный аккаунт ✓"
|
||||
logout = "Выйти"
|
||||
|
||||
[js.settings.dropinMods]
|
||||
removeButton = "Удалить"
|
||||
deleteFailedTitle = "Не получилось удалить <br>подключаемый мод {fullName}"
|
||||
deleteFailedMessage = "Убедитесь, что файл не используется и попробуйте снова."
|
||||
failedToggleTitle = "Ошибка при подключении<br>одного или более подключаемых модов"
|
||||
okButton = "ОК"
|
||||
|
||||
[js.settings.serverListing]
|
||||
mainServer = "Основной сервер"
|
||||
|
||||
[js.settings.java]
|
||||
selectedJava = "Выбрано: Java {version} ({vendor})"
|
||||
invalidSelection = "Неправильный выбор"
|
||||
requiresJava = "Требутеся Java {major} x64."
|
||||
availableOptions = "Доступные опции Java {major} (HotSpot VM)"
|
||||
|
||||
[js.settings.about]
|
||||
preReleaseTitle = "Бета-версия"
|
||||
stableReleaseTitle = "Стабильная версия"
|
||||
releaseNotesFailed = "Ошибка при загрузке примечаний обновления."
|
||||
|
||||
[js.settings.updates]
|
||||
newReleaseTitle = "Доступна новая версия!"
|
||||
newPreReleaseTitle = "Доступна новая бета-версия!"
|
||||
downloadingButton = "Загружаю..."
|
||||
downloadButton = 'Скачайте с ОТКУДА? <span style="font-size: 10px;color: gray;text-shadow: none !important;">Закройте лаунчер и запустите .dmg файл для обновления.</span>'
|
||||
latestVersionTitle = "Установлена последняя версия"
|
||||
checkForUpdatesButton = "Проверить обновления"
|
||||
checkingForUpdatesButton = "Проверяю обновления..."
|
||||
|
||||
[js.uibinder.startup]
|
||||
fatalErrorTitle = "Критическая ошибка!: Unable to Load Distribution Index"
|
||||
fatalErrorMessage = "A connection could not be established to our servers to download the distribution index. No local copies were available to load. <br><br>The distribution index is an essential file which provides the latest server information. The launcher is unable to start without it. Ensure you are connected to the internet and relaunch the application."
|
||||
closeButton = "Close"
|
||||
|
||||
[js.uibinder.validateAccount]
|
||||
failedMessageTitle = "Ошибка при обновлении авторизации"
|
||||
failedMessage = "Не получилось обновить авторизацию для <strong>{account}</strong>. Выберите другой аккаунт или попробуйте снова."
|
||||
failedMessageSelectAnotherAccount = "Не получилось обновить авторизацию для <strong>{account}</strong>. Авторизируйтесь снова."
|
||||
loginButton = "Авторизироваться"
|
||||
selectAnotherAccountButton = "Выберите другой аккаунт"
|
||||
|
||||
[js.uicore.autoUpdate]
|
||||
checkingForUpdateButton = "Проверка обновлений..."
|
||||
installNowButton = "Установить"
|
||||
checkForUpdatesButton = "Проверить обновления"
|
23
app/dynmap.ejs
Normal file
@ -0,0 +1,23 @@
|
||||
<div id="dynmapContainer" style="display: none;">
|
||||
PIZDAPIZDAPIDA
|
||||
<div class="FloatingButtonContainer" id="center">
|
||||
<div class="bot_wrapper">
|
||||
<div id="content">
|
||||
<button id="dynmapDoneButton"> <!-- Rename all elements to dynmapEtc -->
|
||||
<div id="newsButtonAlert" style="display: none;"></div>
|
||||
<svg id="newsButtonSVG" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;}</style>
|
||||
</defs>
|
||||
<polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
||||
<span id="dynmapDoneButtonText">MAP</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="iframecontainer">
|
||||
<iframe id="dynmapiframe" src="https://minemap.gregbrzezinski.com" frameborder="0"></iframe>
|
||||
</div>
|
||||
<!-- <script src="./assets/js/scripts/dynmap.js"></script>-->
|
||||
</div>
|
198
app/landing.ejs
@ -27,66 +27,6 @@
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mediaDivider"></div>
|
||||
<div id="externalMedia">
|
||||
<div class="mediaContainer">
|
||||
<a href="<%- lang('landing.mediaGitHubURL') %>" class="mediaURL" id="linkURL">
|
||||
<svg id="linkSVG" class="mediaSVG" viewBox="35.34 34.3575 70.68 68.71500">
|
||||
<g>
|
||||
<path d="M75.37,65.51a3.85,3.85,0,0,0-1.73.42,8.22,8.22,0,0,1,.94,3.76A8.36,8.36,0,0,1,66.23,78H46.37a8.35,8.35,0,1,1,0-16.7h9.18a21.51,21.51,0,0,1,6.65-8.72H46.37a17.07,17.07,0,1,0,0,34.15H66.23A17,17,0,0,0,82.77,65.51Z"/>
|
||||
<path d="M66,73.88a3.85,3.85,0,0,0,1.73-.42,8.22,8.22,0,0,1-.94-3.76,8.36,8.36,0,0,1,8.35-8.35H95A8.35,8.35,0,1,1,95,78H85.8a21.51,21.51,0,0,1-6.65,8.72H95a17.07,17.07,0,0,0,0-34.15H75.13A17,17,0,0,0,58.59,73.88Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mediaContainer">
|
||||
<a href="<%- lang('landing.mediaTwitterURL') %>" class="mediaURL" id="twitterURL">
|
||||
<svg id="twitterSVG" class="mediaSVG" viewBox="0 0 5000 4060" preserveAspectRatio="xMidYMid meet">
|
||||
<g>
|
||||
<path d="M1210 4048 c-350 -30 -780 -175 -1124 -378 -56 -33 -86 -57 -86 -68 0 -16 7 -17 83 -9 114 12 349 1 493 -22 295 -49 620 -180 843 -341 l54 -38 -49 -7 c-367 -49 -660 -256 -821 -582 -30 -61 -53 -120 -51 -130 3 -16 12 -17 73 -13 97 7 199 5 270 -4 l60 -9 -65 -22 c-341 -117 -609 -419 -681 -769 -18 -88 -26 -226 -13 -239 4 -3 32 7 63 22 68 35 198 77 266 86 28 4 58 9 68 12 10 2 -22 -34 -72 -82 -240 -232 -353 -532 -321 -852 15 -149 79 -347 133 -418 16 -20 17 -19 49 20 377 455 913 795 1491 945 160 41 346 74 485 86 l82 7 -7 -59 c-5 -33 -7 -117 -6 -189 2 -163 31 -286 103 -430 141 -285 422 -504 708 -550 112 -19 333 -19 442 0 180 30 335 108 477 239 l58 54 95 -24 c143 -36 286 -89 427 -160 70 -35 131 -60 135 -56 19 19 -74 209 -151 312 -50 66 -161 178 -216 217 l-30 22 73 -14 c111 -21 257 -63 353 -101 99 -39 99 -39 99 -19 0 57 -237 326 -412 468 l-88 71 6 51 c4 28 1 130 -5 226 -30 440 -131 806 -333 1202 -380 745 -1036 1277 -1823 1477 -243 62 -430 81 -786 78 -134 0 -291 -5 -349 -10z"/>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mediaContainer">
|
||||
<a href="<%- lang('landing.mediaInstagramURL') %>" class="mediaURL" id="instagramURL">
|
||||
<svg id="instagramSVG" class="mediaSVG" viewBox="0 0 5040 5040">
|
||||
<defs>
|
||||
<radialGradient id="instaFill" cx="30%" cy="107%" r="150%">
|
||||
<stop offset="0%" stop-color="#fdf497"/>
|
||||
<stop offset="5%" stop-color="#fdf497"/>
|
||||
<stop offset="45%" stop-color="#fd5949"/>
|
||||
<stop offset="60%" stop-color="#d6249f"/>
|
||||
<stop offset="90%" stop-color="#285AEB"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<g>
|
||||
<path d="M1390 5024 c-163 -9 -239 -19 -315 -38 -281 -70 -477 -177 -660 -361 -184 -184 -292 -380 -361 -660 -43 -171 -53 -456 -53 -1445 0 -989 10 -1274 53 -1445 69 -280 177 -476 361 -660 184 -184 380 -292 660 -361 171 -43 456 -53 1445 -53 989 0 1274 10 1445 53 280 69 476 177 660 361 184 184 292 380 361 660 43 171 53 456 53 1445 0 989 -10 1274 -53 1445 -69 280 -177 476 -361 660 -184 184 -380 292 -660 361 -174 44 -454 53 -1470 52 -599 0 -960 -5 -1105 -14z m2230 -473 c58 -6 141 -18 185 -27 397 -78 638 -318 719 -714 37 -183 41 -309 41 -1290 0 -981 -4 -1107 -41 -1290 -81 -395 -319 -633 -714 -714 -183 -37 -309 -41 -1290 -41 -981 0 -1107 4 -1290 41 -397 81 -636 322 -714 719 -33 166 -38 296 -43 1100 -5 796 3 1203 27 1380 67 489 338 758 830 825 47 7 162 15 255 20 250 12 1907 4 2035 -9z"/>
|
||||
<path d="M2355 3819 c-307 -42 -561 -172 -780 -400 -244 -253 -359 -543 -359 -899 0 -361 116 -648 367 -907 262 -269 563 -397 937 -397 374 0 675 128 937 397 251 259 367 546 367 907 0 361 -116 648 -367 907 -197 203 -422 326 -690 378 -101 20 -317 27 -412 14z m400 -509 c275 -88 470 -284 557 -560 20 -65 23 -95 23 -230 0 -135 -3 -165 -23 -230 -88 -278 -284 -474 -562 -562 -65 -20 -95 -23 -230 -23 -135 0 -165 3 -230 23 -278 88 -474 284 -562 562 -20 65 -23 95 -23 230 0 135 3 165 23 230 73 230 219 403 427 507 134 67 212 83 390 79 111 -3 155 -8 210 -26z"/>
|
||||
<path d="M3750 1473 c-29 -11 -66 -38 -106 -77 -70 -71 -94 -126 -94 -221 0 -95 24 -150 94 -221 72 -71 126 -94 225 -94 168 0 311 143 311 311 0 99 -23 154 -94 225 -43 42 -76 66 -110 77 -61 21 -166 21 -226 0z"/>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mediaContainer">
|
||||
<a href="<%- lang('landing.mediaYouTubeURL') %>" class="mediaURL" id="youtubeURL">
|
||||
<svg id="youtubeSVG" class="mediaSVG" viewBox="35.34 34.3575 70.68 68.71500">
|
||||
<g>
|
||||
<path d="M84.8,69.52,65.88,79.76V59.27Zm23.65.59c0-5.14-.79-17.63-3.94-20.57S99,45.86,73.37,45.86s-28,.73-31.14,3.68S38.29,65,38.29,70.11s.79,17.63,3.94,20.57,5.52,3.68,31.14,3.68,28-.74,31.14-3.68,3.94-15.42,3.94-20.57"/>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mediaContainer">
|
||||
<a href="<%- lang('landing.mediaDiscordURL') %>" class="mediaURL" id="discordURL">
|
||||
<svg id="discordSVG" class="mediaSVG" viewBox="35.34 34.3575 70.68 68.71500">
|
||||
<g>
|
||||
<path d="M81.23,78.48a6.14,6.14,0,1,1,6.14-6.14,6.14,6.14,0,0,1-6.14,6.14M60,78.48a6.14,6.14,0,1,1,6.14-6.14A6.14,6.14,0,0,1,60,78.48M104.41,73c-.92-7.7-8.24-22.9-8.24-22.9A43,43,0,0,0,88,45.59a17.88,17.88,0,0,0-8.38-1.27l-.13,1.06a23.52,23.52,0,0,1,5.8,1.95,87.59,87.59,0,0,1,8.17,4.87s-10.32-5.63-22.27-5.63a51.32,51.32,0,0,0-23.2,5.63,87.84,87.84,0,0,1,8.17-4.87,23.57,23.57,0,0,1,5.8-1.95l-.13-1.06a17.88,17.88,0,0,0-8.38,1.27,42.84,42.84,0,0,0-8.21,4.56S37.87,65.35,37,73s-.37,11.54-.37,11.54,4.22,5.68,9.9,7.14,7.7,1.47,7.7,1.47l3.75-4.68a21.22,21.22,0,0,1-4.65-2A24.47,24.47,0,0,1,47.93,82S61.16,88.4,70.68,88.4c10,0,22.75-6.44,22.75-6.44a24.56,24.56,0,0,1-5.35,4.56,21.22,21.22,0,0,1-4.65,2l3.75,4.68s2,0,7.7-1.47,9.89-7.14,9.89-7.14.55-3.85-.37-11.54"/>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -124,16 +64,10 @@
|
||||
<div id="center">
|
||||
<div class="bot_wrapper">
|
||||
<div id="content">
|
||||
<button id="newsButton">
|
||||
<!--<img src="assets/images/icons/arrow.svg" id="newsButtonSVG"/>-->
|
||||
<button id="newsButton" style="display: none">
|
||||
<div id="newsButtonAlert" style="display: none;"></div>
|
||||
<svg id="newsButtonSVG" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;}</style>
|
||||
</defs>
|
||||
<polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
||||
<span id="newsButtonText"><%- lang('landing.newsButton') %></span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="mapsvg" viewBox="0 0 24 24" width="20" height="20"><path d="M12,0A12,12,0,1,0,24,12,12.013,12.013,0,0,0,12,0ZM22,12a9.938,9.938,0,0,1-1.662,5.508l-1.192-1.193A.5.5,0,0,1,19,15.962V15a3,3,0,0,0-3-3H13a1,1,0,0,1-1-1v-.5a.5.5,0,0,1,.5-.5A2.5,2.5,0,0,0,15,7.5v-1a.5.5,0,0,1,.5-.5h1.379a2.516,2.516,0,0,0,1.767-.732l.377-.377A9.969,9.969,0,0,1,22,12Zm-19.951.963,3.158,3.158A2.978,2.978,0,0,0,7.329,17H10a1,1,0,0,1,1,1v3.949A10.016,10.016,0,0,1,2.049,12.963ZM13,21.949V18a3,3,0,0,0-3-3H7.329a1,1,0,0,1-.708-.293L2.163,10.249A9.978,9.978,0,0,1,17.456,3.63l-.224.224A.507.507,0,0,1,16.879,4H15.5A2.5,2.5,0,0,0,13,6.5v1a.5.5,0,0,1-.5.5A2.5,2.5,0,0,0,10,10.5V11a3,3,0,0,0,3,3h3a1,1,0,0,1,1,1v.962a2.516,2.516,0,0,0,.732,1.767l1.337,1.337A9.971,9.971,0,0,1,13,21.949Z"/></svg>
|
||||
<span id="newsButtonText">MAP</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -159,62 +93,84 @@
|
||||
</div>
|
||||
</div>
|
||||
<div id="newsContainer">
|
||||
<div id="newsContent" article="-1" style="display: none;">
|
||||
<div id="newsStatusContainer">
|
||||
<div id="newsStatusContent">
|
||||
<div id="newsTitleContainer">
|
||||
<a id="newsArticleTitle" href="#">Lorem Ipsum</a>
|
||||
</div>
|
||||
<div id="newsMetaContainer">
|
||||
<div id="newsArticleDateWrapper">
|
||||
<span id="newsArticleDate">Mar 15, 44 BC, 9:14 AM</span>
|
||||
</div>
|
||||
<div id="newsArticleAuthorWrapper">
|
||||
<span id="newsArticleAuthor">by Cicero</span>
|
||||
</div>
|
||||
<a href="#" id="newsArticleComments">0 Comments</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="newsNavigationContainer">
|
||||
<button id="newsNavigateLeft">
|
||||
<svg id="newsNavigationLeftSVG" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;transition: 0.25s ease;}</style>
|
||||
</defs>
|
||||
<polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
||||
</button>
|
||||
<span id="newsNavigationStatus"><%- lang('landing.newsNavigationStatus', { currentPage: 1, totalPages: 1 }) %></span>
|
||||
<button id="newsNavigateRight">
|
||||
<svg id="newsNavigationRightSVG" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;transition: 0.25s ease;}</style>
|
||||
</defs>
|
||||
<polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="newsArticleContainer">
|
||||
<div id="newsArticleContent">
|
||||
<div id="newsArticleContentScrollable">
|
||||
<!-- Article Content -->
|
||||
<div id="dynmap-iframe-container">
|
||||
<div class="FloatingButtonContainer" id="center">
|
||||
<div class="bot_wrapper">
|
||||
<div id="content">
|
||||
<button id="dynmapDoneButton"> <!-- Rename all elements to dynmapEtc -->
|
||||
<div id="newsButtonAlert" style="display: none;"></div>
|
||||
<svg id="newsButtonSVG" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;}</style>
|
||||
</defs>
|
||||
<polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
||||
<span id="dynmapDoneButtonText"><%- lang('landing.MapButton') %></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="iframecontainer">
|
||||
<iframe id="dynmapiframe" src="https://mc.westeroscraft.com/#" frameborder="0"></iframe>
|
||||
</div>
|
||||
<!-- <script src="./assets/js/scripts/dynmap.js"></script>-->
|
||||
</div>
|
||||
<div id="newsErrorContainer">
|
||||
<div id="newsErrorLoading">
|
||||
<span id="nELoadSpan" class="newsErrorContent"><%- lang('landing.newsErrorLoadSpan') %></span>
|
||||
</div>
|
||||
<div id="newsErrorFailed" style="display: none;">
|
||||
<span id="nEFailedSpan" class="newsErrorContent"><%- lang('landing.newsErrorFailedSpan') %></span>
|
||||
<button id="newsErrorRetry"><%- lang('landing.newsErrorRetryButton') %></button>
|
||||
</div>
|
||||
<div id="newsErrorNone" style="display: none;">
|
||||
<span id="nENoneSpan" class="newsErrorContent"><%- lang('landing.newsErrorNoneSpan') %></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div id="newsContent" article="-1" style="display: none;">-->
|
||||
<!-- <div id="newsStatusContainer">-->
|
||||
<!-- <div id="newsStatusContent">-->
|
||||
<!-- <div id="newsTitleContainer">-->
|
||||
<!-- <a id="newsArticleTitle" href="#">Lorem Ipsum</a>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsMetaContainer">-->
|
||||
<!-- <div id="newsArticleDateWrapper">-->
|
||||
<!-- <span id="newsArticleDate">Mar 15, 44 BC, 9:14 AM</span>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsArticleAuthorWrapper">-->
|
||||
<!-- <span id="newsArticleAuthor">by Cicero</span>-->
|
||||
<!-- </div>-->
|
||||
<!-- <a href="#" id="newsArticleComments">0 Comments</a>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsNavigationContainer">-->
|
||||
<!-- <button id="newsNavigateLeft">-->
|
||||
<!-- <svg id="newsNavigationLeftSVG" viewBox="0 0 24.87 13.97">-->
|
||||
<!-- <defs>-->
|
||||
<!-- <style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;transition: 0.25s ease;}</style>-->
|
||||
<!-- </defs>-->
|
||||
<!-- <polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>-->
|
||||
<!-- </svg>-->
|
||||
<!-- </button>-->
|
||||
<!-- <span id="newsNavigationStatus"><%- lang('landing.newsNavigationStatus', { currentPage: 1, totalPages: 1 }) %></span>-->
|
||||
<!-- <button id="newsNavigateRight">-->
|
||||
<!-- <svg id="newsNavigationRightSVG" viewBox="0 0 24.87 13.97">-->
|
||||
<!-- <defs>-->
|
||||
<!-- <style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;transition: 0.25s ease;}</style>-->
|
||||
<!-- </defs>-->
|
||||
<!-- <polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>-->
|
||||
<!-- </svg>-->
|
||||
<!-- </button>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsArticleContainer">-->
|
||||
<!-- <div id="newsArticleContent">-->
|
||||
<!-- <div id="newsArticleContentScrollable">-->
|
||||
<!-- <!– Article Content –>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsErrorContainer">-->
|
||||
<!-- <div id="newsErrorLoading">-->
|
||||
<!-- <span id="nELoadSpan" class="newsErrorContent"><%- lang('landing.newsErrorLoadSpan') %></span>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsErrorFailed" style="display: none;">-->
|
||||
<!-- <span id="nEFailedSpan" class="newsErrorContent"><%- lang('landing.newsErrorFailedSpan') %></span>-->
|
||||
<!-- <button id="newsErrorRetry"><%- lang('landing.newsErrorRetryButton') %></button>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="newsErrorNone" style="display: none;">-->
|
||||
<!-- <span id="nENoneSpan" class="newsErrorContent"><%- lang('landing.newsErrorNoneSpan') %></span>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
<script src="./assets/js/scripts/landing.js"></script>
|
||||
</div>
|
31
app/loginOffline.ejs
Normal file
@ -0,0 +1,31 @@
|
||||
<div id="loginOfflineContainer" style="display: none;">
|
||||
<div id="loginOfflineCancelContainer" > <!--Delete style="" as temp fix-->
|
||||
<button id="loginOfflineCancelButton">
|
||||
<div id="loginOfflineCancelIcon">X</div>
|
||||
<span id="loginOfflineCancelText">Cancel</span>
|
||||
</button>
|
||||
</div>
|
||||
<div id="loginContent">
|
||||
<form id="loginForm" style="margin-top: 2.5em;">
|
||||
<span id="loginSubheader">OFFLINE LOGIN</span>
|
||||
<div class="loginFieldContainer">
|
||||
<input id="loginOfflineUsername" class="loginField" type="text" placeholder="USERNAME"/>
|
||||
</div>
|
||||
<button id="loginOfflineButton" class="loginButton" enabled>
|
||||
<div id="loginOfflineButtonContent">
|
||||
LOGIN
|
||||
<svg id="loginSVG" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.arrowLine{fill:none;stroke:#FFF;stroke-width:2px;transition: 0.25s ease;}</style>
|
||||
</defs>
|
||||
<polyline class="arrowLine" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
||||
<div class="circle-loader">
|
||||
<div class="checkmark draw"></div>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<script src="./assets/js/scripts/loginOffline.js"></script>
|
||||
</div>
|
@ -4,31 +4,19 @@
|
||||
<h2><%- lang('loginOptions.loginOptionsTitle') %></h2>
|
||||
<div class="loginOptionActions">
|
||||
<div class="loginOptionButtonContainer">
|
||||
<button id="loginOptionMicrosoft" class="loginOptionButton">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 23 23">
|
||||
<path fill="#f35325" d="M1 1h10v10H1z" />
|
||||
<path fill="#81bc06" d="M12 1h10v10H12z" />
|
||||
<path fill="#05a6f0" d="M1 12h10v10H1z" />
|
||||
<path fill="#ffba08" d="M12 12h10v10H12z" />
|
||||
</svg>
|
||||
<span><%- lang('loginOptions.loginWithMicrosoft') %></span>
|
||||
<button id="loginOptionSkirdaAuth" class="loginOptionButton">
|
||||
<img class="fit-picture"
|
||||
src="assets/images/icons/skirda.png"
|
||||
alt="Grapefruit slice atop a pile of other slices"
|
||||
style="width: 44px; height: 44px;"/>
|
||||
<span><%- lang('loginOptions.loginWithSkirda') %></span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="loginOptionButtonContainer">
|
||||
<button id="loginOptionMojang" class="loginOptionButton">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
||||
</svg>
|
||||
<span><%- lang('loginOptions.loginWithMojang') %></span>
|
||||
</button>
|
||||
<div id="loginOptionCancelContainer" style="display: none;">
|
||||
<button id="loginOptionCancelButton"><%- lang('loginOptions.cancelButton') %></button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="loginOptionCancelContainer" style="display: none;">
|
||||
<button id="loginOptionCancelButton"><%- lang('loginOptions.cancelButton') %></button>
|
||||
</div>
|
||||
</div>
|
||||
<script src="./assets/js/scripts/loginOptions.js"></script>
|
||||
</div>
|
||||
<script src="./assets/js/scripts/loginOptions.js"></script>
|
||||
</div>
|
42
app/loginSkirda.ejs
Normal file
@ -0,0 +1,42 @@
|
||||
<div id="loginSkirdaAuthContainer" style="display: none;" class="Centered">
|
||||
|
||||
<!--Окно открытия браузера (ожидание ответа)-->
|
||||
<div id="loginSkirdaAuthorizationWindow">
|
||||
<div id="settingsAboutCurrentContent" class="Centered">
|
||||
<div id="settingsAboutCurrentHeadline">
|
||||
<img id="settingsAboutLogo" src="./assets/images/SealCircle.png">
|
||||
<span id="settingsAboutTitle"><%- lang('login.loginSkirdaTitle') %></span>
|
||||
</div>
|
||||
<div id="settingsAboutCurrentVersion" class="Centered">
|
||||
<span><%- lang('login.loginSkirdaInit') %></span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div id="footer-label">-->
|
||||
<!-- <span id="loginSkirdaAuthorizationNote">В случае, если это не произошло, откройте его самостоятельно</span>-->
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
|
||||
<!--Ошибка-->
|
||||
<!-- <div id="loginSkirdaAuthorizationWindow">-->
|
||||
<!-- <div id="settingsAboutCurrentContent" class="Centered">-->
|
||||
<!-- <div id="settingsAboutCurrentHeadline">-->
|
||||
<!-- <img id="settingsAboutLogo" src="./assets/images/SealCircle.png">-->
|
||||
<!-- <span id="settingsAboutTitle">Authorize through Skirda Discord</span>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div id="settingsAboutCurrentVersion" class="Centered">-->
|
||||
<!-- <span>Ошибка при авторизации :(</span>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div class="settingsAboutCurrentContent">-->
|
||||
<!-- <button id="loginSkirdaAuthorizationRetryButton">Повторить</button>-->
|
||||
<!-- <button class="settingsAuthAccountLogOut" style="opacity: 100%;">Отменить</button>-->
|
||||
<!-- </div>-->
|
||||
|
||||
<!-- </div>-->
|
||||
<!-- <div id="settingsAboutButtons">-->
|
||||
<!-- <span id="loginSkirdaAuthorizationNote">Не получается? Обратитесь к администрации проекта за помощью</span>-->
|
||||
<!-- </div> -->
|
||||
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
|
||||
<script src="./assets/js/scripts/loginSkirda.js"></script>
|
@ -22,13 +22,16 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="settingsContainerRight">
|
||||
<div id="settingsTabAccount" class="settingsTab">
|
||||
<div class="settingsTabHeader">
|
||||
<span class="settingsTabHeaderText"><%- lang('settings.tabAccountHeaderText') %></span>
|
||||
<span class="settingsTabHeaderDesc"><%- lang('settings.tabAccountHeaderDesc') %></span>
|
||||
</div>
|
||||
<div class="settingsAuthAccountTypeContainer">
|
||||
|
||||
<!-- Авторизация через Microsoft, удаляем? -->
|
||||
<div class="settingsAuthAccountTypeContainer" style="display: none;">
|
||||
<div class="settingsAuthAccountTypeHeader">
|
||||
<div class="settingsAuthAccountTypeHeaderLeft">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 23 23">
|
||||
@ -45,11 +48,10 @@
|
||||
</div>
|
||||
|
||||
<div class="settingsCurrentAccounts" id="settingsCurrentMicrosoftAccounts">
|
||||
<!-- Microsoft auth accounts populated here. -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settingsAuthAccountTypeContainer">
|
||||
<div class="settingsAuthAccountTypeContainer" style="display: none;">
|
||||
<div class="settingsAuthAccountTypeHeader">
|
||||
<div class="settingsAuthAccountTypeHeaderLeft">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
||||
@ -65,10 +67,50 @@
|
||||
</div>
|
||||
|
||||
<div class="settingsCurrentAccounts" id="settingsCurrentMojangAccounts">
|
||||
<!-- Mojang auth accounts populated here. -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settingsAuthAccountTypeContainer" style="display: none;">
|
||||
<div class="settingsAuthAccountTypeHeader">
|
||||
<div class="settingsAuthAccountTypeHeaderLeft">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
||||
</svg>
|
||||
<span>Offline Accounts</span>
|
||||
</div>
|
||||
<div class="settingsAuthAccountTypeHeaderRight">
|
||||
<button class="settingsAddAuthAccount" id="settingsAddOfflineAccount">+ offline accaunt</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settingsCurrentAccounts" id="settingsCurrentOfflineAccounts">
|
||||
<!-- Offline auth accounts populated here. -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settingsAuthAccountTypeContainer">
|
||||
<div class="settingsAuthAccountTypeHeader">
|
||||
<div class="settingsAuthAccountTypeHeaderLeft">
|
||||
<!-- <svg width="22" height="22" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">-->
|
||||
<!-- <path d="M2 11.6C2 8.23969 2 6.55953 2.65396 5.27606C3.2292 4.14708 4.14708 3.2292 5.27606 2.65396C6.55953 2 8.23969 2 11.6 2H20.4C23.7603 2 25.4405 2 26.7239 2.65396C27.8529 3.2292 28.7708 4.14708 29.346 5.27606C30 6.55953 30 8.23969 30 11.6V20.4C30 23.7603 30 25.4405 29.346 26.7239C28.7708 27.8529 27.8529 28.7708 26.7239 29.346C25.4405 30 23.7603 30 20.4 30H11.6C8.23969 30 6.55953 30 5.27606 29.346C4.14708 28.7708 3.2292 27.8529 2.65396 26.7239C2 25.4405 2 23.7603 2 20.4V11.6Z" fill="white"/>-->
|
||||
<!-- <path d="M23.6361 9.33998C22.212 8.71399 20.6892 8.25903 19.0973 8C18.9018 8.33209 18.6734 8.77875 18.5159 9.13408C16.8236 8.89498 15.1469 8.89498 13.4857 9.13408C13.3283 8.77875 13.0946 8.33209 12.8974 8C11.3037 8.25903 9.77927 8.71565 8.35518 9.3433C5.48276 13.4213 4.70409 17.3981 5.09342 21.3184C6.99856 22.6551 8.84487 23.467 10.66 23.9983C11.1082 23.4189 11.5079 22.8029 11.8523 22.1536C11.1964 21.9195 10.5683 21.6306 9.9748 21.2951C10.1323 21.1856 10.2863 21.071 10.4351 20.9531C14.0551 22.5438 17.9881 22.5438 21.5649 20.9531C21.7154 21.071 21.8694 21.1856 22.0251 21.2951C21.4299 21.6322 20.8 21.9211 20.1442 22.1553C20.4885 22.8029 20.8865 23.4205 21.3364 24C23.1533 23.4687 25.0013 22.6567 26.9065 21.3184C27.3633 16.7738 26.1261 12.8335 23.6361 9.33998ZM12.3454 18.9075C11.2587 18.9075 10.3676 17.9543 10.3676 16.7937C10.3676 15.6331 11.2397 14.6783 12.3454 14.6783C13.4511 14.6783 14.3422 15.6314 14.3232 16.7937C14.325 17.9543 13.4511 18.9075 12.3454 18.9075ZM19.6545 18.9075C18.5678 18.9075 17.6767 17.9543 17.6767 16.7937C17.6767 15.6331 18.5488 14.6783 19.6545 14.6783C20.7602 14.6783 21.6514 15.6314 21.6323 16.7937C21.6323 17.9543 20.7602 18.9075 19.6545 18.9075Z" fill="#5865F2"/>-->
|
||||
<!-- </svg>-->
|
||||
<span><%- lang('settings.skirdaAccount') %>
|
||||
</div>
|
||||
<div class="settingsAuthAccountTypeHeaderRight">
|
||||
<button class="settingsAddAuthAccount" id="settingsAddSkirdaDiscord">Skirda Account</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settingsCurrentAccounts" id="settingsCurrentSkirdaAccounts">
|
||||
<!-- Skirda auth accounts populated here. -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="settingsTabMinecraft" class="settingsTab" style="display: none;">
|
||||
<div class="settingsTabHeader">
|
||||
<span class="settingsTabHeaderText"><%- lang('settings.minecraftTabHeaderText') %></span>
|
||||
@ -328,7 +370,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="settingsAboutButtons">
|
||||
<div id="footer-label">
|
||||
<a href="<%- lang('settings.sourceGithubLink') %>" id="settingsAboutSourceButton" class="settingsAboutButton"><%- lang('settings.sourceGithub') %></a>
|
||||
<!-- The following must be included in third-party usage. -->
|
||||
<!-- <a href="https://github.com/dscalzi/HeliosLauncher" id="settingsAboutSourceButton" class="settingsAboutButton">Original Source</a> -->
|
||||
|
@ -1,3 +1,4 @@
|
||||
owner: dscalzi
|
||||
repo: HeliosLauncher
|
||||
provider: github
|
||||
owner: Skirda
|
||||
repo: SkirdaElectronLauncher
|
||||
provider: generic
|
||||
url:
|
@ -1,8 +1,8 @@
|
||||
appId: 'helioslauncher'
|
||||
productName: 'Helios Launcher'
|
||||
appId: 'skirdalauncher'
|
||||
productName: 'Skirda Launcher'
|
||||
artifactName: '${productName}-setup-${version}.${ext}'
|
||||
|
||||
copyright: 'Copyright © 2018-2022 Daniel Scalzi'
|
||||
copyright: 'Copyright © 2018-2024 Daniel Scalzi'
|
||||
|
||||
asar: true
|
||||
compression: 'maximum'
|
||||
@ -39,9 +39,9 @@ mac:
|
||||
# Linux Configuration
|
||||
linux:
|
||||
target: 'AppImage'
|
||||
maintainer: 'Daniel Scalzi'
|
||||
vendor: 'Daniel Scalzi'
|
||||
synopsis: 'Modded Minecraft Launcher'
|
||||
maintainer: 'Greg Brzezinski'
|
||||
vendor: 'Greg Brzezinski'
|
||||
synopsis: 'Minecraft Launcher for Skirda Servers'
|
||||
description: 'Custom launcher which allows users to join modded servers. All mods, configurations, and updates are handled automatically.'
|
||||
category: 'Game'
|
||||
|
||||
|
2413
package-lock.json
generated
102
package.json
@ -1,51 +1,51 @@
|
||||
{
|
||||
"name": "helioslauncher",
|
||||
"version": "2.1.0",
|
||||
"productName": "Helios Launcher",
|
||||
"description": "Modded Minecraft Launcher",
|
||||
"author": "Daniel Scalzi (https://github.com/dscalzi/)",
|
||||
"license": "UNLICENSED",
|
||||
"homepage": "https://github.com/dscalzi/HeliosLauncher",
|
||||
"bugs": {
|
||||
"url": "https://github.com/dscalzi/HeliosLauncher/issues"
|
||||
},
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"dist": "electron-builder build",
|
||||
"dist:win": "npm run dist -- -w",
|
||||
"dist:mac": "npm run dist -- -m",
|
||||
"dist:linux": "npm run dist -- -l",
|
||||
"lint": "eslint --config .eslintrc.json ."
|
||||
},
|
||||
"engines": {
|
||||
"node": "18.x.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.1.0",
|
||||
"adm-zip": "^0.5.9",
|
||||
"discord-rpc-patch": "^4.0.1",
|
||||
"ejs": "^3.1.9",
|
||||
"ejs-electron": "^2.1.1",
|
||||
"electron-updater": "^6.1.7",
|
||||
"fs-extra": "^11.1.1",
|
||||
"github-syntax-dark": "^0.5.0",
|
||||
"got": "^11.8.5",
|
||||
"helios-core": "~2.1.0",
|
||||
"helios-distribution-types": "^1.3.0",
|
||||
"jquery": "^3.7.1",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"semver": "^7.5.4",
|
||||
"toml": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^27.1.3",
|
||||
"electron-builder": "^24.9.1",
|
||||
"eslint": "^8.55.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/dscalzi/HeliosLauncher.git"
|
||||
}
|
||||
}
|
||||
{
|
||||
"name": "helioslauncher",
|
||||
"version": "2.2.1",
|
||||
"productName": "Helios Launcher",
|
||||
"description": "Modded Minecraft Launcher",
|
||||
"author": "Daniel Scalzi (https://github.com/dscalzi/)",
|
||||
"license": "UNLICENSED",
|
||||
"homepage": "https://github.com/dscalzi/HeliosLauncher",
|
||||
"bugs": {
|
||||
"url": "https://github.com/dscalzi/HeliosLauncher/issues"
|
||||
},
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"dist": "electron-builder build",
|
||||
"dist:win": "npm run dist -- -w",
|
||||
"dist:mac": "npm run dist -- -m",
|
||||
"dist:linux": "npm run dist -- -l",
|
||||
"lint": "eslint --config .eslintrc.json ."
|
||||
},
|
||||
"engines": {
|
||||
"node": "20.x.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.1.2",
|
||||
"adm-zip": "^0.5.16",
|
||||
"discord-rpc-patch": "^4.0.1",
|
||||
"ejs": "^3.1.10",
|
||||
"ejs-electron": "^3.0.0",
|
||||
"electron-updater": "^6.3.9",
|
||||
"fs-extra": "^11.1.1",
|
||||
"github-syntax-dark": "^0.5.0",
|
||||
"got": "^11.8.5",
|
||||
"helios-core": "~2.2.3",
|
||||
"helios-distribution-types": "^1.3.0",
|
||||
"jquery": "^3.7.1",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"semver": "^7.6.3",
|
||||
"toml": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^33.2.1",
|
||||
"electron-builder": "^25.1.8",
|
||||
"eslint": "^8.57.1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/dscalzi/HeliosLauncher.git"
|
||||
}
|
||||
}
|