Compare commits

...

39 Commits

Author SHA1 Message Date
f39b26a4ff fixes 2024-01-28 09:36:25 +03:00
7dcbc4c907 Merge branch 'offline-mode' of https://git.brzezinski.ru/Skirda/SkirdaElectronLauncher into offline-mode 2024-01-27 11:24:48 +03:00
f768ce99e7 fix auth bugs 2024-01-27 11:24:46 +03:00
4089c9a47c disable print servstats 2024-01-27 10:53:02 +03:00
9e078df32a Disable dev account validates suppress 2024-01-27 10:52:46 +03:00
494b221638 Fix translation 2024-01-27 10:52:29 +03:00
0795219071 Hide unused authorizations 2024-01-24 09:33:25 +03:00
346704ad1d Backgrounds replace 2024-01-24 09:09:52 +03:00
c41402c525 url 2024-01-21 23:21:57 +03:00
fe5590287e prod 2024-01-21 23:21:16 +03:00
5c373ca66c production addresses 2024-01-14 21:38:50 +03:00
3e8f52a200 auth fix 2024-01-14 20:33:14 +03:00
c1d8dbed47 merge 2024-01-13 20:59:43 +03:00
f2840be1a6 debug urls 2024-01-13 20:58:56 +03:00
496841a776 version branding 2024-01-13 20:58:50 +03:00
80e3c1cc6a add custom auth server args 2024-01-13 20:58:28 +03:00
34bdf62bbd wwwwwwwwwwwwwww 2024-01-13 20:54:43 +03:00
a16b8a3643 Callback page 2024-01-09 23:09:57 +03:00
58c7ab1865 temp fix auth 2024-01-09 22:03:58 +03:00
aca9136137 Merge remote-tracking branch 'origin/offline-mode' into offline-mode 2024-01-09 21:55:36 +03:00
4f82e5cb7f Translation fixes 2024-01-09 21:55:28 +03:00
309873c959 new urls 2024-01-09 21:53:04 +03:00
b6a53e5e05 Discord authorization window 2024-01-09 20:45:22 +03:00
54f10a0c74 bump version 2024-01-09 18:51:59 +03:00
faed705340 update 2024-01-09 18:50:55 +03:00
2f38081026 package lock 2024-01-09 18:50:23 +03:00
7f11f5b247 update depends 2024-01-09 18:50:15 +03:00
291f5399b7 change brandings 2024-01-09 18:48:54 +03:00
291a571b22 work on auth 2024-01-09 17:44:56 +03:00
f813f9d675 idea project 2024-01-08 20:47:28 +03:00
f2a15f747f Unicode Font (Manrope) 2024-01-08 18:39:58 +03:00
906b3942a7 ru_RU translation 2024-01-08 18:20:49 +03:00
ee3c7c5147 Remove social buttons 2024-01-08 18:20:32 +03:00
b43242db4a CSS from old version 2024-01-08 18:19:35 +03:00
fcb7f22965 temp dynmap landing 2024-01-08 16:43:51 +03:00
b5327c71fc test mine login and custom dist urls 2024-01-08 15:40:02 +03:00
Daniel Scalzi
95eebc18a7
2.1.1 2024-01-04 19:09:30 -05:00
Daniel Scalzi
d03ff90f78
Remove mojang authserver as it has been permanently shut down. 2024-01-04 19:09:03 -05:00
30e635a3b9 Stable offline mode 2023-12-30 02:34:48 +03:00
48 changed files with 2458 additions and 1172 deletions

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View 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>

View File

@ -0,0 +1,14 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<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>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View 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>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<includedPredefinedLibrary name="Node.js Core" />
</component>
</project>

8
.idea/modules.xml Normal file
View 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 Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

Binary file not shown.

Binary file not shown.

184
Callback/index.html Normal file
View 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="settingsAboutButtons">
<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="settingsAboutButtons">
<span id="loginSkirdaAuthorizationNote">Skirda Launcher</span>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -33,6 +33,8 @@
<%- include('login') %>
<%- include('waiting') %>
<%- include('loginOptions') %>
<%- include('loginOffline') %>
<%- include('loginSkirdaDiscord') %>
<%- include('settings') %>
<%- include('landing') %>
</div>

View File

@ -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 {
@ -3966,3 +3966,139 @@ input:checked + .toggleSwitchSlider:before {
.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;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 KiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 KiB

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 MiB

After

Width:  |  Height:  |  Size: 92 KiB

View File

@ -29,14 +29,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 +63,25 @@ exports.addMojangAccount = async function(username, password) {
}
}
/**
* @param {string} uuid
* @param {string} accessToken
* @param {string} username
* @param {string} displayName
* @param {string} skirdaToken
* */
exports.addSkirdaAccount = async function(uuid, accessToken, username, displayName, skirdaToken){
const ret = ConfigManager.addSkirdaAccount(uuid, accessToken, username, displayName, skirdaToken)
ConfigManager.save()
return ret
}
exports.addOfflineAccount = async function(usernameOffline){
//TODO: check for forbidden symbols and lenght!!
ConfigManager.addOfflineAccount(usernameOffline)
}
const AUTH_MODE = { FULL: 0, MS_REFRESH: 1, MC_REFRESH: 2 }
/**
@ -72,7 +97,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 +225,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
@ -232,6 +294,40 @@ async function validateSelectedMojangAccount(){
}
}
}
// require('./scripts/loginSkirdaDiscord')
/**
* 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()
const result = await SkirdaDiscordAuth.ValidateAccount(current.accessToken)
// const response = await MojangRestAPI.validate(current.accessToken, ConfigManager.getClientToken())
// const isValid = response.data
if(!result){
const refreshResponse = await MojangRestAPI.refresh(current.accessToken, ConfigManager.getClientToken())
if(refreshResponse.responseStatus === RestResponseStatus.SUCCESS) {
const session = refreshResponse.data
ConfigManager.updateMojangAuthAccount(current.uuid, session.accessToken)
ConfigManager.save()
} else {
log.error('Error while validating selected profile:', refreshResponse.error)
log.info('Account access token is invalid.')
return false
}
log.info('Account access token validated.')
return true
} else {
log.info('Account access token validated.')
return true
}
}
/**
@ -306,10 +402,14 @@ async function validateSelectedMicrosoftAccount(){
exports.validateSelected = async function(){
const current = ConfigManager.getSelectedAccount()
if(current.type === 'microsoft') {
return await validateSelectedMicrosoftAccount()
} else {
switch (current.type) {
case 'mojang':
return await validateSelectedMojangAccount()
// break
case 'microsoft':
return await validateSelectedMicrosoftAccount()
// break
case 'skirda':
return await validateSelectedSkirdaAccount()
}
}

View File

@ -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, displayName, skirdaToken){
config.selectedAccount = uuid
config.authenticationDatabase[uuid] = {
type: 'skirda',
accessToken,
username: username.trim(),
uuid: uuid.trim(),
displayName: displayName.trim(),
skirdaJWT: skirdaToken
}
return config.authenticationDatabase[uuid]
}
/**
* Update the tokens of an authenticated microsoft account.
*

View File

@ -4,7 +4,13 @@ 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 = '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'
const api = new DistributionAPI(
ConfigManager.getLauncherDirectory(),

View File

@ -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')

View File

@ -350,6 +350,10 @@ class ProcessBuilder {
}
}
/**
* Construct the argument array that will be passed to the JVM process.
* This function is for 1.12 and below.
@ -359,9 +363,7 @@ class ProcessBuilder {
* @returns {Array.<string>} An array containing the full JVM arguments for this process.
*/
_constructJVMArguments112(mods, tempNativePath){
let args = []
// Classpath Argument
args.push('-cp')
args.push(this.classpathArg(mods, tempNativePath).join(ProcessBuilder.getClasspathSeparator()))
@ -404,6 +406,15 @@ class ProcessBuilder {
// Debug securejarhandler
// args.push('-Dbsl.debug=true')
// args.push('-Dminecraft.api.auth.host=http://localhost:8083/yggdrasil/auth')
// args.push('-Dminecraft.api.account.host=http://localhost:8083/yggdrasil/account')
// args.push('-Dminecraft.api.session.host=http://localhost:8083/yggdrasil')
// args.push('-Dminecraft.api.services.host=http://localhost:8083/yggdrasil/services')
args.push('-Dminecraft.api.auth.host=https://skirda-auth.brzezinski.ru/yggdrasil/auth')
args.push('-Dminecraft.api.account.host=https://skirda-auth.brzezinski.ru/yggdrasil/account')
args.push('-Dminecraft.api.session.host=https://skirda-auth.brzezinski.ru/yggdrasil')
args.push('-Dminecraft.api.services.host=https://skirda-auth.brzezinski.ru/yggdrasil/services')
if(this.modManifest.arguments.jvm != null) {
for(const argStr of this.modManifest.arguments.jvm) {

View File

@ -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.

View 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)
}
})

View File

@ -1,6 +1,8 @@
const loginOptionsCancelContainer = document.getElementById('loginOptionCancelContainer')
const loginOptionMicrosoft = document.getElementById('loginOptionMicrosoft')
const loginOptionMojang = document.getElementById('loginOptionMojang')
const loginOptionOffline = document.getElementById('loginOptionOffline')
const loginOptionSkirdaDiskord = document.getElementById('loginOptionSkirdaDiscord')
const loginOptionsCancelButton = document.getElementById('loginOptionCancelButton')
let loginOptionsCancellable = false
@ -36,6 +38,24 @@ loginOptionMojang.onclick = (e) => {
})
}
loginOptionOffline.onclick = (e) => {
switchView(getCurrentView(), VIEWS.loginOffline, 500, 500, () => {
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
loginViewOnCancel = loginOptionsViewOnLoginCancel
loginCancelEnabled(true)
})
}
loginOptionSkirdaDiscord.onclick = (e) => {
InitSkirdaDiscordLogin()
switchView(getCurrentView(), VIEWS.loginSkirdaDiscord, 500, 500, () => {
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
loginViewOnCancel = loginOptionsViewOnLoginCancel
loginCancelEnabled(true)
})
}
loginOptionsCancelButton.onclick = (e) => {
switchView(getCurrentView(), loginOptionsViewOnCancel, 500, 500, () => {
// Clear login values (Mojang login)

View File

@ -0,0 +1,177 @@
// const http = require('http')
// const fs = require('fs')
// const {addSkirdaAccount} = require('configmanager')
// const auth_api_url = 'http://192.168.88.10:8083'
// const auth_api_url = 'http://localhost:8083'
const auth_api_url = 'http://skirda-auth.brzezinski.ru'
function uuidv4() {
return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
)
}
class SkirdaDiscordAuth{
/**
* @typedef {Object} DiscordRedirectAuth
* @property {string} redirectUrl how the person is called
* @property {string} requestId how many years the person lived
*
* @return {Promise<DiscordRedirectAuth | string>}
* */
static temp_installId = uuidv4()
static async Init(){
const resp = await fetch(`${auth_api_url}/v1/auth/discord/init?installId=${SkirdaDiscordAuth.temp_installId}`)
if (resp.statusCode !== 200){
return await resp.text()
}
return await resp.json()
}
/**
* @param requestId {string} Request id from init route
// * @param timeout {number} Timeout to poll in seconds
* @return {SkirdaUserResp | string} Result of OAuth login
*/
static async CyclePolling(requestId){
for (let i = 0; i < 15; i++) {
const resp = await SkirdaDiscordAuth._poll(requestId)
switch (resp.status){
case 204:
await SkirdaDiscordAuth._sleep(4000)
continue
case 200:
return await resp.json()
default:
console.error(await resp.text())
return 'TODO error'
}
}
}
/**
* @typedef {Object} SkYggAuthResponse
* @property {string} ClientToken
* @property {string} AccessToken
* @property {YggProfile} Profile
*
* @typedef {Object} YggProfile
* @property {string} name
* @property {string} UUID
*
* @param jwtToken {string} JWT Token for auth
* @return {YggProfile | string} Result of auth
*/
static async YggdrasilAuth(jwtToken){
const resp = await fetch(`${auth_api_url}/yggdrasil/skirda/authenticate`, {
headers:{
'Content-Type': 'application/json',
'Authorization': jwtToken
}
})
if (resp.statusCode !== 200){
return await resp.text()
}
return await resp.json()
}
/**
* @typedef {Object} SkirdaUserResp
* @property skirdaUserId {string}
* @property username {string}
* @property token {string}
*
* @param requestId {string}
* @return {Response}
* */
static async _poll(requestId){
return await fetch(`${auth_api_url}/v1/auth/discord/periodicPolling?installId=${SkirdaDiscordAuth.temp_installId}&requestId=${requestId}`)
}
static _sleepSetTimeout_ctrl
/**
* @param ms {number}
* @return {boolean}
*/
static async _sleep(ms) {
clearInterval(this._sleepSetTimeout_ctrl)
return new Promise(resolve => this._sleepSetTimeout_ctrl = setTimeout(resolve, ms))
}
static async ValidateAccount(jwtToken) {
const resp = await fetch(`${auth_api_url}/v1/auth/refresh`,{
headers:{
'Content-Type': 'application/json',
'Authorization': jwtToken
}
})
// console.log(resp, resp.statusCode)
return resp.status === 200
}
}
// const skAuth = new SkirdaDiscordAuth()
const loginSkirdaDiscordButton = document.getElementById('loginSkirdaDiscordInitAuth')
/**
* @return boolean
* */
async function InitSkirdaDiscordLogin (){
const res = await SkirdaDiscordAuth.Init()
let redir
try {
redir = JSON.parse(res)
} catch (e) {
SpawnError(Lang.queryJS('login.error.unknown'))
return
}
// console.log(redir)
const resOpenUrl = await shell.openExternal(redir.redirectUrl)
const skirdaAuth = await SkirdaDiscordAuth.CyclePolling(redir.requestId)
//TODO validate resp
// console.log(skirdaAuth)
if (typeof skirdaAuth.token !== 'string'){
SpawnError(Lang.queryJS('login.error.unknown'))
return
}
const yggAuth = await SkirdaDiscordAuth.YggdrasilAuth(skirdaAuth.token)
let yggAuthRes
try {
yggAuthRes = JSON.parse(yggAuth)
} catch (e) {
SpawnError(Lang.queryJS('login.error.unknown'))
return
}
// console.log(yggAuthRes)
AuthManager.addSkirdaAccount(yggAuthRes.profile.id, skirdaAuth.token, skirdaAuth.skirdaUserId, yggAuthRes.profile.name, skirdaAuth.token).then((value) => {
updateSelectedAccount(value)
})
setTimeout(() => {
switchView(VIEWS.loginSkirdaDiscord, VIEWS.landing, 500, 500)
}, 1000)
}
function SpawnError(actualDisplayableError){
setOverlayContent(actualDisplayableError.title, actualDisplayableError.desc, Lang.queryJS('login.tryAgain'))
setOverlayHandler(() => {
formDisabled(false)
toggleOverlay(false)
})
toggleOverlay(true)
}

View File

@ -351,6 +351,12 @@ document.getElementById('settingsAddMojangAccount').onclick = (e) => {
})
}
document.getElementById('settingsAddSkirdaDiscord').onclick = (e) => {
// console.log("kekekekekek")
switchView(getCurrentView(), VIEWS.loginSkirdaDiscord, 500, 500, () => {
})
}
// Bind the add microsoft account button.
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
@ -513,12 +519,14 @@ function processLogOut(val, isLastAccount){
const uuid = parent.getAttribute('uuid')
const prevSelAcc = ConfigManager.getSelectedAccount()
const targetAcc = ConfigManager.getAuthAccount(uuid)
if(targetAcc.type === 'microsoft') {
switch (targetAcc.type){
case 'microsoft':
msAccDomElementCache = parent
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
})
} else {
break
case 'mojang':
AuthManager.removeMojangAccount(uuid).then(() => {
if(!isLastAccount && uuid === prevSelAcc.uuid){
const selAcc = ConfigManager.getSelectedAccount()
@ -536,7 +544,25 @@ function processLogOut(val, isLastAccount){
$(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 +646,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 +662,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 +693,33 @@ function populateAuthAccounts(){
</div>
</div>`
if(acc.type === 'microsoft') {
switch (acc.type){
case 'microsoft':
microsoftAuthAccountStr += accHtml
} else {
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 +1501,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')

View File

@ -18,9 +18,12 @@ const VIEWS = {
landing: '#landingContainer',
loginOptions: '#loginOptionsContainer',
login: '#loginContainer',
loginSkirdaDiscord: '#loginSkirdaDiscordContainer',
loginOffline: '#loginOfflineContainer',
settings: '#settingsContainer',
welcome: '#welcomeContainer',
waiting: '#waitingContainer'
waiting: '#waitingContainer',
dynmap: '#dynmapContainer'
}
// The currently shown view container.
@ -76,9 +79,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){
// if(!isDev && isLoggedIn){
validateSelectedAccount()
}
// }
if(ConfigManager.isFirstLaunch()){
currentView = VIEWS.welcome

View File

View File

@ -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"

View File

@ -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"
@ -122,6 +123,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.."

300
app/assets/lang/ru_RU.toml Normal file
View File

@ -0,0 +1,300 @@
[ejs.landing]
updateAvailableTooltip = "Доступно обновление"
usernamePlaceholder = "Никнейм"
usernameEditButton = "Изм."
settingsTooltip = "Настройки"
serverStatus = "СЕРВЕР"
serverStatusPlaceholder = "ОФФЛАЙН"
mojangStatus = "Статус серверов Mojang"
mojangStatusTooltipTitle = "Сервисы"
mojangStatusNETitle = "Остальное"
newsButton = "КАРТА"
launchButton = "ИГРАТЬ"
launchButtonPlaceholder = "&#8226; Сервер не запущен"
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."
[ejs.loginOptions]
loginOptionsTitle = "Опции входа"
loginWithMicrosoft = "Зайти с помощью Microsoft"
loginWithMojang = "Зайти с помощью Mojang"
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 = "Выбранный аккаунт &#10004;"
[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
View 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>
&#10;<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>

View File

@ -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>
&#10;<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>
&#10;<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">
<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;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>
<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>
&#10;<span id="dynmapDoneButtonText"><%- lang('landing.MapButton') %></span>
</button>
</div>
</div>
<div id="newsArticleContainer">
<div id="newsArticleContent">
<div id="newsArticleContentScrollable">
<!-- Article Content -->
</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>
<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">-->
<!-- &lt;!&ndash; Article Content &ndash;&gt;-->
<!-- </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
View 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>

View File

@ -3,7 +3,8 @@
<div class="loginOptionsMainContent">
<h2><%- lang('loginOptions.loginOptionsTitle') %></h2>
<div class="loginOptionActions">
<div class="loginOptionButtonContainer">
<!-- Отключенные авторизации -->
<div class="loginOptionButtonContainer" style="display: none;">
<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" />
@ -14,7 +15,7 @@
<span><%- lang('loginOptions.loginWithMicrosoft') %></span>
</button>
</div>
<div class="loginOptionButtonContainer">
<div class="loginOptionButtonContainer" style="display: none;">
<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" />
@ -24,6 +25,36 @@
<span><%- lang('loginOptions.loginWithMojang') %></span>
</button>
</div>
<div class="loginOptionButtonContainer" style="display: none;">
<button id="loginOptionOffline" 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> -->
<span>Offline</span>
</button>
</div>
<!-- Авторизация через Discord -->
<div class="loginOptionButtonContainer">
<button id="loginOptionSkirdaDiscord" class="loginOptionButton">
<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>Дискорд</span>
</button>
</div>
<!-- Авторизация через FIDO (неактивна) -->
<div class="loginOptionButtonContainer">
<button id="loginOptionSkirdaFIDO" class="loginOptionButton" style="color: gray; background: rgb(0 0 0 / 0%);cursor: not-allowed;">
<svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 32 32" viewBox="0 0 32 32" id="fidoalliance"><path fill="#FFF9DD" d="M26,32H6c-3.314,0-6-2.686-6-6V6c0-3.314,2.686-6,6-6h20c3.314,0,6,2.686,6,6v20C32,29.314,29.314,32,26,32z"></path><path fill="#FFD200" d="M21.845 14.904c-1.37 0-2.268.874-2.268 2.247 0 1.373.95 2.182 2.19 2.182 1.134 0 2.233-.707 2.233-2.26C23.999 15.8 23.137 14.904 21.845 14.904zM21.802 18.388L21.802 18.388c-.567-.001-.87-.542-.87-1.272 0-.622.246-1.264.87-1.264.594 0 .841.636.841 1.258C22.643 17.882 22.314 18.388 21.802 18.388zM8.817 19.235h1.31v-3.256h.817v-.962h-.817v-.51c-.001-.014-.001-.029-.001-.045 0-.168.06-.321.159-.441l-.001.001-.001.001c.014-.015.027-.029.042-.041l.001-.001.001-.001c0 0 .282-.279.947-.095h.001l.324-1.087c-.072-.025-.159-.049-.25-.067l-.012-.002-.013-.002c-.167-.039-.359-.063-.556-.063-.003 0-.006 0-.01 0 0 0 0 0-.001 0-.001 0-.002 0-.004 0-.251 0-.494.038-.724.106-.092.027-.171.06-.247.099-.173.088-.321.195-.45.321-.341.333-.514.785-.514 1.342v.481H8v.963h.817V19.235z"></path><path fill="#FFD200" d="M10.019,12.775l-0.018,0.005c0.009-0.003,0.02-0.004,0.029-0.007c0.003-0.001,0.004-0.002,0.007-0.003L10.019,12.775z"></path><polygon fill="#FFD200" points="9.778 12.874 9.771 12.877 9.783 12.872 9.786 12.87"></polygon><path fill="#FFE777" d="M13.352,14.426c0.408,0,0.739-0.329,0.74-0.736v-0.001c0-0.407-0.331-0.737-0.74-0.737c-0.408,0-0.74,0.33-0.74,0.737C12.612,14.095,12.944,14.426,13.352,14.426z"></path><polygon fill="#FFE777" points="11.37 15.98 12.698 15.98 12.698 19.236 13.178 19.236 13.178 17.386 13.525 17.386 13.525 19.236 14.009 19.236 14.009 15.017 11.37 15.017"></polygon><path fill="#FFD200" d="M16.496,14.904c-1.015,0-1.907,0.832-1.899,2.255c0,1.315,0.805,2.175,1.813,2.175c0.543,0,1.064-0.245,1.319-0.707l0.08,0.607h1.138v-6.188h-1.318l0.001,2.336h-0.015C17.418,15.098,17.026,14.904,16.496,14.904z M17.629,17.354c0,0.104-0.008,0.206-0.022,0.306c-0.075,0.361-0.391,0.627-0.77,0.627h-0.009c-0.543,0-0.899-0.448-0.899-1.17c0-0.664,0.304-1.201,0.906-1.201c0.413,0,0.697,0.297,0.776,0.643c0.01,0.061,0.016,0.132,0.016,0.204l-0.001,0.036L17.629,17.354z"></path></svg>
<span>FIDO (сейчас недоступно)</span>
</button>
</div>
</div>
<div id="loginOptionCancelContainer" style="display: none;">
<button id="loginOptionCancelButton"><%- lang('loginOptions.cancelButton') %></button>

View File

@ -0,0 +1,42 @@
<div id="loginSkirdaDiscordContainer" 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">Authorize through Skirda Discord</span>
</div>
<div id="settingsAboutCurrentVersion" class="Centered">
<span>Мы открыли браузер для дальнейшей авторизации через Discord</span>
</div>
</div>
<div id="settingsAboutButtons">
<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/loginSkirdaDiscord.js"></script>

View File

@ -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 Discord 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>

View File

@ -1,3 +1,4 @@
owner: dscalzi
repo: HeliosLauncher
provider: github
owner: Skirda
repo: SkirdaElectronLauncher
provider: generic
url:

View File

@ -1,5 +1,5 @@
appId: 'helioslauncher'
productName: 'Helios Launcher'
appId: 'skirdalauncher'
productName: 'Skirda Launcher'
artifactName: '${productName}-setup-${version}.${ext}'
copyright: 'Copyright © 2018-2022 Daniel Scalzi'
@ -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'

82
package-lock.json generated
View File

@ -1,16 +1,17 @@
{
"name": "helioslauncher",
"version": "2.1.0",
"name": "skirdalauncher",
"version": "2.1.1-skirda",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "helioslauncher",
"version": "2.1.0",
"name": "skirdalauncher",
"version": "2.1.1-skirda",
"license": "UNLICENSED",
"dependencies": {
"@electron/remote": "^2.1.0",
"adm-zip": "^0.5.9",
"bluebird": "^3.7.2",
"discord-rpc-patch": "^4.0.1",
"ejs": "^3.1.9",
"ejs-electron": "^2.1.1",
@ -18,17 +19,18 @@
"fs-extra": "^11.1.1",
"github-syntax-dark": "^0.5.0",
"got": "^11.8.5",
"helios-core": "~2.1.0",
"helios-core": "~2.1.1",
"helios-distribution-types": "^1.3.0",
"jquery": "^3.7.1",
"lodash.merge": "^4.6.2",
"rest-client-sdk": "^7.0.0-rc.10",
"semver": "^7.5.4",
"toml": "^3.0.0"
},
"devDependencies": {
"electron": "^27.1.3",
"electron-builder": "^24.9.1",
"eslint": "^8.55.0"
"eslint": "^8.56.0"
},
"engines": {
"node": "18.x.x"
@ -383,9 +385,9 @@
}
},
"node_modules/@eslint/js": {
"version": "8.55.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
"integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
"version": "8.56.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -644,6 +646,11 @@
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
"integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
},
"node_modules/@types/urijs": {
"version": "1.19.25",
"resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz",
"integrity": "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg=="
},
"node_modules/@types/verror": {
"version": "1.10.9",
"resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz",
@ -916,8 +923,7 @@
"node_modules/bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"node_modules/bluebird-lst": {
"version": "1.0.9",
@ -1337,6 +1343,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/deep-diff": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz",
"integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg=="
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@ -1720,15 +1731,15 @@
}
},
"node_modules/eslint": {
"version": "8.55.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
"integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
"version": "8.56.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.55.0",
"@eslint/js": "8.56.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@ -1936,9 +1947,9 @@
"dev": true
},
"node_modules/fastq": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
"integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
"integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
"dependencies": {
"reusify": "^1.0.4"
}
@ -2331,11 +2342,11 @@
}
},
"node_modules/helios-core": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/helios-core/-/helios-core-2.1.0.tgz",
"integrity": "sha512-3RvGMJ0RDzgdZF3e0o2VtBz/NCeucDVIopz9p3GA9tjy2cl7ll8HVHSXiLG5YE1JiINU5Akacv5L6MT1g6xZuA==",
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/helios-core/-/helios-core-2.1.1.tgz",
"integrity": "sha512-un9QtEofI3jR8I1aoXodJhwoQyjUvJ34/Rc8PFsvNgMyWv25F4/i4AWgRX/pZKHpy8rtyS2SwgoBSKHV1WA1DA==",
"dependencies": {
"fastq": "^1.15.0",
"fastq": "^1.16.0",
"fs-extra": "^11.2.0",
"got": "^11.8.6",
"luxon": "^3.4.4",
@ -3122,6 +3133,15 @@
"node": ">=10.4.0"
}
},
"node_modules/pluralize": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
"integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
"optional": true,
"engines": {
"node": ">=4"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@ -3270,6 +3290,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/rest-client-sdk": {
"version": "7.0.0-rc.10",
"resolved": "https://registry.npmjs.org/rest-client-sdk/-/rest-client-sdk-7.0.0-rc.10.tgz",
"integrity": "sha512-5zkj/tO7fAIik/QLMKwRNNf+pG3Ajytz88FH+7XLn2ZnGTPqwPMJrLrJO9MpU/DmKgo9eTpPH4CSZfsR1hLOGw==",
"dependencies": {
"@types/urijs": "^1.19.9",
"deep-diff": "^1.0.2",
"urijs": "^1.19.2"
},
"optionalDependencies": {
"pluralize": "^8.0.0"
}
},
"node_modules/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
@ -3807,6 +3840,11 @@
"punycode": "^2.1.0"
}
},
"node_modules/urijs": {
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
"integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="
},
"node_modules/utf8-byte-length": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",

View File

@ -1,8 +1,8 @@
{
"name": "helioslauncher",
"version": "2.1.0",
"productName": "Helios Launcher",
"description": "Modded Minecraft Launcher",
"name": "skirdalauncher",
"version": "2.1.1-skirda",
"productName": "Skirda Launcher",
"description": "Launcher for Skirda Minecraft servers",
"author": "Daniel Scalzi (https://github.com/dscalzi/)",
"license": "UNLICENSED",
"homepage": "https://github.com/dscalzi/HeliosLauncher",
@ -25,6 +25,7 @@
"dependencies": {
"@electron/remote": "^2.1.0",
"adm-zip": "^0.5.9",
"bluebird": "^3.7.2",
"discord-rpc-patch": "^4.0.1",
"ejs": "^3.1.9",
"ejs-electron": "^2.1.1",
@ -32,17 +33,18 @@
"fs-extra": "^11.1.1",
"github-syntax-dark": "^0.5.0",
"got": "^11.8.5",
"helios-core": "~2.1.0",
"helios-core": "~2.1.1",
"helios-distribution-types": "^1.3.0",
"jquery": "^3.7.1",
"lodash.merge": "^4.6.2",
"rest-client-sdk": "^7.0.0-rc.10",
"semver": "^7.5.4",
"toml": "^3.0.0"
},
"devDependencies": {
"electron": "^27.1.3",
"electron-builder": "^24.9.1",
"eslint": "^8.55.0"
"eslint": "^8.56.0"
},
"repository": {
"type": "git",