mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-11-15 03:31:15 +03:00
[ANY] IDEA Reformat
This commit is contained in:
parent
3521f5882d
commit
3a9ec5db61
112 changed files with 994 additions and 979 deletions
|
@ -6,8 +6,8 @@ stages:
|
||||||
- deploy
|
- deploy
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
# - echo `pwd` # debug
|
# - echo `pwd` # debug
|
||||||
# - echo "$CI_BUILD_NAME, $CI_BUILD_REF_NAME $CI_BUILD_STAGE" # debug
|
# - echo "$CI_BUILD_NAME, $CI_BUILD_REF_NAME $CI_BUILD_STAGE" # debug
|
||||||
- export GRADLE_USER_HOME=`pwd`/.gradle
|
- export GRADLE_USER_HOME=`pwd`/.gradle
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
|
@ -34,4 +34,4 @@ test:
|
||||||
- ./gradlew check
|
- ./gradlew check
|
||||||
|
|
||||||
after_script:
|
after_script:
|
||||||
- echo "End CI"
|
- echo "End CI"
|
||||||
|
|
|
@ -16,4 +16,4 @@ cache:
|
||||||
- $HOME/.gradle/caches/
|
- $HOME/.gradle/caches/
|
||||||
- $HOME/.gradle/wrapper/
|
- $HOME/.gradle/wrapper/
|
||||||
script:
|
script:
|
||||||
- ./gradlew build
|
- ./gradlew build
|
||||||
|
|
|
@ -81,8 +81,8 @@ bundle project(':Radon')
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOnlyA 'com.google.guava:guava:26.0-jre'
|
compileOnlyA 'com.google.guava:guava:26.0-jre'
|
||||||
compileOnlyA 'log4j:log4j:1.2.17' // Do not update (laggy dep).
|
compileOnlyA 'log4j:log4j:1.2.17' // Do not update (laggy dep).
|
||||||
compileOnlyA 'org.apache.logging.log4j:log4j-core:2.11.2'
|
compileOnlyA 'org.apache.logging.log4j:log4j-core:2.11.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
task hikari(type: Copy) {
|
task hikari(type: Copy) {
|
||||||
|
|
|
@ -81,7 +81,7 @@ public static final class Config {
|
||||||
public String[] mirrors;
|
public String[] mirrors;
|
||||||
|
|
||||||
public String binaryName;
|
public String binaryName;
|
||||||
|
|
||||||
public boolean copyBinaries = true;
|
public boolean copyBinaries = true;
|
||||||
|
|
||||||
public LauncherConfig.LauncherEnvironment env;
|
public LauncherConfig.LauncherEnvironment env;
|
||||||
|
@ -200,8 +200,8 @@ public void verify() {
|
||||||
throw new NullPointerException("Netty must not be null");
|
throw new NullPointerException("Netty must not be null");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void init()
|
|
||||||
{
|
public void init() {
|
||||||
Launcher.applyLauncherEnv(env);
|
Launcher.applyLauncherEnv(env);
|
||||||
for (AuthProviderPair provider : auth) {
|
for (AuthProviderPair provider : auth) {
|
||||||
provider.init();
|
provider.init();
|
||||||
|
@ -229,8 +229,7 @@ public void close() {
|
||||||
LaunchServer.server.unregisterObject("auth.".concat(pair.name).concat(".handler"), pair.handler);
|
LaunchServer.server.unregisterObject("auth.".concat(pair.name).concat(".handler"), pair.handler);
|
||||||
LaunchServer.server.unregisterObject("auth.".concat(pair.name).concat(".texture"), pair.textureProvider);
|
LaunchServer.server.unregisterObject("auth.".concat(pair.name).concat(".texture"), pair.textureProvider);
|
||||||
}
|
}
|
||||||
} catch (Exception e)
|
} catch (Exception e) {
|
||||||
{
|
|
||||||
LogHelper.error(e);
|
LogHelper.error(e);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -265,8 +264,7 @@ public static class ExeConf {
|
||||||
public String txtProductVersion;
|
public String txtProductVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LauncherConf
|
public class LauncherConf {
|
||||||
{
|
|
||||||
public String guardType;
|
public String guardType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,13 +282,13 @@ public class NettyConfig {
|
||||||
public LogLevel logLevel = LogLevel.DEBUG;
|
public LogLevel logLevel = LogLevel.DEBUG;
|
||||||
public NettyProxyConfig proxy = new NettyProxyConfig();
|
public NettyProxyConfig proxy = new NettyProxyConfig();
|
||||||
}
|
}
|
||||||
public class NettyPerformanceConfig
|
|
||||||
{
|
public class NettyPerformanceConfig {
|
||||||
public int bossThread;
|
public int bossThread;
|
||||||
public int workerThread;
|
public int workerThread;
|
||||||
}
|
}
|
||||||
public class NettyProxyConfig
|
|
||||||
{
|
public class NettyProxyConfig {
|
||||||
public boolean enabled;
|
public boolean enabled;
|
||||||
public String address = "ws://localhost:9275/api";
|
public String address = "ws://localhost:9275/api";
|
||||||
public String login = "login";
|
public String login = "login";
|
||||||
|
@ -298,8 +296,8 @@ public class NettyProxyConfig
|
||||||
public String auth_id = "std";
|
public String auth_id = "std";
|
||||||
public ArrayList<String> requests = new ArrayList<>();
|
public ArrayList<String> requests = new ArrayList<>();
|
||||||
}
|
}
|
||||||
public class NettyBindAddress
|
|
||||||
{
|
public class NettyBindAddress {
|
||||||
public String address;
|
public String address;
|
||||||
public int port;
|
public int port;
|
||||||
|
|
||||||
|
@ -346,8 +344,8 @@ public static void main(String... args) throws Throwable {
|
||||||
LogHelper.printVersion("LaunchServer");
|
LogHelper.printVersion("LaunchServer");
|
||||||
LogHelper.printLicense("LaunchServer");
|
LogHelper.printLicense("LaunchServer");
|
||||||
if (!StarterAgent.isAgentStarted()) {
|
if (!StarterAgent.isAgentStarted()) {
|
||||||
LogHelper.error("StarterAgent is not started!");
|
LogHelper.error("StarterAgent is not started!");
|
||||||
LogHelper.error("Your should add to JVM options this option: `-javaagent:LaunchServer.jar`");
|
LogHelper.error("Your should add to JVM options this option: `-javaagent:LaunchServer.jar`");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start LaunchServer
|
// Start LaunchServer
|
||||||
|
@ -371,7 +369,7 @@ public static void main(String... args) throws Throwable {
|
||||||
|
|
||||||
public final Path dir;
|
public final Path dir;
|
||||||
|
|
||||||
public final boolean testEnv;
|
public final boolean testEnv;
|
||||||
|
|
||||||
public final Path launcherLibraries;
|
public final Path launcherLibraries;
|
||||||
|
|
||||||
|
@ -478,16 +476,16 @@ public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException
|
||||||
if (testEnv)
|
if (testEnv)
|
||||||
localCommandHandler = new StdCommandHandler(false);
|
localCommandHandler = new StdCommandHandler(false);
|
||||||
else
|
else
|
||||||
try {
|
try {
|
||||||
Class.forName("org.jline.terminal.Terminal");
|
Class.forName("org.jline.terminal.Terminal");
|
||||||
|
|
||||||
// JLine2 available
|
// JLine2 available
|
||||||
localCommandHandler = new JLineCommandHandler();
|
localCommandHandler = new JLineCommandHandler();
|
||||||
LogHelper.info("JLine2 terminal enabled");
|
LogHelper.info("JLine2 terminal enabled");
|
||||||
} catch (ClassNotFoundException ignored) {
|
} catch (ClassNotFoundException ignored) {
|
||||||
localCommandHandler = new StdCommandHandler(true);
|
localCommandHandler = new StdCommandHandler(true);
|
||||||
LogHelper.warning("JLine2 isn't in classpath, using std");
|
LogHelper.warning("JLine2 isn't in classpath, using std");
|
||||||
}
|
}
|
||||||
ru.gravit.launchserver.command.handler.CommandHandler.registerCommands(localCommandHandler);
|
ru.gravit.launchserver.command.handler.CommandHandler.registerCommands(localCommandHandler);
|
||||||
commandHandler = localCommandHandler;
|
commandHandler = localCommandHandler;
|
||||||
|
|
||||||
|
@ -530,14 +528,11 @@ public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException
|
||||||
try (BufferedReader reader = IOHelper.newReader(configFile)) {
|
try (BufferedReader reader = IOHelper.newReader(configFile)) {
|
||||||
config = Launcher.gsonManager.gson.fromJson(reader, Config.class);
|
config = Launcher.gsonManager.gson.fromJson(reader, Config.class);
|
||||||
}
|
}
|
||||||
if(!Files.exists(runtimeConfigFile))
|
if (!Files.exists(runtimeConfigFile)) {
|
||||||
{
|
|
||||||
LogHelper.info("Reset LaunchServer runtime config file");
|
LogHelper.info("Reset LaunchServer runtime config file");
|
||||||
runtime = new LaunchServerRuntimeConfig();
|
runtime = new LaunchServerRuntimeConfig();
|
||||||
runtime.reset();
|
runtime.reset();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
LogHelper.info("Reading LaunchServer runtime config file");
|
LogHelper.info("Reading LaunchServer runtime config file");
|
||||||
try (BufferedReader reader = IOHelper.newReader(runtimeConfigFile)) {
|
try (BufferedReader reader = IOHelper.newReader(runtimeConfigFile)) {
|
||||||
runtime = Launcher.gsonManager.gson.fromJson(reader, LaunchServerRuntimeConfig.class);
|
runtime = Launcher.gsonManager.gson.fromJson(reader, LaunchServerRuntimeConfig.class);
|
||||||
|
@ -642,14 +637,14 @@ public static void initGson() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private LauncherBinary binary() {
|
private LauncherBinary binary() {
|
||||||
if (launcherEXEBinaryClass != null) {
|
if (launcherEXEBinaryClass != null) {
|
||||||
try {
|
try {
|
||||||
return launcherEXEBinaryClass.getConstructor(LaunchServer.class).newInstance(this);
|
return launcherEXEBinaryClass.getConstructor(LaunchServer.class).newInstance(this);
|
||||||
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
|
||||||
| InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
| InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
||||||
LogHelper.error(e);
|
LogHelper.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Class.forName("net.sf.launch4j.Builder");
|
Class.forName("net.sf.launch4j.Builder");
|
||||||
if (config.launch4j.enabled) return new EXEL4JLauncherBinary(this);
|
if (config.launch4j.enabled) return new EXEL4JLauncherBinary(this);
|
||||||
|
@ -672,10 +667,8 @@ public void close() {
|
||||||
config.close();
|
config.close();
|
||||||
modulesManager.close();
|
modulesManager.close();
|
||||||
LogHelper.info("Save LaunchServer runtime config");
|
LogHelper.info("Save LaunchServer runtime config");
|
||||||
try(Writer writer = IOHelper.newWriter(runtimeConfigFile))
|
try (Writer writer = IOHelper.newWriter(runtimeConfigFile)) {
|
||||||
{
|
if (Launcher.gsonManager.configGson != null) {
|
||||||
if(Launcher.gsonManager.configGson != null)
|
|
||||||
{
|
|
||||||
Launcher.gsonManager.configGson.toJson(runtime, writer);
|
Launcher.gsonManager.configGson.toJson(runtime, writer);
|
||||||
} else {
|
} else {
|
||||||
LogHelper.error("Error writing LaunchServer runtime config file. Gson is null");
|
LogHelper.error("Error writing LaunchServer runtime config file. Gson is null");
|
||||||
|
@ -724,7 +717,7 @@ private void generateConfigIfNotExists(boolean testEnv) throws IOException {
|
||||||
|
|
||||||
newConfig.netty = new NettyConfig();
|
newConfig.netty = new NettyConfig();
|
||||||
newConfig.netty.fileServerEnabled = true;
|
newConfig.netty.fileServerEnabled = true;
|
||||||
newConfig.netty.binds = new NettyBindAddress[]{ new NettyBindAddress("0.0.0.0", 9274) };
|
newConfig.netty.binds = new NettyBindAddress[]{new NettyBindAddress("0.0.0.0", 9274)};
|
||||||
newConfig.netty.performance = new NettyPerformanceConfig();
|
newConfig.netty.performance = new NettyPerformanceConfig();
|
||||||
newConfig.netty.performance.bossThread = 2;
|
newConfig.netty.performance.bossThread = 2;
|
||||||
newConfig.netty.performance.workerThread = 8;
|
newConfig.netty.performance.workerThread = 8;
|
||||||
|
@ -752,25 +745,23 @@ private void generateConfigIfNotExists(boolean testEnv) throws IOException {
|
||||||
// Set server address
|
// Set server address
|
||||||
String address;
|
String address;
|
||||||
if (testEnv) {
|
if (testEnv) {
|
||||||
address = "localhost";
|
address = "localhost";
|
||||||
newConfig.setProjectName("test");
|
newConfig.setProjectName("test");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("LaunchServer address(default: localhost): ");
|
System.out.println("LaunchServer address(default: localhost): ");
|
||||||
address = commandHandler.readLine();
|
address = commandHandler.readLine();
|
||||||
System.out.println("LaunchServer projectName: ");
|
System.out.println("LaunchServer projectName: ");
|
||||||
newConfig.setProjectName(commandHandler.readLine());
|
newConfig.setProjectName(commandHandler.readLine());
|
||||||
}
|
}
|
||||||
if(address == null || address.isEmpty())
|
if (address == null || address.isEmpty()) {
|
||||||
{
|
|
||||||
LogHelper.error("Address null. Using localhost");
|
LogHelper.error("Address null. Using localhost");
|
||||||
address = "localhost";
|
address = "localhost";
|
||||||
}
|
}
|
||||||
if(newConfig.projectName == null || newConfig.projectName.isEmpty())
|
if (newConfig.projectName == null || newConfig.projectName.isEmpty()) {
|
||||||
{
|
|
||||||
LogHelper.error("ProjectName null. Using MineCraft");
|
LogHelper.error("ProjectName null. Using MineCraft");
|
||||||
newConfig.projectName = "MineCraft";
|
newConfig.projectName = "MineCraft";
|
||||||
}
|
}
|
||||||
|
|
||||||
newConfig.legacyAddress = address;
|
newConfig.legacyAddress = address;
|
||||||
newConfig.netty.address = "ws://" + address + ":9274/api";
|
newConfig.netty.address = "ws://" + address + ":9274/api";
|
||||||
newConfig.netty.downloadURL = "http://" + address + ":9274/%dirname%/";
|
newConfig.netty.downloadURL = "http://" + address + ":9274/%dirname%/";
|
||||||
|
@ -820,8 +811,8 @@ public void run() {
|
||||||
|
|
||||||
// Add shutdown hook, then start LaunchServer
|
// Add shutdown hook, then start LaunchServer
|
||||||
if (!this.testEnv) {
|
if (!this.testEnv) {
|
||||||
JVMHelper.RUNTIME.addShutdownHook(CommonHelper.newThread(null, false, this::close));
|
JVMHelper.RUNTIME.addShutdownHook(CommonHelper.newThread(null, false, this::close));
|
||||||
CommonHelper.newThread("Command Thread", true, commandHandler).start();
|
CommonHelper.newThread("Command Thread", true, commandHandler).start();
|
||||||
}
|
}
|
||||||
rebindServerSocket();
|
rebindServerSocket();
|
||||||
if (config.netty != null)
|
if (config.netty != null)
|
||||||
|
@ -867,7 +858,8 @@ public void syncUpdatesDir(Collection<String> dirs) throws IOException {
|
||||||
// Resolve name and verify is dir
|
// Resolve name and verify is dir
|
||||||
String name = IOHelper.getFileName(updateDir);
|
String name = IOHelper.getFileName(updateDir);
|
||||||
if (!IOHelper.isDir(updateDir)) {
|
if (!IOHelper.isDir(updateDir)) {
|
||||||
if (!IOHelper.isFile(updateDir) && Arrays.asList(".jar", ".exe", ".hash").stream().noneMatch(e -> updateDir.toString().endsWith(e))) LogHelper.warning("Not update dir: '%s'", name);
|
if (!IOHelper.isFile(updateDir) && Arrays.asList(".jar", ".exe", ".hash").stream().noneMatch(e -> updateDir.toString().endsWith(e)))
|
||||||
|
LogHelper.warning("Not update dir: '%s'", name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -918,6 +910,7 @@ public void registerObject(String name, Object object) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unregisterObject(String name, Object object) {
|
public void unregisterObject(String name, Object object) {
|
||||||
if (object instanceof Reloadable) {
|
if (object instanceof Reloadable) {
|
||||||
reloadManager.unregisterReloadable(name);
|
reloadManager.unregisterReloadable(name);
|
||||||
|
|
|
@ -15,31 +15,34 @@
|
||||||
public final class StarterAgent {
|
public final class StarterAgent {
|
||||||
|
|
||||||
private static final class StarterVisitor extends SimpleFileVisitor<Path> {
|
private static final class StarterVisitor extends SimpleFileVisitor<Path> {
|
||||||
private static final Set<PosixFilePermission> DPERMS;
|
private static final Set<PosixFilePermission> DPERMS;
|
||||||
static {
|
|
||||||
Set<PosixFilePermission> perms = new HashSet<>(Arrays.asList(PosixFilePermission.values()));
|
static {
|
||||||
perms.remove(PosixFilePermission.OTHERS_WRITE);
|
Set<PosixFilePermission> perms = new HashSet<>(Arrays.asList(PosixFilePermission.values()));
|
||||||
perms.remove(PosixFilePermission.GROUP_WRITE);
|
perms.remove(PosixFilePermission.OTHERS_WRITE);
|
||||||
DPERMS = Collections.unmodifiableSet(perms);
|
perms.remove(PosixFilePermission.GROUP_WRITE);
|
||||||
}
|
DPERMS = Collections.unmodifiableSet(perms);
|
||||||
|
}
|
||||||
|
|
||||||
private final Path filef;
|
private final Path filef;
|
||||||
private final boolean fixLib;
|
private final boolean fixLib;
|
||||||
|
|
||||||
private StarterVisitor() {
|
private StarterVisitor() {
|
||||||
this.filef = StarterAgent.libraries.resolve(".libraries_chmoded");
|
this.filef = StarterAgent.libraries.resolve(".libraries_chmoded");
|
||||||
this.fixLib = !Files.exists(filef) && !Boolean.getBoolean("launcher.noLibrariesPosixPermsFix");
|
this.fixLib = !Files.exists(filef) && !Boolean.getBoolean("launcher.noLibrariesPosixPermsFix");
|
||||||
if (fixLib) {
|
if (fixLib) {
|
||||||
try {
|
try {
|
||||||
Files.deleteIfExists(filef);
|
Files.deleteIfExists(filef);
|
||||||
Files.createFile(filef);
|
Files.createFile(filef);
|
||||||
} catch (Throwable ignored) { }
|
} catch (Throwable ignored) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||||
if (fixLib && Files.getFileAttributeView(file, PosixFileAttributeView.class) != null) Files.setPosixFilePermissions(file, DPERMS);
|
if (fixLib && Files.getFileAttributeView(file, PosixFileAttributeView.class) != null)
|
||||||
|
Files.setPosixFilePermissions(file, DPERMS);
|
||||||
if (file.toFile().getName().endsWith(".jar"))
|
if (file.toFile().getName().endsWith(".jar"))
|
||||||
inst.appendToSystemClassLoaderSearch(new JarFile(file.toFile()));
|
inst.appendToSystemClassLoaderSearch(new JarFile(file.toFile()));
|
||||||
return super.visitFile(file, attrs);
|
return super.visitFile(file, attrs);
|
||||||
|
|
|
@ -11,24 +11,24 @@ public class JsonAuthHandler extends CachedAuthHandler {
|
||||||
public URL getUrl;
|
public URL getUrl;
|
||||||
public URL updateAuthUrl;
|
public URL updateAuthUrl;
|
||||||
public URL updateServerIdUrl;
|
public URL updateServerIdUrl;
|
||||||
public class EntryRequestByUsername
|
|
||||||
{
|
public class EntryRequestByUsername {
|
||||||
public String username;
|
public String username;
|
||||||
|
|
||||||
public EntryRequestByUsername(String username) {
|
public EntryRequestByUsername(String username) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class EntryRequestByUUID
|
|
||||||
{
|
public class EntryRequestByUUID {
|
||||||
public UUID uuid;
|
public UUID uuid;
|
||||||
|
|
||||||
public EntryRequestByUUID(UUID uuid) {
|
public EntryRequestByUUID(UUID uuid) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class UpdateAuthRequest
|
|
||||||
{
|
public class UpdateAuthRequest {
|
||||||
public UUID uuid;
|
public UUID uuid;
|
||||||
public String username;
|
public String username;
|
||||||
public String accessToken;
|
public String accessToken;
|
||||||
|
@ -39,8 +39,8 @@ public UpdateAuthRequest(UUID uuid, String username, String accessToken) {
|
||||||
this.accessToken = accessToken;
|
this.accessToken = accessToken;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class UpdateServerIDRequest
|
|
||||||
{
|
public class UpdateServerIDRequest {
|
||||||
public UUID uuid;
|
public UUID uuid;
|
||||||
public String serverID;
|
public String serverID;
|
||||||
|
|
||||||
|
@ -49,10 +49,11 @@ public UpdateServerIDRequest(UUID uuid, String serverID) {
|
||||||
this.serverID = serverID;
|
this.serverID = serverID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class SuccessResponse
|
|
||||||
{
|
public class SuccessResponse {
|
||||||
public boolean success;
|
public boolean success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Entry fetchEntry(String username) throws IOException {
|
protected Entry fetchEntry(String username) throws IOException {
|
||||||
return Launcher.gsonManager.configGson.fromJson(HTTPRequest.jsonRequest(Launcher.gsonManager.configGson.toJsonTree(new EntryRequestByUsername(username)), getUrl), Entry.class);
|
return Launcher.gsonManager.configGson.fromJson(HTTPRequest.jsonRequest(Launcher.gsonManager.configGson.toJsonTree(new EntryRequestByUsername(username)), getUrl), Entry.class);
|
||||||
|
|
|
@ -38,10 +38,10 @@ protected Entry fetchEntry(UUID uuid) throws IOException {
|
||||||
String accessToken = parts[1];
|
String accessToken = parts[1];
|
||||||
String serverID = parts[2];
|
String serverID = parts[2];
|
||||||
if (LogHelper.isDebugEnabled()) {
|
if (LogHelper.isDebugEnabled()) {
|
||||||
LogHelper.debug("[AuthHandler] Got username: " + username);
|
LogHelper.debug("[AuthHandler] Got username: " + username);
|
||||||
LogHelper.debug("[AuthHandler] Got accessToken: " + accessToken);
|
LogHelper.debug("[AuthHandler] Got accessToken: " + accessToken);
|
||||||
LogHelper.debug("[AuthHandler] Got serverID: " + serverID);
|
LogHelper.debug("[AuthHandler] Got serverID: " + serverID);
|
||||||
LogHelper.debug("[AuthHandler] Got UUID: " + uuid);
|
LogHelper.debug("[AuthHandler] Got UUID: " + uuid);
|
||||||
}
|
}
|
||||||
return new Entry(uuid, username, accessToken, serverID);
|
return new Entry(uuid, username, accessToken, serverID);
|
||||||
}
|
}
|
||||||
|
@ -54,31 +54,31 @@ protected Entry fetchEntry(String username) throws IOException {
|
||||||
String accessToken = parts[1];
|
String accessToken = parts[1];
|
||||||
String serverID = parts[2];
|
String serverID = parts[2];
|
||||||
if (LogHelper.isDebugEnabled()) {
|
if (LogHelper.isDebugEnabled()) {
|
||||||
LogHelper.debug("[AuthHandler] Got username: " + username);
|
LogHelper.debug("[AuthHandler] Got username: " + username);
|
||||||
LogHelper.debug("[AuthHandler] Got accessToken: " + accessToken);
|
LogHelper.debug("[AuthHandler] Got accessToken: " + accessToken);
|
||||||
LogHelper.debug("[AuthHandler] Got serverID: " + serverID);
|
LogHelper.debug("[AuthHandler] Got serverID: " + serverID);
|
||||||
LogHelper.debug("[AuthHandler] Got UUID: " + uuid);
|
LogHelper.debug("[AuthHandler] Got UUID: " + uuid);
|
||||||
}
|
}
|
||||||
return new Entry(uuid, username, accessToken, serverID);
|
return new Entry(uuid, username, accessToken, serverID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean updateAuth(UUID uuid, String username, String accessToken) throws IOException {
|
protected boolean updateAuth(UUID uuid, String username, String accessToken) throws IOException {
|
||||||
String response = IOHelper.request(new URL(CommonHelper.replace(updateAuth, "user", IOHelper.urlEncode(username), "uuid", IOHelper.urlEncode(uuid.toString()), "token", IOHelper.urlEncode(accessToken))));
|
String response = IOHelper.request(new URL(CommonHelper.replace(updateAuth, "user", IOHelper.urlEncode(username), "uuid", IOHelper.urlEncode(uuid.toString()), "token", IOHelper.urlEncode(accessToken))));
|
||||||
if (LogHelper.isDebugEnabled()) {
|
if (LogHelper.isDebugEnabled()) {
|
||||||
LogHelper.debug("[AuthHandler] Set accessToken: " + accessToken);
|
LogHelper.debug("[AuthHandler] Set accessToken: " + accessToken);
|
||||||
LogHelper.debug("[AuthHandler] Set UUID: " + uuid);
|
LogHelper.debug("[AuthHandler] Set UUID: " + uuid);
|
||||||
LogHelper.debug("[AuthHandler] For this username: " + username);
|
LogHelper.debug("[AuthHandler] For this username: " + username);
|
||||||
}
|
}
|
||||||
return goodResponse.equals(response);
|
return goodResponse.equals(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean updateServerID(UUID uuid, String serverID) throws IOException {
|
protected boolean updateServerID(UUID uuid, String serverID) throws IOException {
|
||||||
String response = IOHelper.request(new URL(CommonHelper.replace(updateAuth, "serverid", IOHelper.urlEncode(serverID), "uuid", IOHelper.urlEncode(uuid.toString()))));
|
String response = IOHelper.request(new URL(CommonHelper.replace(updateAuth, "serverid", IOHelper.urlEncode(serverID), "uuid", IOHelper.urlEncode(uuid.toString()))));
|
||||||
if (LogHelper.isDebugEnabled()) {
|
if (LogHelper.isDebugEnabled()) {
|
||||||
LogHelper.debug("[AuthHandler] Set serverID: " + serverID);
|
LogHelper.debug("[AuthHandler] Set serverID: " + serverID);
|
||||||
LogHelper.debug("[AuthHandler] For this UUID: " + uuid);
|
LogHelper.debug("[AuthHandler] For this UUID: " + uuid);
|
||||||
}
|
}
|
||||||
return goodResponse.equals(response);
|
return goodResponse.equals(response);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ public abstract class ProtectHandler {
|
||||||
private static boolean registredHandl = false;
|
private static boolean registredHandl = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static void registerHandlers() {
|
public static void registerHandlers() {
|
||||||
if (!registredHandl) {
|
if (!registredHandl) {
|
||||||
providers.register("none", NoProtectHandler.class);
|
providers.register("none", NoProtectHandler.class);
|
||||||
|
@ -19,7 +18,9 @@ public static void registerHandlers() {
|
||||||
public abstract String generateSecureToken(AuthResponse.AuthContext context); //Генерация токена для передачи его в LauncherGuardInterface
|
public abstract String generateSecureToken(AuthResponse.AuthContext context); //Генерация токена для передачи его в LauncherGuardInterface
|
||||||
|
|
||||||
public abstract String generateClientSecureToken();
|
public abstract String generateClientSecureToken();
|
||||||
|
|
||||||
public abstract boolean verifyClientSecureToken(String token, String secureKey);
|
public abstract boolean verifyClientSecureToken(String token, String secureKey);
|
||||||
|
|
||||||
public abstract boolean allowGetAccessToken(AuthResponse.AuthContext context);
|
public abstract boolean allowGetAccessToken(AuthResponse.AuthContext context);
|
||||||
|
|
||||||
public abstract void checkLaunchServerLicense(); //Выдает SecurityException при ошибке проверки лицензии
|
public abstract void checkLaunchServerLicense(); //Выдает SecurityException при ошибке проверки лицензии
|
||||||
|
|
|
@ -45,8 +45,8 @@ public final boolean sync() throws IOException {
|
||||||
|
|
||||||
return exists;
|
return exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Path resolve(LaunchServer server, String ext) {
|
public static Path resolve(LaunchServer server, String ext) {
|
||||||
return server.config.copyBinaries ? server.updatesDir.resolve(server.config.binaryName + ext) : server.dir.resolve(server.config.binaryName + ext);
|
return server.config.copyBinaries ? server.updatesDir.resolve(server.config.binaryName + ext) : server.dir.resolve(server.config.binaryName + ext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,28 +35,28 @@ public String getName() {
|
||||||
public Path process(Path inputFile) throws IOException {
|
public Path process(Path inputFile) throws IOException {
|
||||||
Path out = server.launcherBinary.nextPath("post-fixed");
|
Path out = server.launcherBinary.nextPath("post-fixed");
|
||||||
try (ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(out))) {
|
try (ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(out))) {
|
||||||
apply(inputFile, inputFile, output, server, (e) -> false);
|
apply(inputFile, inputFile, output, server, (e) -> false);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void apply(Path inputFile, Path addFile, ZipOutputStream output, LaunchServer srv, Predicate<ZipEntry> excluder) throws IOException {
|
public static void apply(Path inputFile, Path addFile, ZipOutputStream output, LaunchServer srv, Predicate<ZipEntry> excluder) throws IOException {
|
||||||
try (ClassMetadataReader reader = new ClassMetadataReader()) {
|
try (ClassMetadataReader reader = new ClassMetadataReader()) {
|
||||||
reader.getCp().add(new JarFile(inputFile.toFile()));
|
reader.getCp().add(new JarFile(inputFile.toFile()));
|
||||||
List<JarFile> libs = srv.launcherBinary.coreLibs.stream().map(e -> {
|
List<JarFile> libs = srv.launcherBinary.coreLibs.stream().map(e -> {
|
||||||
try {
|
try {
|
||||||
return new JarFile(e.toFile());
|
return new JarFile(e.toFile());
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
throw new RuntimeException(e1);
|
throw new RuntimeException(e1);
|
||||||
}
|
}
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
libs.addAll(srv.launcherBinary.addonLibs.stream().map(e -> {
|
libs.addAll(srv.launcherBinary.addonLibs.stream().map(e -> {
|
||||||
try {
|
try {
|
||||||
return new JarFile(e.toFile());
|
return new JarFile(e.toFile());
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
throw new RuntimeException(e1);
|
throw new RuntimeException(e1);
|
||||||
}
|
}
|
||||||
}).collect(Collectors.toList()));
|
}).collect(Collectors.toList()));
|
||||||
try (ZipInputStream input = IOHelper.newZipInput(addFile)) {
|
try (ZipInputStream input = IOHelper.newZipInput(addFile)) {
|
||||||
ZipEntry e = input.getNextEntry();
|
ZipEntry e = input.getNextEntry();
|
||||||
while (e != null) {
|
while (e != null) {
|
||||||
|
|
|
@ -26,10 +26,8 @@ public String getUsageDescription() {
|
||||||
public void invoke(String... args) throws Exception {
|
public void invoke(String... args) throws Exception {
|
||||||
verifyArgs(args, 1);
|
verifyArgs(args, 1);
|
||||||
List<HWID> target = server.config.hwidHandler.getHwid(args[0]);
|
List<HWID> target = server.config.hwidHandler.getHwid(args[0]);
|
||||||
for(HWID hwid : target)
|
for (HWID hwid : target) {
|
||||||
{
|
if (hwid == null) {
|
||||||
if(hwid == null)
|
|
||||||
{
|
|
||||||
LogHelper.error("HWID %s: null", args[0]);
|
LogHelper.error("HWID %s: null", args[0]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,7 @@ public void invoke(String... args) throws Exception {
|
||||||
if (args[0].equals("stop")) {
|
if (args[0].equals("stop")) {
|
||||||
handler.close();
|
handler.close();
|
||||||
}
|
}
|
||||||
if (args[0].equals("eventAll"))
|
if (args[0].equals("eventAll")) {
|
||||||
{
|
|
||||||
WebSocketFrameHandler.service.sendObjectAll(new PingEvent());
|
WebSocketFrameHandler.service.sendObjectAll(new PingEvent());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ public static void registerCommands(ru.gravit.utils.command.CommandHandler handl
|
||||||
basic.registerCommand("loadModule", new LoadModuleCommand(server));
|
basic.registerCommand("loadModule", new LoadModuleCommand(server));
|
||||||
basic.registerCommand("modules", new ModulesCommand(server));
|
basic.registerCommand("modules", new ModulesCommand(server));
|
||||||
basic.registerCommand("test", new TestCommand(server));
|
basic.registerCommand("test", new TestCommand(server));
|
||||||
Category basicCategory = new Category(basic,"basic", "Base LaunchServer commands");
|
Category basicCategory = new Category(basic, "basic", "Base LaunchServer commands");
|
||||||
handler.registerCategory(basicCategory);
|
handler.registerCategory(basicCategory);
|
||||||
|
|
||||||
// Register sync commands
|
// Register sync commands
|
||||||
|
@ -50,7 +50,7 @@ public static void registerCommands(ru.gravit.utils.command.CommandHandler handl
|
||||||
updates.registerCommand("syncBinaries", new SyncBinariesCommand(server));
|
updates.registerCommand("syncBinaries", new SyncBinariesCommand(server));
|
||||||
updates.registerCommand("syncUpdates", new SyncUpdatesCommand(server));
|
updates.registerCommand("syncUpdates", new SyncUpdatesCommand(server));
|
||||||
updates.registerCommand("syncProfiles", new SyncProfilesCommand(server));
|
updates.registerCommand("syncProfiles", new SyncProfilesCommand(server));
|
||||||
Category updatesCategory = new Category(updates,"updates", "Update and Sync Management");
|
Category updatesCategory = new Category(updates, "updates", "Update and Sync Management");
|
||||||
handler.registerCategory(updatesCategory);
|
handler.registerCategory(updatesCategory);
|
||||||
|
|
||||||
// Register auth commands
|
// Register auth commands
|
||||||
|
@ -61,14 +61,14 @@ public static void registerCommands(ru.gravit.utils.command.CommandHandler handl
|
||||||
auth.registerCommand("ban", new BanCommand(server));
|
auth.registerCommand("ban", new BanCommand(server));
|
||||||
auth.registerCommand("unban", new UnbanCommand(server));
|
auth.registerCommand("unban", new UnbanCommand(server));
|
||||||
auth.registerCommand("getHWID", new GetHWIDCommand(server));
|
auth.registerCommand("getHWID", new GetHWIDCommand(server));
|
||||||
Category authCategory = new Category(auth,"auth", "User Management");
|
Category authCategory = new Category(auth, "auth", "User Management");
|
||||||
handler.registerCategory(authCategory);
|
handler.registerCategory(authCategory);
|
||||||
|
|
||||||
//Register dump commands
|
//Register dump commands
|
||||||
BaseCommandCategory dump = new BaseCommandCategory();
|
BaseCommandCategory dump = new BaseCommandCategory();
|
||||||
dump.registerCommand("dumpSessions", new DumpSessionsCommand(server));
|
dump.registerCommand("dumpSessions", new DumpSessionsCommand(server));
|
||||||
dump.registerCommand("dumpEntryCache", new DumpEntryCacheCommand(server));
|
dump.registerCommand("dumpEntryCache", new DumpEntryCacheCommand(server));
|
||||||
Category dumpCategory = new Category(dump,"dump", "Dump runtime data");
|
Category dumpCategory = new Category(dump, "dump", "Dump runtime data");
|
||||||
handler.registerCategory(dumpCategory);
|
handler.registerCategory(dumpCategory);
|
||||||
|
|
||||||
//Register service commands
|
//Register service commands
|
||||||
|
@ -86,7 +86,7 @@ public static void registerCommands(ru.gravit.utils.command.CommandHandler handl
|
||||||
service.registerCommand("component", new ComponentCommand(server));
|
service.registerCommand("component", new ComponentCommand(server));
|
||||||
service.registerCommand("givePermission", new GivePermissionsCommand(server));
|
service.registerCommand("givePermission", new GivePermissionsCommand(server));
|
||||||
service.registerCommand("getPermissions", new GetPermissionsCommand(server));
|
service.registerCommand("getPermissions", new GetPermissionsCommand(server));
|
||||||
Category serviceCategory = new Category(service,"service", "Managing LaunchServer Components");
|
Category serviceCategory = new Category(service, "service", "Managing LaunchServer Components");
|
||||||
handler.registerCategory(serviceCategory);
|
handler.registerCategory(serviceCategory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,7 @@ public void invoke(String... args) {
|
||||||
LogHelper.info("Uptime: %d days %d hours %d minutes %d seconds", days, hour, min, second);
|
LogHelper.info("Uptime: %d days %d hours %d minutes %d seconds", days, hour, min, second);
|
||||||
LogHelper.info("Uptime (double): %f", (double) JVMHelper.RUNTIME_MXBEAN.getUptime() / 1000);
|
LogHelper.info("Uptime (double): %f", (double) JVMHelper.RUNTIME_MXBEAN.getUptime() / 1000);
|
||||||
int commands = server.commandHandler.getBaseCategory().commandsMap().size();
|
int commands = server.commandHandler.getBaseCategory().commandsMap().size();
|
||||||
for(CommandHandler.Category category : server.commandHandler.getCategories())
|
for (CommandHandler.Category category : server.commandHandler.getCategories()) {
|
||||||
{
|
|
||||||
commands += category.category.commandsMap().size();
|
commands += category.category.commandsMap().size();
|
||||||
}
|
}
|
||||||
LogHelper.info("Sessions: %d | Modules: %d | Commands: %d(%d categories)", server.sessionManager.getSessions().size(), server.modulesManager.modules.size(), commands, server.commandHandler.getCategories().size() + 1);
|
LogHelper.info("Sessions: %d | Modules: %d | Commands: %d(%d categories)", server.sessionManager.getSessions().size(), server.modulesManager.modules.size(), commands, server.commandHandler.getCategories().size() + 1);
|
||||||
|
|
|
@ -5,12 +5,12 @@
|
||||||
|
|
||||||
public class LaunchServerRuntimeConfig {
|
public class LaunchServerRuntimeConfig {
|
||||||
public String clientToken;
|
public String clientToken;
|
||||||
public void verify()
|
|
||||||
{
|
public void verify() {
|
||||||
if(clientToken == null) LogHelper.error("[RuntimeConfig] clientToken must not be null");
|
if (clientToken == null) LogHelper.error("[RuntimeConfig] clientToken must not be null");
|
||||||
}
|
}
|
||||||
public void reset()
|
|
||||||
{
|
public void reset() {
|
||||||
clientToken = SecurityHelper.randomStringToken();
|
clientToken = SecurityHelper.randomStringToken();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,8 @@ public void registerReconfigurable(String name, Reconfigurable reconfigurable) {
|
||||||
VerifyHelper.putIfAbsent(RECONFIGURABLE, name.toLowerCase(), Objects.requireNonNull(reconfigurable, "adapter"),
|
VerifyHelper.putIfAbsent(RECONFIGURABLE, name.toLowerCase(), Objects.requireNonNull(reconfigurable, "adapter"),
|
||||||
String.format("Reloadable has been already registered: '%s'", name));
|
String.format("Reloadable has been already registered: '%s'", name));
|
||||||
}
|
}
|
||||||
public Reconfigurable unregisterReconfigurable(String name)
|
|
||||||
{
|
public Reconfigurable unregisterReconfigurable(String name) {
|
||||||
return RECONFIGURABLE.remove(name);
|
return RECONFIGURABLE.remove(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ public void registerReloadable(String name, Reloadable reloadable) {
|
||||||
VerifyHelper.putIfAbsent(RELOADABLES, name.toLowerCase(), Objects.requireNonNull(reloadable, "adapter"),
|
VerifyHelper.putIfAbsent(RELOADABLES, name.toLowerCase(), Objects.requireNonNull(reloadable, "adapter"),
|
||||||
String.format("Reloadable has been already registered: '%s'", name.toLowerCase()));
|
String.format("Reloadable has been already registered: '%s'", name.toLowerCase()));
|
||||||
}
|
}
|
||||||
public Reloadable unregisterReloadable(String name)
|
|
||||||
{
|
public Reloadable unregisterReloadable(String name) {
|
||||||
return RELOADABLES.remove(name);
|
return RELOADABLES.remove(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,15 +44,16 @@ public void initChannel(NioSocketChannel ch) {
|
||||||
//p.addLast(new LoggingHandler(LogLevel.INFO));
|
//p.addLast(new LoggingHandler(LogLevel.INFO));
|
||||||
pipeline.addLast(new HttpServerCodec());
|
pipeline.addLast(new HttpServerCodec());
|
||||||
pipeline.addLast(new HttpObjectAggregator(65536));
|
pipeline.addLast(new HttpObjectAggregator(65536));
|
||||||
if (LaunchServer.server.config.netty.ipForwarding) pipeline.addLast(new NettyIpForwardHandler(context));
|
if (LaunchServer.server.config.netty.ipForwarding)
|
||||||
|
pipeline.addLast(new NettyIpForwardHandler(context));
|
||||||
pipeline.addLast(new WebSocketServerCompressionHandler());
|
pipeline.addLast(new WebSocketServerCompressionHandler());
|
||||||
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
|
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
|
||||||
if (LaunchServer.server.config.netty.fileServerEnabled) pipeline.addLast(new FileServerHandler(LaunchServer.server.updatesDir, true));
|
if (LaunchServer.server.config.netty.fileServerEnabled)
|
||||||
|
pipeline.addLast(new FileServerHandler(LaunchServer.server.updatesDir, true));
|
||||||
pipeline.addLast(new WebSocketFrameHandler(context));
|
pipeline.addLast(new WebSocketFrameHandler(context));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if(config.proxy != null && config.proxy.enabled)
|
if (config.proxy != null && config.proxy.enabled) {
|
||||||
{
|
|
||||||
LogHelper.info("Connect to main server %s");
|
LogHelper.info("Connect to main server %s");
|
||||||
Request.service = StandartClientWebSocketService.initWebSockets(config.proxy.address, false);
|
Request.service = StandartClientWebSocketService.initWebSockets(config.proxy.address, false);
|
||||||
AuthRequest authRequest = new AuthRequest(config.proxy.login, config.proxy.password, config.proxy.auth_id, AuthRequest.ConnectTypes.PROXY);
|
AuthRequest authRequest = new AuthRequest(config.proxy.login, config.proxy.password, config.proxy.auth_id, AuthRequest.ConnectTypes.PROXY);
|
||||||
|
@ -64,8 +65,8 @@ public void initChannel(NioSocketChannel ch) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public ChannelFuture bind(InetSocketAddress address)
|
|
||||||
{
|
public ChannelFuture bind(InetSocketAddress address) {
|
||||||
return serverBootstrap.bind(address);
|
return serverBootstrap.bind(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,7 @@ public NettyIpForwardHandler(NettyConnectContext context) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void decode(ChannelHandlerContext ctx, HttpRequest msg, List<Object> out) throws Exception {
|
protected void decode(ChannelHandlerContext ctx, HttpRequest msg, List<Object> out) throws Exception {
|
||||||
if(msg instanceof ReferenceCounted)
|
if (msg instanceof ReferenceCounted) {
|
||||||
{
|
|
||||||
((ReferenceCounted) msg).retain();
|
((ReferenceCounted) msg).retain();
|
||||||
}
|
}
|
||||||
if (context.ip != null) {
|
if (context.ip != null) {
|
||||||
|
|
|
@ -105,8 +105,7 @@ public void run() {
|
||||||
//engine.setUseClientMode(false);
|
//engine.setUseClientMode(false);
|
||||||
WebSocketFrameHandler.server = LaunchServer.server;
|
WebSocketFrameHandler.server = LaunchServer.server;
|
||||||
nettyServer = new LauncherNettyServer();
|
nettyServer = new LauncherNettyServer();
|
||||||
for(LaunchServer.NettyBindAddress address : LaunchServer.server.config.netty.binds)
|
for (LaunchServer.NettyBindAddress address : LaunchServer.server.config.netty.binds) {
|
||||||
{
|
|
||||||
nettyServer.bind(new InetSocketAddress(address.address, address.port));
|
nettyServer.bind(new InetSocketAddress(address.address, address.port));
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -28,8 +28,8 @@ public WebSocketFrameHandler(NettyConnectContext context) {
|
||||||
static {
|
static {
|
||||||
service.registerResponses();
|
service.registerResponses();
|
||||||
}
|
}
|
||||||
public void setClient(Client client)
|
|
||||||
{
|
public void setClient(Client client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,11 +52,9 @@ protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) {
|
||||||
frame.content().retain();
|
frame.content().retain();
|
||||||
ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content()));
|
ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content()));
|
||||||
//return;
|
//return;
|
||||||
}
|
} else if ((frame instanceof PongWebSocketFrame)) {
|
||||||
else if ((frame instanceof PongWebSocketFrame)) {
|
|
||||||
LogHelper.dev("WebSocket Client received pong");
|
LogHelper.dev("WebSocket Client received pong");
|
||||||
}
|
} else if ((frame instanceof CloseWebSocketFrame)) {
|
||||||
else if ((frame instanceof CloseWebSocketFrame)) {
|
|
||||||
ctx.channel().close();
|
ctx.channel().close();
|
||||||
} else {
|
} else {
|
||||||
String message = "unsupported frame type: " + frame.getClass().getName();
|
String message = "unsupported frame type: " + frame.getClass().getName();
|
||||||
|
|
|
@ -63,64 +63,54 @@ public WebSocketService(ChannelGroup channels, LaunchServer server, GsonBuilder
|
||||||
private final GsonBuilder gsonBuiler;
|
private final GsonBuilder gsonBuiler;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) {
|
void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) {
|
||||||
String request = frame.text();
|
String request = frame.text();
|
||||||
JsonResponseInterface response = gson.fromJson(request, JsonResponseInterface.class);
|
JsonResponseInterface response = gson.fromJson(request, JsonResponseInterface.class);
|
||||||
if(server.config.netty.proxy.enabled)
|
if (server.config.netty.proxy.enabled) {
|
||||||
{
|
if (server.config.netty.proxy.requests.contains(response.getType())) {
|
||||||
if(server.config.netty.proxy.requests.contains(response.getType()))
|
|
||||||
{
|
|
||||||
|
|
||||||
UUID origRequestUUID = null;
|
UUID origRequestUUID = null;
|
||||||
if(response instanceof SimpleResponse)
|
if (response instanceof SimpleResponse) {
|
||||||
{
|
|
||||||
SimpleResponse simpleResponse = (SimpleResponse) response;
|
SimpleResponse simpleResponse = (SimpleResponse) response;
|
||||||
simpleResponse.server = server;
|
simpleResponse.server = server;
|
||||||
simpleResponse.service = this;
|
simpleResponse.service = this;
|
||||||
simpleResponse.ctx = ctx;
|
simpleResponse.ctx = ctx;
|
||||||
if(ip != null) simpleResponse.ip = ip;
|
if (ip != null) simpleResponse.ip = ip;
|
||||||
else simpleResponse.ip = IOHelper.getIP(ctx.channel().remoteAddress());
|
else simpleResponse.ip = IOHelper.getIP(ctx.channel().remoteAddress());
|
||||||
origRequestUUID = simpleResponse.requestUUID;
|
origRequestUUID = simpleResponse.requestUUID;
|
||||||
}
|
}
|
||||||
LogHelper.debug("Proxy %s request", response.getType());
|
LogHelper.debug("Proxy %s request", response.getType());
|
||||||
if(client.session == 0) client.session = new Random().nextLong();
|
if (client.session == 0) client.session = new Random().nextLong();
|
||||||
ProxyRequest proxyRequest = new ProxyRequest(response, client.session);
|
ProxyRequest proxyRequest = new ProxyRequest(response, client.session);
|
||||||
if(response instanceof SimpleResponse)
|
if (response instanceof SimpleResponse) {
|
||||||
{
|
|
||||||
((SimpleResponse) response).requestUUID = proxyRequest.requestUUID;
|
((SimpleResponse) response).requestUUID = proxyRequest.requestUUID;
|
||||||
}
|
}
|
||||||
proxyRequest.isCheckSign = client.checkSign;
|
proxyRequest.isCheckSign = client.checkSign;
|
||||||
try {
|
try {
|
||||||
ResultInterface result = proxyRequest.request();
|
ResultInterface result = proxyRequest.request();
|
||||||
if(result instanceof AuthRequestEvent)
|
if (result instanceof AuthRequestEvent) {
|
||||||
{
|
|
||||||
LogHelper.debug("Client auth params get successful");
|
LogHelper.debug("Client auth params get successful");
|
||||||
AuthRequestEvent authRequestEvent = (AuthRequestEvent) result;
|
AuthRequestEvent authRequestEvent = (AuthRequestEvent) result;
|
||||||
client.isAuth = true;
|
client.isAuth = true;
|
||||||
client.session = authRequestEvent.session;
|
client.session = authRequestEvent.session;
|
||||||
if(authRequestEvent.playerProfile != null) client.username = authRequestEvent.playerProfile.username;
|
if (authRequestEvent.playerProfile != null)
|
||||||
|
client.username = authRequestEvent.playerProfile.username;
|
||||||
}
|
}
|
||||||
if(result instanceof Request && response instanceof SimpleResponse)
|
if (result instanceof Request && response instanceof SimpleResponse) {
|
||||||
{
|
|
||||||
((Request) result).requestUUID = origRequestUUID;
|
((Request) result).requestUUID = origRequestUUID;
|
||||||
}
|
}
|
||||||
sendObject(ctx, result);
|
sendObject(ctx, result);
|
||||||
} catch (RequestException e)
|
} catch (RequestException e) {
|
||||||
{
|
|
||||||
sendObject(ctx, new ErrorRequestEvent(e.getMessage()));
|
sendObject(ctx, new ErrorRequestEvent(e.getMessage()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogHelper.error(e);
|
LogHelper.error(e);
|
||||||
RequestEvent event;
|
RequestEvent event;
|
||||||
if(server.config.netty.sendExceptionEnabled)
|
if (server.config.netty.sendExceptionEnabled) {
|
||||||
{
|
|
||||||
event = new ExceptionEvent(e);
|
event = new ExceptionEvent(e);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
event = new ErrorRequestEvent("Fatal server error. Contact administrator");
|
event = new ErrorRequestEvent("Fatal server error. Contact administrator");
|
||||||
}
|
}
|
||||||
if(response instanceof SimpleResponse)
|
if (response instanceof SimpleResponse) {
|
||||||
{
|
|
||||||
event.requestUUID = ((SimpleResponse) response).requestUUID;
|
event.requestUUID = ((SimpleResponse) response).requestUUID;
|
||||||
}
|
}
|
||||||
sendObject(ctx, event);
|
sendObject(ctx, event);
|
||||||
|
@ -128,17 +118,16 @@ void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
process(ctx,response, client, ip);
|
process(ctx, response, client, ip);
|
||||||
}
|
}
|
||||||
void process(ChannelHandlerContext ctx, JsonResponseInterface response, Client client, String ip)
|
|
||||||
{
|
void process(ChannelHandlerContext ctx, JsonResponseInterface response, Client client, String ip) {
|
||||||
if(response instanceof SimpleResponse)
|
if (response instanceof SimpleResponse) {
|
||||||
{
|
|
||||||
SimpleResponse simpleResponse = (SimpleResponse) response;
|
SimpleResponse simpleResponse = (SimpleResponse) response;
|
||||||
simpleResponse.server = server;
|
simpleResponse.server = server;
|
||||||
simpleResponse.service = this;
|
simpleResponse.service = this;
|
||||||
simpleResponse.ctx = ctx;
|
simpleResponse.ctx = ctx;
|
||||||
if(ip != null) simpleResponse.ip = ip;
|
if (ip != null) simpleResponse.ip = ip;
|
||||||
else simpleResponse.ip = IOHelper.getIP(ctx.channel().remoteAddress());
|
else simpleResponse.ip = IOHelper.getIP(ctx.channel().remoteAddress());
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -146,16 +135,12 @@ void process(ChannelHandlerContext ctx, JsonResponseInterface response, Client c
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogHelper.error(e);
|
LogHelper.error(e);
|
||||||
RequestEvent event;
|
RequestEvent event;
|
||||||
if(server.config.netty.sendExceptionEnabled)
|
if (server.config.netty.sendExceptionEnabled) {
|
||||||
{
|
|
||||||
event = new ExceptionEvent(e);
|
event = new ExceptionEvent(e);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
event = new ErrorRequestEvent("Fatal server error. Contact administrator");
|
event = new ErrorRequestEvent("Fatal server error. Contact administrator");
|
||||||
}
|
}
|
||||||
if(response instanceof SimpleResponse)
|
if (response instanceof SimpleResponse) {
|
||||||
{
|
|
||||||
event.requestUUID = ((SimpleResponse) response).requestUUID;
|
event.requestUUID = ((SimpleResponse) response).requestUUID;
|
||||||
}
|
}
|
||||||
sendObject(ctx, event);
|
sendObject(ctx, event);
|
||||||
|
@ -204,15 +189,13 @@ public void sendObject(ChannelHandlerContext ctx, Object obj, Type type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendObjectAll(Object obj) {
|
public void sendObjectAll(Object obj) {
|
||||||
for(Channel ch : channels)
|
for (Channel ch : channels) {
|
||||||
{
|
|
||||||
ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, ResultInterface.class)));
|
ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, ResultInterface.class)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendObjectAll(Object obj, Type type) {
|
public void sendObjectAll(Object obj, Type type) {
|
||||||
for(Channel ch : channels)
|
for (Channel ch : channels) {
|
||||||
{
|
|
||||||
ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, type)));
|
ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, type)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,18 +15,18 @@ public abstract class SimpleResponse implements JsonResponseInterface {
|
||||||
public transient WebSocketService service;
|
public transient WebSocketService service;
|
||||||
public transient ChannelHandlerContext ctx;
|
public transient ChannelHandlerContext ctx;
|
||||||
public transient String ip;
|
public transient String ip;
|
||||||
public void sendResult(RequestEvent result)
|
|
||||||
{
|
public void sendResult(RequestEvent result) {
|
||||||
result.requestUUID = requestUUID;
|
result.requestUUID = requestUUID;
|
||||||
service.sendObject(ctx, result);
|
service.sendObject(ctx, result);
|
||||||
}
|
}
|
||||||
public void sendResultAndClose(RequestEvent result)
|
|
||||||
{
|
public void sendResultAndClose(RequestEvent result) {
|
||||||
result.requestUUID = requestUUID;
|
result.requestUUID = requestUUID;
|
||||||
service.sendObjectAndClose(ctx, result);
|
service.sendObjectAndClose(ctx, result);
|
||||||
}
|
}
|
||||||
public void sendError(String errorMessage)
|
|
||||||
{
|
public void sendError(String errorMessage) {
|
||||||
ErrorRequestEvent event = new ErrorRequestEvent(errorMessage);
|
ErrorRequestEvent event = new ErrorRequestEvent(errorMessage);
|
||||||
event.requestUUID = requestUUID;
|
event.requestUUID = requestUUID;
|
||||||
service.sendObject(ctx, event);
|
service.sendObject(ctx, event);
|
||||||
|
|
|
@ -9,9 +9,10 @@ public class ProxyCommandResponse extends SimpleResponse {
|
||||||
public JsonResponseInterface response;
|
public JsonResponseInterface response;
|
||||||
public long session;
|
public long session;
|
||||||
public boolean isCheckSign;
|
public boolean isCheckSign;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
||||||
if(!client.proxy) {
|
if (!client.proxy) {
|
||||||
sendError("Proxy server error");
|
sendError("Proxy server error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ public String getType() {
|
||||||
public void execute(ChannelHandlerContext ctx, Client clientData) throws Exception {
|
public void execute(ChannelHandlerContext ctx, Client clientData) throws Exception {
|
||||||
try {
|
try {
|
||||||
AuthRequestEvent result = new AuthRequestEvent();
|
AuthRequestEvent result = new AuthRequestEvent();
|
||||||
if ((authType == null || authType == ConnectTypes.CLIENT) && ( clientData == null || !clientData.checkSign )) {
|
if ((authType == null || authType == ConnectTypes.CLIENT) && (clientData == null || !clientData.checkSign)) {
|
||||||
AuthProvider.authError("Don't skip Launcher Update");
|
AuthProvider.authError("Don't skip Launcher Update");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -113,21 +113,18 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
|
||||||
clientData.updateAuth();
|
clientData.updateAuth();
|
||||||
result.accessToken = aresult.accessToken;
|
result.accessToken = aresult.accessToken;
|
||||||
result.permissions = clientData.permissions;
|
result.permissions = clientData.permissions;
|
||||||
if(getSession)
|
if (getSession) {
|
||||||
{
|
if (clientData.session == 0) {
|
||||||
if(clientData.session == 0) {
|
|
||||||
clientData.session = random.nextLong();
|
clientData.session = random.nextLong();
|
||||||
LaunchServer.server.sessionManager.addClient(clientData);
|
LaunchServer.server.sessionManager.addClient(clientData);
|
||||||
}
|
}
|
||||||
result.session = clientData.session;
|
result.session = clientData.session;
|
||||||
}
|
}
|
||||||
if(initProxy)
|
if (initProxy) {
|
||||||
{
|
if (!clientData.permissions.canProxy) throw new AuthException("initProxy not allow");
|
||||||
if(!clientData.permissions.canProxy) throw new AuthException("initProxy not allow");
|
|
||||||
clientData.proxy = true;
|
clientData.proxy = true;
|
||||||
}
|
}
|
||||||
if(LaunchServer.server.config.protectHandler.allowGetAccessToken(context))
|
if (LaunchServer.server.config.protectHandler.allowGetAccessToken(context)) {
|
||||||
{
|
|
||||||
UUID uuid = pair.handler.auth(aresult);
|
UUID uuid = pair.handler.auth(aresult);
|
||||||
result.playerProfile = ProfileByUUIDResponse.getProfile(LaunchServer.server, uuid, aresult.username, client, clientData.auth.textureProvider);
|
result.playerProfile = ProfileByUUIDResponse.getProfile(LaunchServer.server, uuid, aresult.username, client, clientData.auth.textureProvider);
|
||||||
LogHelper.debug("Auth: %s accessToken %s uuid: %s", login, result.accessToken, uuid.toString());
|
LogHelper.debug("Auth: %s accessToken %s uuid: %s", login, result.accessToken, uuid.toString());
|
||||||
|
@ -137,6 +134,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
|
||||||
sendError(e.getMessage());
|
sendError(e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AuthContext {
|
public static class AuthContext {
|
||||||
public AuthContext(long session, String login, int password_lenght, String customText, String client, String hwid, String ip, boolean isServerAuth) {
|
public AuthContext(long session, String login, int password_lenght, String customText, String client, String hwid, String ip, boolean isServerAuth) {
|
||||||
this.session = session;
|
this.session = session;
|
||||||
|
|
|
@ -19,8 +19,7 @@ public String getType() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) {
|
public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
List<GetAvailabilityAuthRequestEvent.AuthAvailability> list = new ArrayList<>();
|
List<GetAvailabilityAuthRequestEvent.AuthAvailability> list = new ArrayList<>();
|
||||||
for(AuthProviderPair pair : LaunchServer.server.config.auth)
|
for (AuthProviderPair pair : LaunchServer.server.config.auth) {
|
||||||
{
|
|
||||||
list.add(new GetAvailabilityAuthRequestEvent.AuthAvailability(pair.name, pair.displayName));
|
list.add(new GetAvailabilityAuthRequestEvent.AuthAvailability(pair.name, pair.displayName));
|
||||||
}
|
}
|
||||||
sendResult(new GetAvailabilityAuthRequestEvent(list));
|
sendResult(new GetAvailabilityAuthRequestEvent(list));
|
||||||
|
|
|
@ -18,17 +18,16 @@ public class JoinServerResponse extends SimpleResponse {
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "joinServer";
|
return "joinServer";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) {
|
public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
boolean success;
|
boolean success;
|
||||||
try {
|
try {
|
||||||
server.authHookManager.joinServerHook.hook(this, client);
|
server.authHookManager.joinServerHook.hook(this, client);
|
||||||
if(client.auth == null)
|
if (client.auth == null) {
|
||||||
{
|
|
||||||
LogHelper.warning("Client auth is null. Using default.");
|
LogHelper.warning("Client auth is null. Using default.");
|
||||||
success = LaunchServer.server.config.getAuthProviderPair().handler.joinServer(username, accessToken, serverID);
|
success = LaunchServer.server.config.getAuthProviderPair().handler.joinServer(username, accessToken, serverID);
|
||||||
}
|
} else success = client.auth.handler.joinServer(username, accessToken, serverID);
|
||||||
else success = client.auth.handler.joinServer(username, accessToken, serverID);
|
|
||||||
LogHelper.debug("joinServer: %s accessToken: %s serverID: %s", username, accessToken, serverID);
|
LogHelper.debug("joinServer: %s accessToken: %s serverID: %s", username, accessToken, serverID);
|
||||||
} catch (AuthException | HookException e) {
|
} catch (AuthException | HookException e) {
|
||||||
sendError(e.getMessage());
|
sendError(e.getMessage());
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
public class RestoreSessionResponse extends SimpleResponse {
|
public class RestoreSessionResponse extends SimpleResponse {
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public long session;
|
public long session;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "restoreSession";
|
return "restoreSession";
|
||||||
|
@ -19,8 +20,7 @@ public String getType() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) {
|
public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
Client rClient = LaunchServer.server.sessionManager.getClient(session);
|
Client rClient = LaunchServer.server.sessionManager.getClient(session);
|
||||||
if(rClient == null)
|
if (rClient == null) {
|
||||||
{
|
|
||||||
sendError("Session invalid");
|
sendError("Session invalid");
|
||||||
}
|
}
|
||||||
WebSocketFrameHandler frameHandler = ctx.pipeline().get(WebSocketFrameHandler.class);
|
WebSocketFrameHandler frameHandler = ctx.pipeline().get(WebSocketFrameHandler.class);
|
||||||
|
|
|
@ -26,8 +26,7 @@ public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
server.authHookManager.setProfileHook.hook(this, client);
|
server.authHookManager.setProfileHook.hook(this, client);
|
||||||
} catch (HookException e)
|
} catch (HookException e) {
|
||||||
{
|
|
||||||
sendError(e.getMessage());
|
sendError(e.getMessage());
|
||||||
}
|
}
|
||||||
Collection<ClientProfile> profiles = LaunchServer.server.getProfiles();
|
Collection<ClientProfile> profiles = LaunchServer.server.getProfiles();
|
||||||
|
|
|
@ -29,12 +29,10 @@ public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
||||||
result.playerProfiles = new PlayerProfile[list.length];
|
result.playerProfiles = new PlayerProfile[list.length];
|
||||||
for (int i = 0; i < list.length; ++i) {
|
for (int i = 0; i < list.length; ++i) {
|
||||||
UUID uuid;
|
UUID uuid;
|
||||||
if(client.auth == null)
|
if (client.auth == null) {
|
||||||
{
|
|
||||||
LogHelper.warning("Client auth is null. Using default.");
|
LogHelper.warning("Client auth is null. Using default.");
|
||||||
uuid = LaunchServer.server.config.getAuthProviderPair().handler.usernameToUUID(list[i].username);
|
uuid = LaunchServer.server.config.getAuthProviderPair().handler.usernameToUUID(list[i].username);
|
||||||
}
|
} else uuid = client.auth.handler.usernameToUUID(list[i].username);
|
||||||
else uuid = client.auth.handler.usernameToUUID(list[i].username);
|
|
||||||
result.playerProfiles[i] = ProfileByUUIDResponse.getProfile(LaunchServer.server, uuid, list[i].username, list[i].client, client.auth.textureProvider);
|
result.playerProfiles[i] = ProfileByUUIDResponse.getProfile(LaunchServer.server, uuid, list[i].username, list[i].client, client.auth.textureProvider);
|
||||||
}
|
}
|
||||||
sendResult(result);
|
sendResult(result);
|
||||||
|
|
|
@ -48,12 +48,10 @@ public String getType() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
||||||
String username;
|
String username;
|
||||||
if(client.auth == null)
|
if (client.auth == null) {
|
||||||
{
|
|
||||||
LogHelper.warning("Client auth is null. Using default.");
|
LogHelper.warning("Client auth is null. Using default.");
|
||||||
username = LaunchServer.server.config.getAuthProviderPair().handler.uuidToUsername(uuid);
|
username = LaunchServer.server.config.getAuthProviderPair().handler.uuidToUsername(uuid);
|
||||||
}
|
} else username = client.auth.handler.uuidToUsername(uuid);
|
||||||
else username = client.auth.handler.uuidToUsername(uuid);
|
|
||||||
sendResult(new ProfileByUUIDRequestEvent(getProfile(LaunchServer.server, uuid, username, this.client, client.auth.textureProvider)));
|
sendResult(new ProfileByUUIDRequestEvent(getProfile(LaunchServer.server, uuid, username, this.client, client.auth.textureProvider)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,12 +23,10 @@ public String getType() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
|
||||||
UUID uuid;
|
UUID uuid;
|
||||||
if(client.auth == null)
|
if (client.auth == null) {
|
||||||
{
|
|
||||||
LogHelper.warning("Client auth is null. Using default.");
|
LogHelper.warning("Client auth is null. Using default.");
|
||||||
uuid = LaunchServer.server.config.getAuthProviderPair().handler.usernameToUUID(username);
|
uuid = LaunchServer.server.config.getAuthProviderPair().handler.usernameToUUID(username);
|
||||||
}
|
} else uuid = client.auth.handler.usernameToUUID(username);
|
||||||
else uuid = client.auth.handler.usernameToUUID(username);
|
|
||||||
sendResult(new ProfileByUsernameRequestEvent(getProfile(LaunchServer.server, uuid, username, this.client, client.auth.textureProvider)));
|
sendResult(new ProfileByUsernameRequestEvent(getProfile(LaunchServer.server, uuid, username, this.client, client.auth.textureProvider)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ public String getType() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(ChannelHandlerContext ctx, Client client) {
|
public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
boolean success = LaunchServer.server.config.protectHandler.verifyClientSecureToken(secureToken, client.verifyToken);
|
boolean success = LaunchServer.server.config.protectHandler.verifyClientSecureToken(secureToken, client.verifyToken);
|
||||||
if(success) client.isSecure = true;
|
if (success) client.isSecure = true;
|
||||||
sendResult(new VerifySecureTokenRequestEvent(success));
|
sendResult(new VerifySecureTokenRequestEvent(success));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,13 +34,12 @@ public void execute(ChannelHandlerContext ctx, Client client) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SignedObjectHolder<HashedDir> dir = LaunchServer.server.updatesDirMap.get(dirName);
|
SignedObjectHolder<HashedDir> dir = LaunchServer.server.updatesDirMap.get(dirName);
|
||||||
if(dir == null)
|
if (dir == null) {
|
||||||
{
|
|
||||||
service.sendObject(ctx, new ErrorRequestEvent(String.format("Directory %s not found", dirName)));
|
service.sendObject(ctx, new ErrorRequestEvent(String.format("Directory %s not found", dirName)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String url = LaunchServer.server.config.netty.downloadURL.replace("%dirname%",dirName);
|
String url = LaunchServer.server.config.netty.downloadURL.replace("%dirname%", dirName);
|
||||||
if(server.config.netty.bindings.get(dirName) != null) url = server.config.netty.bindings.get(dirName);
|
if (server.config.netty.bindings.get(dirName) != null) url = server.config.netty.bindings.get(dirName);
|
||||||
service.sendObject(ctx, new UpdateRequestEvent(dir.object, url));
|
service.sendObject(ctx, new UpdateRequestEvent(dir.object, url));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,8 +33,8 @@ public static void main(String[] args) throws IOException {
|
||||||
LogHelper.info("CommandHandler started. Use 'exit' to exit this console");
|
LogHelper.info("CommandHandler started. Use 'exit' to exit this console");
|
||||||
commandHandler.run();
|
commandHandler.run();
|
||||||
}
|
}
|
||||||
public static void registerCommands()
|
|
||||||
{
|
public static void registerCommands() {
|
||||||
commandHandler.registerCommand("help", new HelpCommand(commandHandler));
|
commandHandler.registerCommand("help", new HelpCommand(commandHandler));
|
||||||
commandHandler.registerCommand("exit", new ExitCommand());
|
commandHandler.registerCommand("exit", new ExitCommand());
|
||||||
commandHandler.registerCommand("logListener", new LogListenerCommand());
|
commandHandler.registerCommand("logListener", new LogListenerCommand());
|
||||||
|
|
|
@ -19,6 +19,6 @@ public String getUsageDescription() {
|
||||||
@Override
|
@Override
|
||||||
public void invoke(String... args) throws Exception {
|
public void invoke(String... args) throws Exception {
|
||||||
ExecCommandRequestEvent request = new ExecCommandRequest(String.join(" ")).request();
|
ExecCommandRequestEvent request = new ExecCommandRequest(String.join(" ")).request();
|
||||||
if(!request.success) LogHelper.error("Error executing command");
|
if (!request.success) LogHelper.error("Error executing command");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,7 @@
|
||||||
import ru.gravit.utils.helper.LogHelper;
|
import ru.gravit.utils.helper.LogHelper;
|
||||||
|
|
||||||
public class LogListenerCommand extends Command {
|
public class LogListenerCommand extends Command {
|
||||||
public class LogListenerRequest implements RequestInterface
|
public class LogListenerRequest implements RequestInterface {
|
||||||
{
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public LogHelper.OutputTypes outputType;
|
public LogHelper.OutputTypes outputType;
|
||||||
|
|
||||||
|
@ -22,6 +21,7 @@ public String getType() {
|
||||||
return "addLogListener";
|
return "addLogListener";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getArgsDescription() {
|
public String getArgsDescription() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -38,8 +38,7 @@ public void invoke(String... args) throws Exception {
|
||||||
Request.service.sendObject(new LogListenerRequest(LogHelper.JANSI ? LogHelper.OutputTypes.JANSI : LogHelper.OutputTypes.PLAIN));
|
Request.service.sendObject(new LogListenerRequest(LogHelper.JANSI ? LogHelper.OutputTypes.JANSI : LogHelper.OutputTypes.PLAIN));
|
||||||
LogHelper.info("Add log handler");
|
LogHelper.info("Add log handler");
|
||||||
Request.service.registerHandler((result) -> {
|
Request.service.registerHandler((result) -> {
|
||||||
if(result instanceof LogEvent)
|
if (result instanceof LogEvent) {
|
||||||
{
|
|
||||||
System.out.println(((LogEvent) result).string);
|
System.out.println(((LogEvent) result).string);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -28,11 +28,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
classifier = null
|
classifier = null
|
||||||
relocate 'org.objectweb.asm', 'ru.gravit.repackage.org.objectweb.asm'
|
relocate 'org.objectweb.asm', 'ru.gravit.repackage.org.objectweb.asm'
|
||||||
relocate 'io.netty', 'ru.gravit.repackage.io.netty'
|
relocate 'io.netty', 'ru.gravit.repackage.io.netty'
|
||||||
configurations = [project.configurations.pack]
|
configurations = [project.configurations.pack]
|
||||||
exclude 'module-info.class'
|
exclude 'module-info.class'
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
|
@ -1,15 +1,16 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8"/>
|
||||||
<title>Offline-режим</title>
|
<title>Offline-режим</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body style="color:red">
|
<body style="color:red">
|
||||||
<h2>Offline-режим</h2>
|
<h2>Offline-режим</h2>
|
||||||
Лаунчер запущен в Offline-режиме. В этом режиме Вы можете запустить любой ранее загруженный клиент
|
Лаунчер запущен в Offline-режиме. В этом режиме Вы можете запустить любой ранее загруженный клиент
|
||||||
с любым именем пользователя, при этом вход на серверы с авторизацией, а так же система скинов и плащей <b>может не работать</b>.
|
с любым именем пользователя, при этом вход на серверы с авторизацией, а так же система скинов и плащей <b>может не
|
||||||
Скорее всего, проблема вызвана сбоем на сервере или неполадками в интернет-подключении.
|
работать</b>.
|
||||||
Проверьте состояние интернет-подключения или обратитесь к администратору сервера.
|
Скорее всего, проблема вызвана сбоем на сервере или неполадками в интернет-подключении.
|
||||||
</body>
|
Проверьте состояние интернет-подключения или обратитесь к администратору сервера.
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -8,17 +8,20 @@
|
||||||
|
|
||||||
<!-- DrLeonardo Design -->
|
<!-- DrLeonardo Design -->
|
||||||
|
|
||||||
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.201"
|
||||||
|
xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<stylesheets>
|
<stylesheets>
|
||||||
<URL value="@debug.css" />
|
<URL value="@debug.css"/>
|
||||||
<URL value="@../../styles.css" />
|
<URL value="@../../styles.css"/>
|
||||||
</stylesheets>
|
</stylesheets>
|
||||||
|
|
||||||
<!-- Debug controls -->
|
<!-- Debug controls -->
|
||||||
<JFXTextArea fx:id="output" focusColor="#5fd97a" prefHeight="450.0" prefWidth="693.0">
|
<JFXTextArea fx:id="output" focusColor="#5fd97a" prefHeight="450.0" prefWidth="693.0">
|
||||||
<padding>
|
<padding>
|
||||||
<Insets left="10.0" right="10.0" />
|
<Insets left="10.0" right="10.0"/>
|
||||||
</padding></JFXTextArea>
|
</padding>
|
||||||
<JFXButton fx:id="copy" defaultButton="true" layoutX="373.0" layoutY="415.0" prefHeight="30.0" prefWidth="100.0" text="Копировать" />
|
</JFXTextArea>
|
||||||
<JFXButton fx:id="action" layoutX="533.0" layoutY="415.0" prefHeight="25.0" prefWidth="150.0" text="Убить" />
|
<JFXButton fx:id="copy" defaultButton="true" layoutX="373.0" layoutY="415.0" prefHeight="30.0" prefWidth="100.0"
|
||||||
|
text="Копировать"/>
|
||||||
|
<JFXButton fx:id="action" layoutX="533.0" layoutY="415.0" prefHeight="25.0" prefWidth="150.0" text="Убить"/>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
|
|
||||||
<!-- DrLeonardo Design | Fixes by Yaroslavik -->
|
<!-- DrLeonardo Design | Fixes by Yaroslavik -->
|
||||||
|
|
||||||
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="692.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="692.0" xmlns="http://javafx.com/javafx/8.0.201"
|
||||||
<children>
|
xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<!-- Description -->
|
<children>
|
||||||
<Label fx:id="description" alignment="CENTER" contentDisplay="CENTER" layoutX="205.0" layoutY="328.0" prefHeight="87.0" prefWidth="283.0" text="..." textAlignment="CENTER" />
|
<!-- Description -->
|
||||||
<JFXSpinner fx:id="spinner" layoutX="291.0" layoutY="165.0" prefHeight="120.0" prefWidth="110.0" />
|
<Label fx:id="description" alignment="CENTER" contentDisplay="CENTER" layoutX="205.0" layoutY="328.0"
|
||||||
</children>
|
prefHeight="87.0" prefWidth="283.0" text="..." textAlignment="CENTER"/>
|
||||||
<stylesheets>
|
<JFXSpinner fx:id="spinner" layoutX="291.0" layoutY="165.0" prefHeight="120.0" prefWidth="110.0"/>
|
||||||
<URL value="@processing.css" />
|
</children>
|
||||||
</stylesheets>
|
<stylesheets>
|
||||||
|
<URL value="@processing.css"/>
|
||||||
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -13,42 +13,60 @@
|
||||||
|
|
||||||
<!-- DrLeonardo Design -->
|
<!-- DrLeonardo Design -->
|
||||||
|
|
||||||
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.201"
|
||||||
<children>
|
xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<Pane id="holder" prefHeight="450.0" prefWidth="694.0">
|
<children>
|
||||||
<children>
|
<Pane id="holder" prefHeight="450.0" prefWidth="694.0">
|
||||||
<JFXCheckBox fx:id="autoEnter" checkedColor="#5fd97a" layoutX="14.0" layoutY="137.0" text="Автовход на сервер" unCheckedColor="#909090" />
|
<children>
|
||||||
<Text fill="#8c8c8c" layoutX="40.0" layoutY="153.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Включение авто-входа означает что вы сразу после загрузки клиента попадете на сервер" wrappingWidth="636.9999872148037" y="15.0" />
|
<JFXCheckBox fx:id="autoEnter" checkedColor="#5fd97a" layoutX="14.0" layoutY="137.0"
|
||||||
<JFXCheckBox fx:id="fullScreen" checkedColor="#5fd97a" layoutX="13.0" layoutY="260.0" text="Клиент в полный экран" unCheckedColor="#909090" />
|
text="Автовход на сервер" unCheckedColor="#909090"/>
|
||||||
<Text fill="#8c8c8c" layoutX="40.0" layoutY="277.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Включение данной функции позволяет запустить игру сразу в полноэкранном режиме" wrappingWidth="636.9999872148037" y="15.0" />
|
<Text fill="#8c8c8c" layoutX="40.0" layoutY="153.0" strokeType="OUTSIDE" strokeWidth="0.0"
|
||||||
<JFXCheckBox id="debug" checkedColor="#5fd97a" layoutX="13.0" layoutY="193.0" text="Режим Отладки" unCheckedColor="#909090" />
|
text="Включение авто-входа означает что вы сразу после загрузки клиента попадете на сервер"
|
||||||
<Text fill="#8c8c8c" layoutX="40.0" layoutY="208.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Режим отладки позволяет просмотреть лог запуска и работы программы в реальном времени прямо из лаунчера, что упрощает поиск нужной информации" wrappingWidth="637.0000016447157" y="15.0" />
|
wrappingWidth="636.9999872148037" y="15.0"/>
|
||||||
<TextFlow layoutX="126.0" layoutY="15.0" prefHeight="16.0" prefWidth="112.0">
|
<JFXCheckBox fx:id="fullScreen" checkedColor="#5fd97a" layoutX="13.0" layoutY="260.0"
|
||||||
<Text fx:id="ramLabel" />
|
text="Клиент в полный экран" unCheckedColor="#909090"/>
|
||||||
</TextFlow>
|
<Text fill="#8c8c8c" layoutX="40.0" layoutY="277.0" strokeType="OUTSIDE" strokeWidth="0.0"
|
||||||
<JFXButton fx:id="deleteDir" layoutX="370.0" layoutY="380.0" prefHeight="25.0" prefWidth="245.0" text="Удалить клиенты" textAlignment="CENTER" wrapText="true" />
|
text="Включение данной функции позволяет запустить игру сразу в полноэкранном режиме"
|
||||||
<JFXButton fx:id="changeDir" layoutY="419.0" prefHeight="30.0" prefWidth="200.0" text="Сменить директорию загрузки" textAlignment="CENTER" wrapText="true" />
|
wrappingWidth="636.9999872148037" y="15.0"/>
|
||||||
<Hyperlink id="dirLabel" alignment="BASELINE_LEFT" layoutX="201.0" layoutY="420.0" prefHeight="30.0" prefWidth="493.0" text="C:/Users" />
|
<JFXCheckBox id="debug" checkedColor="#5fd97a" layoutX="13.0" layoutY="193.0" text="Режим Отладки"
|
||||||
<JFXButton fx:id="apply" defaultButton="true" layoutX="530.0" layoutY="380.0" prefHeight="23.0" prefWidth="100.0" text="Применить" />
|
unCheckedColor="#909090"/>
|
||||||
<Text layoutX="16.0" layoutY="28.0">Выделение памяти: </Text>
|
<Text fill="#8c8c8c" layoutX="40.0" layoutY="208.0" strokeType="OUTSIDE" strokeWidth="0.0"
|
||||||
<JFXSlider fx:id="ramSlider" layoutX="14.0" layoutY="76.0" prefHeight="14.0" prefWidth="663.0" />
|
text="Режим отладки позволяет просмотреть лог запуска и работы программы в реальном времени прямо из лаунчера, что упрощает поиск нужной информации"
|
||||||
<Pane fx:id="transferDialog" prefHeight="425.0" prefWidth="694.0" visible="false">
|
wrappingWidth="637.0000016447157" y="15.0"/>
|
||||||
<children>
|
<TextFlow layoutX="126.0" layoutY="15.0" prefHeight="16.0" prefWidth="112.0">
|
||||||
<Text fill="WHITE" layoutX="147.0" layoutY="198.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Перенести все данные в новую директорию?" wrappingWidth="400.13671875">
|
<Text fx:id="ramLabel"/>
|
||||||
<font>
|
</TextFlow>
|
||||||
<Font size="19.0" />
|
<JFXButton fx:id="deleteDir" layoutX="370.0" layoutY="380.0" prefHeight="25.0" prefWidth="245.0"
|
||||||
</font>
|
text="Удалить клиенты" textAlignment="CENTER" wrapText="true"/>
|
||||||
</Text>
|
<JFXButton fx:id="changeDir" layoutY="419.0" prefHeight="30.0" prefWidth="200.0"
|
||||||
<JFXButton fx:id="applyTransfer" layoutX="165.0" layoutY="226.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="124.0" text="Да, перенести!" />
|
text="Сменить директорию загрузки" textAlignment="CENTER" wrapText="true"/>
|
||||||
<JFXButton fx:id="cancelTransfer" layoutX="379.0" layoutY="226.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="124.0" text="Нет, не нужно." />
|
<Hyperlink id="dirLabel" alignment="BASELINE_LEFT" layoutX="201.0" layoutY="420.0" prefHeight="30.0"
|
||||||
</children>
|
prefWidth="493.0" text="C:/Users"/>
|
||||||
</Pane>
|
<JFXButton fx:id="apply" defaultButton="true" layoutX="530.0" layoutY="380.0" prefHeight="23.0"
|
||||||
<Line endX="594.0" layoutX="100.0" layoutY="420.0" startX="-100.0" stroke="#5b3636" styleClass="lineHead" />
|
prefWidth="100.0" text="Применить"/>
|
||||||
</children>
|
<Text layoutX="16.0" layoutY="28.0">Выделение памяти:</Text>
|
||||||
</Pane>
|
<JFXSlider fx:id="ramSlider" layoutX="14.0" layoutY="76.0" prefHeight="14.0" prefWidth="663.0"/>
|
||||||
</children>
|
<Pane fx:id="transferDialog" prefHeight="425.0" prefWidth="694.0" visible="false">
|
||||||
<stylesheets>
|
<children>
|
||||||
<URL value="@settings.css" />
|
<Text fill="WHITE" layoutX="147.0" layoutY="198.0" strokeType="OUTSIDE" strokeWidth="0.0"
|
||||||
<URL value="@../../styles.css" />
|
text="Перенести все данные в новую директорию?" wrappingWidth="400.13671875">
|
||||||
</stylesheets>
|
<font>
|
||||||
|
<Font size="19.0"/>
|
||||||
|
</font>
|
||||||
|
</Text>
|
||||||
|
<JFXButton fx:id="applyTransfer" layoutX="165.0" layoutY="226.0" mnemonicParsing="false"
|
||||||
|
prefHeight="25.0" prefWidth="124.0" text="Да, перенести!"/>
|
||||||
|
<JFXButton fx:id="cancelTransfer" layoutX="379.0" layoutY="226.0" mnemonicParsing="false"
|
||||||
|
prefHeight="25.0" prefWidth="124.0" text="Нет, не нужно."/>
|
||||||
|
</children>
|
||||||
|
</Pane>
|
||||||
|
<Line endX="594.0" layoutX="100.0" layoutY="420.0" startX="-100.0" stroke="#5b3636"
|
||||||
|
styleClass="lineHead"/>
|
||||||
|
</children>
|
||||||
|
</Pane>
|
||||||
|
</children>
|
||||||
|
<stylesheets>
|
||||||
|
<URL value="@settings.css"/>
|
||||||
|
<URL value="@../../styles.css"/>
|
||||||
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -8,25 +8,29 @@
|
||||||
|
|
||||||
<!-- DrLeonardo Design -->
|
<!-- DrLeonardo Design -->
|
||||||
|
|
||||||
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="overlay" prefHeight="450.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.201"
|
||||||
<children>
|
xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<Pane prefHeight="450.0" prefWidth="693.0" styleClass="downloadPane">
|
<children>
|
||||||
<children>
|
<Pane prefHeight="450.0" prefWidth="693.0" styleClass="downloadPane">
|
||||||
<Label fx:id="utitle" alignment="CENTER" layoutX="100.0" layoutY="125.0" prefHeight="30.0" prefWidth="495.0" text="Загрузка обновления..." textFill="WHITE">
|
<children>
|
||||||
<font>
|
<Label fx:id="utitle" alignment="CENTER" layoutX="100.0" layoutY="125.0" prefHeight="30.0"
|
||||||
<Font name="System Bold" size="20.0" />
|
prefWidth="495.0" text="Загрузка обновления..." textFill="WHITE">
|
||||||
</font>
|
<font>
|
||||||
</Label>
|
<Font name="System Bold" size="20.0"/>
|
||||||
<JFXSpinner fx:id="progress" layoutX="98.0" layoutY="226.0" prefHeight="100.0" prefWidth="100.0" />
|
</font>
|
||||||
<Label fx:id="description" layoutX="216.0" layoutY="226.0" prefHeight="100.0" prefWidth="380.0" text="..." textFill="WHITE">
|
</Label>
|
||||||
<font>
|
<JFXSpinner fx:id="progress" layoutX="98.0" layoutY="226.0" prefHeight="100.0" prefWidth="100.0"/>
|
||||||
<Font name="System Bold" size="16.0" />
|
<Label fx:id="description" layoutX="216.0" layoutY="226.0" prefHeight="100.0" prefWidth="380.0"
|
||||||
</font>
|
text="..." textFill="WHITE">
|
||||||
</Label>
|
<font>
|
||||||
</children></Pane>
|
<Font name="System Bold" size="16.0"/>
|
||||||
</children>
|
</font>
|
||||||
<stylesheets>
|
</Label>
|
||||||
<URL value="@update.css" />
|
</children>
|
||||||
<URL value="@../../styles.css" />
|
</Pane>
|
||||||
</stylesheets>
|
</children>
|
||||||
|
<stylesheets>
|
||||||
|
<URL value="@update.css"/>
|
||||||
|
<URL value="@../../styles.css"/>
|
||||||
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -15,36 +15,40 @@
|
||||||
<children>
|
<children>
|
||||||
<Pane fx:id="bar" layoutX="692.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
<Pane fx:id="bar" layoutX="692.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
||||||
<children>
|
<children>
|
||||||
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464"
|
||||||
|
text="" textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text="" textAlignment="CENTER">
|
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text=""
|
||||||
|
textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
</children>
|
</children>
|
||||||
</Pane>
|
</Pane>
|
||||||
<JFXTextArea fx:id="output" focusColor="#d8d8d8" prefHeight="419.0" prefWidth="692.0" unFocusColor="#ffffff00">
|
<JFXTextArea fx:id="output" focusColor="#d8d8d8" prefHeight="419.0" prefWidth="692.0" unFocusColor="#ffffff00">
|
||||||
<padding>
|
<padding>
|
||||||
<Insets left="10.0" top="10.0" />
|
<Insets left="10.0" top="10.0"/>
|
||||||
</padding>
|
</padding>
|
||||||
</JFXTextArea>
|
</JFXTextArea>
|
||||||
<JFXTextField fx:id="textField" focusColor="#909090" layoutY="420.0" prefHeight="30.0" prefWidth="543.0" promptText="Введите команду..." unFocusColor="#ffffff00">
|
<JFXTextField fx:id="textField" focusColor="#909090" layoutY="420.0" prefHeight="30.0" prefWidth="543.0"
|
||||||
|
promptText="Введите команду..." unFocusColor="#ffffff00">
|
||||||
<opaqueInsets>
|
<opaqueInsets>
|
||||||
<Insets />
|
<Insets/>
|
||||||
</opaqueInsets>
|
</opaqueInsets>
|
||||||
<padding>
|
<padding>
|
||||||
<Insets left="10.0" />
|
<Insets left="10.0"/>
|
||||||
</padding>
|
</padding>
|
||||||
</JFXTextField>
|
</JFXTextField>
|
||||||
<JFXButton fx:id="send" defaultButton="true" layoutX="542.0" layoutY="420.0" prefHeight="30.0" prefWidth="147.0" ripplerFill="WHITE" text="Выполнить" />
|
<JFXButton fx:id="send" defaultButton="true" layoutX="542.0" layoutY="420.0" prefHeight="30.0" prefWidth="147.0"
|
||||||
<Line endX="594.0" layoutX="98.0" layoutY="420.0" startX="-100.0" stroke="#5b3636" styleClass="lineHead" />
|
ripplerFill="WHITE" text="Выполнить"/>
|
||||||
|
<Line endX="594.0" layoutX="98.0" layoutY="420.0" startX="-100.0" stroke="#5b3636" styleClass="lineHead"/>
|
||||||
</children>
|
</children>
|
||||||
<stylesheets>
|
<stylesheets>
|
||||||
<URL value="@../../styles.css" />
|
<URL value="@../../styles.css"/>
|
||||||
<URL value="@../../overlay/debug/debug.css" />
|
<URL value="@../../overlay/debug/debug.css"/>
|
||||||
</stylesheets>
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -15,50 +15,62 @@
|
||||||
<!-- DrLeonardo Design -->
|
<!-- DrLeonardo Design -->
|
||||||
|
|
||||||
<Pane fx:id="loginPane" prefWidth="740.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="loginPane" prefWidth="740.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<children>
|
<children>
|
||||||
<Pane fx:id="layout" prefWidth="740.0">
|
<Pane fx:id="layout" prefWidth="740.0">
|
||||||
<children>
|
<children>
|
||||||
<Pane fx:id="authPane" layoutX="422.0" prefHeight="411.0" prefWidth="286.0" styleClass="loginPane">
|
<Pane fx:id="authPane" layoutX="422.0" prefHeight="411.0" prefWidth="286.0" styleClass="loginPane">
|
||||||
<children>
|
<children>
|
||||||
<Pane fx:id="logo" layoutX="72.0" layoutY="62.0" prefWidth="124.0" styleClass="logo">
|
<Pane fx:id="logo" layoutX="72.0" layoutY="62.0" prefWidth="124.0" styleClass="logo">
|
||||||
</Pane>
|
</Pane>
|
||||||
<JFXTextField id="login" alignment="CENTER" focusColor="#5fd97a" layoutX="34.0" layoutY="196.0" promptText="Логин" unFocusColor="#dadada" />
|
<JFXTextField id="login" alignment="CENTER" focusColor="#5fd97a" layoutX="34.0" layoutY="196.0"
|
||||||
<JFXPasswordField id="password" alignment="CENTER" focusColor="#5fd97a" layoutX="34.0" layoutY="249.0" promptText="Пароль" unFocusColor="#dadada" />
|
promptText="Логин" unFocusColor="#dadada"/>
|
||||||
<JFXButton id="goAuth" layoutX="34.0" layoutY="370.0" styleClass="auth" text="ВОЙТИ" />
|
<JFXPasswordField id="password" alignment="CENTER" focusColor="#5fd97a" layoutX="34.0"
|
||||||
<JFXCheckBox id="rememberchb" fx:id="savePassword" checkedColor="#5fd97a" contentDisplay="CENTER" layoutX="63.0" layoutY="297.0" prefWidth="144.0" text="Сохранить пароль" textFill="#dadada" unCheckedColor="#909090" />
|
layoutY="249.0" promptText="Пароль" unFocusColor="#dadada"/>
|
||||||
<JFXComboBox id="authOptions" fx:id="authOptions" focusColor="#5fd97a" layoutX="34.0" layoutY="341.0" prefHeight="25.0" prefWidth="200.0" promptText="Авторизация 1" unFocusColor="#70666600">
|
<JFXButton id="goAuth" layoutX="34.0" layoutY="370.0" styleClass="auth" text="ВОЙТИ"/>
|
||||||
<styleClass>
|
<JFXCheckBox id="rememberchb" fx:id="savePassword" checkedColor="#5fd97a"
|
||||||
<String fx:value="combologin" />
|
contentDisplay="CENTER" layoutX="63.0" layoutY="297.0" prefWidth="144.0"
|
||||||
<String fx:value="combologin-popup" />
|
text="Сохранить пароль" textFill="#dadada" unCheckedColor="#909090"/>
|
||||||
</styleClass></JFXComboBox>
|
<JFXComboBox id="authOptions" fx:id="authOptions" focusColor="#5fd97a" layoutX="34.0"
|
||||||
<Hyperlink id="link" fx:id="link" layoutX="94.0" layoutY="422.0" prefHeight="19.0" prefWidth="81.0" textAlignment="CENTER" />
|
layoutY="341.0" prefHeight="25.0" prefWidth="200.0" promptText="Авторизация 1"
|
||||||
</children>
|
unFocusColor="#70666600">
|
||||||
</Pane>
|
<styleClass>
|
||||||
<JFXMasonryPane fx:id="news" prefHeight="432.0" prefWidth="423.0" styleClass="news" />
|
<String fx:value="combologin"/>
|
||||||
</children>
|
<String fx:value="combologin-popup"/>
|
||||||
</Pane>
|
</styleClass>
|
||||||
<Pane id="mask" opacity="0.0" prefHeight="425.0" prefWidth="694.0" visible="false" />
|
</JFXComboBox>
|
||||||
<Pane fx:id="bar" layoutX="696.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
<Hyperlink id="link" fx:id="link" layoutX="94.0" layoutY="422.0" prefHeight="19.0"
|
||||||
<children>
|
prefWidth="81.0" textAlignment="CENTER"/>
|
||||||
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
</children>
|
||||||
<graphic>
|
</Pane>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER" />
|
<JFXMasonryPane fx:id="news" prefHeight="432.0" prefWidth="423.0" styleClass="news"/>
|
||||||
</graphic>
|
</children>
|
||||||
</JFXButton>
|
</Pane>
|
||||||
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text="" textAlignment="CENTER">
|
<Pane id="mask" opacity="0.0" prefHeight="425.0" prefWidth="694.0" visible="false"/>
|
||||||
<graphic>
|
<Pane fx:id="bar" layoutX="696.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER" />
|
<children>
|
||||||
</graphic>
|
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464"
|
||||||
</JFXButton>
|
text="" textAlignment="CENTER">
|
||||||
<JFXButton id="discord" alignment="CENTER" contentDisplay="CENTER" layoutY="370.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
<graphic>
|
||||||
<graphic>
|
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER"/>
|
||||||
<MaterialDesignIconView fill="#5fd97a" glyphName="MESSAGE_TEXT" size="20" textAlignment="CENTER" />
|
</graphic>
|
||||||
</graphic>
|
</JFXButton>
|
||||||
</JFXButton>
|
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text=""
|
||||||
</children>
|
textAlignment="CENTER">
|
||||||
</Pane>
|
<graphic>
|
||||||
</children>
|
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER"/>
|
||||||
<stylesheets>
|
</graphic>
|
||||||
<URL value="@../../styles.css" />
|
</JFXButton>
|
||||||
</stylesheets>
|
<JFXButton id="discord" alignment="CENTER" contentDisplay="CENTER" layoutY="370.0" ripplerFill="#646464"
|
||||||
|
text="" textAlignment="CENTER">
|
||||||
|
<graphic>
|
||||||
|
<MaterialDesignIconView fill="#5fd97a" glyphName="MESSAGE_TEXT" size="20"
|
||||||
|
textAlignment="CENTER"/>
|
||||||
|
</graphic>
|
||||||
|
</JFXButton>
|
||||||
|
</children>
|
||||||
|
</Pane>
|
||||||
|
</children>
|
||||||
|
<stylesheets>
|
||||||
|
<URL value="@../../styles.css"/>
|
||||||
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -13,98 +13,127 @@
|
||||||
|
|
||||||
<!-- DrLeonardo Design -->
|
<!-- DrLeonardo Design -->
|
||||||
|
|
||||||
<Pane fx:id="serverPaneLayout" maxHeight="-1.0" maxWidth="-1.0" prefWidth="740.0" visible="true" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="serverPaneLayout" maxHeight="-1.0" maxWidth="-1.0" prefWidth="740.0" visible="true"
|
||||||
|
xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<children>
|
<children>
|
||||||
<Pane fx:id="layout" maxHeight="-1.0" maxWidth="-1.0" prefWidth="740.0" visible="true" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="layout" maxHeight="-1.0" maxWidth="-1.0" prefWidth="740.0" visible="true"
|
||||||
<children>
|
xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<Pane id="serverPane" prefHeight="450.0" prefWidth="693.0">
|
<children>
|
||||||
<children>
|
<Pane id="serverPane" prefHeight="450.0" prefWidth="693.0">
|
||||||
<ScrollPane id="serverlist" hbarPolicy="NEVER" layoutX="1.0" prefHeight="450.0" prefWidth="307.0" visible="true">
|
<children>
|
||||||
<content>
|
<ScrollPane id="serverlist" hbarPolicy="NEVER" layoutX="1.0" prefHeight="450.0"
|
||||||
<FlowPane focusTraversable="false" prefHeight="446.0" prefWidth="306.0" prefWrapLength="0.0" rowValignment="TOP" vgap="10.0" visible="true">
|
prefWidth="307.0" visible="true">
|
||||||
<JFXButton id="servercontainer" ripplerFill="#ffffff80" text="">
|
<content>
|
||||||
<FlowPane.margin>
|
<FlowPane focusTraversable="false" prefHeight="446.0" prefWidth="306.0"
|
||||||
<Insets bottom="10.0" />
|
prefWrapLength="0.0" rowValignment="TOP" vgap="10.0" visible="true">
|
||||||
</FlowPane.margin></JFXButton>
|
<JFXButton id="servercontainer" ripplerFill="#ffffff80" text="">
|
||||||
<padding>
|
<FlowPane.margin>
|
||||||
<Insets left="10.0" top="10.0" />
|
<Insets bottom="10.0"/>
|
||||||
</padding>
|
</FlowPane.margin>
|
||||||
</FlowPane>
|
</JFXButton>
|
||||||
</content>
|
<padding>
|
||||||
</ScrollPane>
|
<Insets left="10.0" top="10.0"/>
|
||||||
<Pane id="serverentrance" layoutX="306.0" prefHeight="425.0" prefWidth="388.0" styleClass="serverentrance">
|
</padding>
|
||||||
<children>
|
</FlowPane>
|
||||||
<ScrollPane id="serverinfo" hbarPolicy="NEVER" layoutX="4.0" layoutY="53.0" pannable="true" prefHeight="322.0" prefWidth="381.0" visible="true">
|
</content>
|
||||||
<content>
|
</ScrollPane>
|
||||||
<FlowPane id="" focusTraversable="false" orientation="HORIZONTAL" prefHeight="310.0" prefWidth="369.0" rowValignment="TOP" visible="true">
|
<Pane id="serverentrance" layoutX="306.0" prefHeight="425.0" prefWidth="388.0"
|
||||||
<padding>
|
styleClass="serverentrance">
|
||||||
<Insets bottom="10.0" left="15.0" top="7.0" />
|
<children>
|
||||||
</padding>
|
<ScrollPane id="serverinfo" hbarPolicy="NEVER" layoutX="4.0" layoutY="53.0"
|
||||||
<children>
|
pannable="true" prefHeight="322.0" prefWidth="381.0" visible="true">
|
||||||
<Label id="serverDescription" alignment="TOP_LEFT" contentDisplay="LEFT" nodeOrientation="LEFT_TO_RIGHT" prefHeight="274.0" prefWidth="349.0" text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla convallis magna tellus, in bibendum tortor dignissim non. Phasellus vel tincidunt nulla, eu convallis ligula. Suspendisse ut diam vestibulum, tincidunt neque ut, posuere risus. Pellentesque posuere molestie eros, quis laoreet ante ornare quis. Morbi eu tortor fermentum, iaculis risus sit amet, fringilla augue. Aenean nulla purus, rutrum non sapien et, convallis tincidunt purus. Vivamus a eros pulvinar, dignissim leo lacinia, sodales nulla. Aliquam tortor augue, cursus a rutrum viverra, consequat non tellus. Donec porta nisl sed quam dictum commodo. Sed et vulputate dolor. Morbi ultrices justo vitae convallis semper. Donec sodales velit vel velit faucibus, et scelerisque felis finibus. Sed rutrum lacinia mauris, porta cursus mauris tempor eu. Duis turpis nulla, dictum vitae commodo rhoncus, pretium in turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos." textAlignment="JUSTIFY" textFill="#141414" wrapText="true" />
|
<content>
|
||||||
</children>
|
<FlowPane id="" focusTraversable="false" orientation="HORIZONTAL"
|
||||||
</FlowPane>
|
prefHeight="310.0" prefWidth="369.0" rowValignment="TOP"
|
||||||
</content>
|
visible="true">
|
||||||
</ScrollPane>
|
<padding>
|
||||||
<JFXButton id="clientLaunch" layoutX="19.0" layoutY="380.0" prefHeight="51.0" prefWidth="285.0" styleClass="clientLaunch" text="ИГРАТЬ">
|
<Insets bottom="10.0" left="15.0" top="7.0"/>
|
||||||
<font>
|
</padding>
|
||||||
<Font size="22.0" />
|
<children>
|
||||||
</font>
|
<Label id="serverDescription" alignment="TOP_LEFT" contentDisplay="LEFT"
|
||||||
</JFXButton>
|
nodeOrientation="LEFT_TO_RIGHT" prefHeight="274.0"
|
||||||
<JFXButton id="clientSettings" alignment="CENTER" centerShape="false" contentDisplay="CENTER" layoutX="305.0" layoutY="380.0" prefHeight="51.0" prefWidth="60.0" ripplerFill="#84da96" styleClass="clientSettings" text="" textAlignment="CENTER">
|
prefWidth="349.0"
|
||||||
<graphic>
|
text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla convallis magna tellus, in bibendum tortor dignissim non. Phasellus vel tincidunt nulla, eu convallis ligula. Suspendisse ut diam vestibulum, tincidunt neque ut, posuere risus. Pellentesque posuere molestie eros, quis laoreet ante ornare quis. Morbi eu tortor fermentum, iaculis risus sit amet, fringilla augue. Aenean nulla purus, rutrum non sapien et, convallis tincidunt purus. Vivamus a eros pulvinar, dignissim leo lacinia, sodales nulla. Aliquam tortor augue, cursus a rutrum viverra, consequat non tellus. Donec porta nisl sed quam dictum commodo. Sed et vulputate dolor. Morbi ultrices justo vitae convallis semper. Donec sodales velit vel velit faucibus, et scelerisque felis finibus. Sed rutrum lacinia mauris, porta cursus mauris tempor eu. Duis turpis nulla, dictum vitae commodo rhoncus, pretium in turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos."
|
||||||
<FontAwesomeIconView fill="WHITE" glyphName="SLIDERS" size="30.0" />
|
textAlignment="JUSTIFY" textFill="#141414" wrapText="true"/>
|
||||||
</graphic></JFXButton>
|
</children>
|
||||||
<Label id="serverStatus" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="165.0" layoutY="12.0" prefHeight="25.0" prefWidth="97.0" text="12/100" textAlignment="RIGHT" textFill="WHITE">
|
</FlowPane>
|
||||||
<font>
|
</content>
|
||||||
<Font name="System Bold" size="16.0" />
|
</ScrollPane>
|
||||||
</font>
|
<JFXButton id="clientLaunch" layoutX="19.0" layoutY="380.0" prefHeight="51.0"
|
||||||
</Label>
|
prefWidth="285.0" styleClass="clientLaunch" text="ИГРАТЬ">
|
||||||
<Label id="serverLabel" layoutX="20.0" layoutY="11.0" prefHeight="27.0" prefWidth="203.0" text="СЕРВЕР">
|
<font>
|
||||||
<font>
|
<Font size="22.0"/>
|
||||||
<Font name="System Bold" size="18.0" />
|
</font>
|
||||||
</font>
|
</JFXButton>
|
||||||
</Label>
|
<JFXButton id="clientSettings" alignment="CENTER" centerShape="false"
|
||||||
<JFXButton id="logout" alignment="CENTER" contentDisplay="CENTER" layoutX="295.0" layoutY="12.0" prefHeight="25.0" prefWidth="81.0" ripplerFill="#61616100" text="Выйти" textAlignment="CENTER" />
|
contentDisplay="CENTER" layoutX="305.0" layoutY="380.0" prefHeight="51.0"
|
||||||
</children>
|
prefWidth="60.0" ripplerFill="#84da96" styleClass="clientSettings" text=""
|
||||||
|
textAlignment="CENTER">
|
||||||
|
<graphic>
|
||||||
|
<FontAwesomeIconView fill="WHITE" glyphName="SLIDERS" size="30.0"/>
|
||||||
|
</graphic>
|
||||||
|
</JFXButton>
|
||||||
|
<Label id="serverStatus" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="165.0"
|
||||||
|
layoutY="12.0" prefHeight="25.0" prefWidth="97.0" text="12/100"
|
||||||
|
textAlignment="RIGHT" textFill="WHITE">
|
||||||
|
<font>
|
||||||
|
<Font name="System Bold" size="16.0"/>
|
||||||
|
</font>
|
||||||
|
</Label>
|
||||||
|
<Label id="serverLabel" layoutX="20.0" layoutY="11.0" prefHeight="27.0"
|
||||||
|
prefWidth="203.0" text="СЕРВЕР">
|
||||||
|
<font>
|
||||||
|
<Font name="System Bold" size="18.0"/>
|
||||||
|
</font>
|
||||||
|
</Label>
|
||||||
|
<JFXButton id="logout" alignment="CENTER" contentDisplay="CENTER" layoutX="295.0"
|
||||||
|
layoutY="12.0" prefHeight="25.0" prefWidth="81.0" ripplerFill="#61616100"
|
||||||
|
text="Выйти" textAlignment="CENTER"/>
|
||||||
|
</children>
|
||||||
|
</Pane>
|
||||||
|
</children>
|
||||||
</Pane>
|
</Pane>
|
||||||
</children>
|
</children>
|
||||||
</Pane>
|
|
||||||
</children>
|
|
||||||
</Pane>
|
</Pane>
|
||||||
<Pane fx:id="bar" layoutX="696.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
<Pane fx:id="bar" layoutX="696.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
||||||
<children>
|
<children>
|
||||||
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464"
|
||||||
|
text="" textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text="" textAlignment="CENTER">
|
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text=""
|
||||||
|
textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
<JFXButton id="discord" alignment="CENTER" contentDisplay="CENTER" layoutY="380.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
<JFXButton id="discord" alignment="CENTER" contentDisplay="CENTER" layoutY="380.0" ripplerFill="#646464"
|
||||||
|
text="" textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="#5fd97a" glyphName="MESSAGE_TEXT" size="20" smooth="false" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="#5fd97a" glyphName="MESSAGE_TEXT" size="20" smooth="false"
|
||||||
|
textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
<JFXButton id="settings" alignment="CENTER" contentDisplay="CENTER" layoutY="90.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
<JFXButton id="settings" alignment="CENTER" contentDisplay="CENTER" layoutY="90.0" ripplerFill="#646464"
|
||||||
|
text="" textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="SETTINGS" size="20" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="WHITE" glyphName="SETTINGS" size="20" textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
<JFXButton id="goConsole" alignment="CENTER" contentDisplay="CENTER" layoutY="138.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
<JFXButton id="goConsole" alignment="CENTER" contentDisplay="CENTER" layoutY="138.0"
|
||||||
|
ripplerFill="#646464" text="" textAlignment="CENTER">
|
||||||
<graphic>
|
<graphic>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="CONSOLE" size="20" textAlignment="CENTER" />
|
<MaterialDesignIconView fill="WHITE" glyphName="CONSOLE" size="20" textAlignment="CENTER"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
</children>
|
</children>
|
||||||
</Pane>
|
</Pane>
|
||||||
<Pane id="mask" opacity="0.0" prefHeight="425.0" prefWidth="694.0" visible="false" />
|
<Pane id="mask" opacity="0.0" prefHeight="425.0" prefWidth="694.0" visible="false"/>
|
||||||
</children>
|
</children>
|
||||||
<stylesheets>
|
<stylesheets>
|
||||||
<URL value="@../../styles.css" />
|
<URL value="@../../styles.css"/>
|
||||||
<URL value="@../../servers.css" />
|
<URL value="@../../servers.css"/>
|
||||||
</stylesheets>
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -12,48 +12,56 @@
|
||||||
|
|
||||||
<!-- DrLeonardo Design -->
|
<!-- DrLeonardo Design -->
|
||||||
|
|
||||||
<Pane fx:id="background" prefHeight="450.0" prefWidth="738.0" xmlns="http://javafx.com/javafx/8.0.201" xmlns:fx="http://javafx.com/fxml/1">
|
<Pane fx:id="background" prefHeight="450.0" prefWidth="738.0" xmlns="http://javafx.com/javafx/8.0.201"
|
||||||
<children>
|
xmlns:fx="http://javafx.com/fxml/1">
|
||||||
<Pane id="optionsPane" prefHeight="450.0" prefWidth="692.0" styleClass="optionsPane">
|
<children>
|
||||||
<children>
|
<Pane id="optionsPane" prefHeight="450.0" prefWidth="692.0" styleClass="optionsPane">
|
||||||
<JFXToggleButton fx:id="presset" layoutX="30.0" layoutY="10.0" opacity="0.21" styleClass="pressetLight" text="Presset 1" />
|
<children>
|
||||||
<JFXToggleButton fx:id="presset" layoutX="287.0" layoutY="10.0" opacity="0.21" styleClass="pressetMedium" text="Presset 2" />
|
<JFXToggleButton fx:id="presset" layoutX="30.0" layoutY="10.0" opacity="0.21" styleClass="pressetLight"
|
||||||
<JFXToggleButton fx:id="isPresset" layoutX="528.0" layoutY="10.0" opacity="0.21" prefHeight="58.0" prefWidth="134.0" styleClass="pressetHigh" text="Presset 3" wrapText="true" />
|
text="Presset 1"/>
|
||||||
<Line endX="595.0" layoutX="100.0" layoutY="80.0" startX="-100.0" stroke="#5b3636" styleClass="lineHead" />
|
<JFXToggleButton fx:id="presset" layoutX="287.0" layoutY="10.0" opacity="0.21"
|
||||||
<ScrollPane id="modlist" layoutY="84.0" prefHeight="364.0" prefWidth="693.0">
|
styleClass="pressetMedium" text="Presset 2"/>
|
||||||
<content>
|
<JFXToggleButton fx:id="isPresset" layoutX="528.0" layoutY="10.0" opacity="0.21" prefHeight="58.0"
|
||||||
<VBox prefHeight="360.0" prefWidth="678.0">
|
prefWidth="134.0" styleClass="pressetHigh" text="Presset 3" wrapText="true"/>
|
||||||
<children>
|
<Line endX="595.0" layoutX="100.0" layoutY="80.0" startX="-100.0" stroke="#5b3636"
|
||||||
</children>
|
styleClass="lineHead"/>
|
||||||
<padding>
|
<ScrollPane id="modlist" layoutY="84.0" prefHeight="364.0" prefWidth="693.0">
|
||||||
<Insets left="10.0" top="8.0" />
|
<content>
|
||||||
</padding>
|
<VBox prefHeight="360.0" prefWidth="678.0">
|
||||||
</VBox>
|
<children>
|
||||||
</content>
|
</children>
|
||||||
</ScrollPane>
|
<padding>
|
||||||
</children>
|
<Insets left="10.0" top="8.0"/>
|
||||||
</Pane>
|
</padding>
|
||||||
<Pane fx:id="bar" layoutX="692.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
</VBox>
|
||||||
<children>
|
</content>
|
||||||
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
</ScrollPane>
|
||||||
<graphic>
|
</children>
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER" />
|
</Pane>
|
||||||
</graphic>
|
<Pane fx:id="bar" layoutX="692.0" prefHeight="425.0" prefWidth="43.0" styleClass="bar">
|
||||||
</JFXButton>
|
<children>
|
||||||
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text="" textAlignment="CENTER">
|
<JFXButton id="hide" alignment="CENTER" contentDisplay="CENTER" layoutY="45.0" ripplerFill="#646464"
|
||||||
<graphic>
|
text="" textAlignment="CENTER">
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER" />
|
<graphic>
|
||||||
</graphic>
|
<MaterialDesignIconView fill="WHITE" glyphName="MINUS" size="30" textAlignment="CENTER"/>
|
||||||
</JFXButton>
|
</graphic>
|
||||||
<JFXButton id="back" alignment="CENTER" contentDisplay="CENTER" layoutY="405.0" ripplerFill="#646464" text="" textAlignment="CENTER">
|
</JFXButton>
|
||||||
<graphic>
|
<JFXButton id="close" alignment="CENTER" contentDisplay="CENTER" ripplerFill="#fb8c8c" text=""
|
||||||
<MaterialDesignIconView fill="WHITE" glyphName="CHEVRON_LEFT" size="30" textAlignment="CENTER" />
|
textAlignment="CENTER">
|
||||||
</graphic>
|
<graphic>
|
||||||
</JFXButton>
|
<MaterialDesignIconView fill="WHITE" glyphName="CLOSE" size="30" textAlignment="CENTER"/>
|
||||||
</children>
|
</graphic>
|
||||||
</Pane>
|
</JFXButton>
|
||||||
</children>
|
<JFXButton id="back" alignment="CENTER" contentDisplay="CENTER" layoutY="405.0" ripplerFill="#646464"
|
||||||
<stylesheets>
|
text="" textAlignment="CENTER">
|
||||||
<URL value="@../../styles.css" />
|
<graphic>
|
||||||
</stylesheets>
|
<MaterialDesignIconView fill="WHITE" glyphName="CHEVRON_LEFT" size="30" textAlignment="CENTER"/>
|
||||||
|
</graphic>
|
||||||
|
</JFXButton>
|
||||||
|
</children>
|
||||||
|
</Pane>
|
||||||
|
</children>
|
||||||
|
<stylesheets>
|
||||||
|
<URL value="@../../styles.css"/>
|
||||||
|
</stylesheets>
|
||||||
</Pane>
|
</Pane>
|
||||||
|
|
|
@ -27,27 +27,22 @@ public static void main(String[] arguments) throws IOException, InterruptedExcep
|
||||||
EnvHelper.checkDangerousParams();
|
EnvHelper.checkDangerousParams();
|
||||||
LauncherConfig config = Launcher.getConfig();
|
LauncherConfig config = Launcher.getConfig();
|
||||||
LogHelper.info("Launcher for project %s", config.projectname);
|
LogHelper.info("Launcher for project %s", config.projectname);
|
||||||
if(config.environment.equals(LauncherConfig.LauncherEnvironment.PROD))
|
if (config.environment.equals(LauncherConfig.LauncherEnvironment.PROD)) {
|
||||||
{
|
if (System.getProperty(LogHelper.DEBUG_PROPERTY) != null) {
|
||||||
if(System.getProperty(LogHelper.DEBUG_PROPERTY) != null)
|
|
||||||
{
|
|
||||||
LogHelper.warning("Found -Dlauncher.debug=true");
|
LogHelper.warning("Found -Dlauncher.debug=true");
|
||||||
}
|
}
|
||||||
if(System.getProperty(LogHelper.STACKTRACE_PROPERTY) != null)
|
if (System.getProperty(LogHelper.STACKTRACE_PROPERTY) != null) {
|
||||||
{
|
|
||||||
LogHelper.warning("Found -Dlauncher.stacktrace=true");
|
LogHelper.warning("Found -Dlauncher.stacktrace=true");
|
||||||
}
|
}
|
||||||
LogHelper.info("Debug mode disabled (found env PRODUCTION)");
|
LogHelper.info("Debug mode disabled (found env PRODUCTION)");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
LogHelper.info("If need debug output use -Dlauncher.debug=true");
|
LogHelper.info("If need debug output use -Dlauncher.debug=true");
|
||||||
LogHelper.info("If need stacktrace output use -Dlauncher.stacktrace=true");
|
LogHelper.info("If need stacktrace output use -Dlauncher.stacktrace=true");
|
||||||
if(LogHelper.isDebugEnabled()) waitProcess = true;
|
if (LogHelper.isDebugEnabled()) waitProcess = true;
|
||||||
}
|
}
|
||||||
LogHelper.info("Restart Launcher with JavaAgent...");
|
LogHelper.info("Restart Launcher with JavaAgent...");
|
||||||
ProcessBuilder processBuilder = new ProcessBuilder();
|
ProcessBuilder processBuilder = new ProcessBuilder();
|
||||||
if(waitProcess) processBuilder.inheritIO();
|
if (waitProcess) processBuilder.inheritIO();
|
||||||
Path javaBin = IOHelper.resolveJavaBin(Paths.get(System.getProperty("java.home")));
|
Path javaBin = IOHelper.resolveJavaBin(Paths.get(System.getProperty("java.home")));
|
||||||
List<String> args = new LinkedList<>();
|
List<String> args = new LinkedList<>();
|
||||||
args.add(javaBin.toString());
|
args.add(javaBin.toString());
|
||||||
|
|
|
@ -37,28 +37,28 @@ public boolean isAgentStarted() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void premain(String agentArgument, Instrumentation instrumentation) {
|
public static void premain(String agentArgument, Instrumentation instrumentation) {
|
||||||
System.out.println("Launcher Agent");
|
System.out.println("Launcher Agent");
|
||||||
inst = instrumentation;
|
inst = instrumentation;
|
||||||
SafeExitJVMLegacy.class.getName();
|
SafeExitJVMLegacy.class.getName();
|
||||||
SafeExitJVM.class.getName();
|
SafeExitJVM.class.getName();
|
||||||
NativeJVMHalt.class.getName();
|
NativeJVMHalt.class.getName();
|
||||||
NativeJVMHalt.initFunc();
|
NativeJVMHalt.initFunc();
|
||||||
isAgentStarted = true;
|
isAgentStarted = true;
|
||||||
boolean pb = true;
|
boolean pb = true;
|
||||||
boolean rt = true;
|
boolean rt = true;
|
||||||
if (agentArgument != null) {
|
if (agentArgument != null) {
|
||||||
String trimmedArg = agentArgument.trim();
|
String trimmedArg = agentArgument.trim();
|
||||||
if (!trimmedArg.isEmpty()) {
|
if (!trimmedArg.isEmpty()) {
|
||||||
if (trimmedArg.contains("p")) pb = false;
|
if (trimmedArg.contains("p")) pb = false;
|
||||||
if (trimmedArg.contains("r")) rt = false;
|
if (trimmedArg.contains("r")) rt = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (ManagementFactory.getOperatingSystemMXBean().getName().startsWith("Windows")) replaceClasses(pb, rt);
|
if (ManagementFactory.getOperatingSystemMXBean().getName().startsWith("Windows")) replaceClasses(pb, rt);
|
||||||
else replaceClasses(false, false);
|
else replaceClasses(false, false);
|
||||||
} catch (Error e) {
|
} catch (Error e) {
|
||||||
NativeJVMHalt.haltA(294);
|
NativeJVMHalt.haltA(294);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,39 +67,39 @@ public static boolean isStarted() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void replaceClasses(boolean pb, boolean rt) {
|
private static void replaceClasses(boolean pb, boolean rt) {
|
||||||
java.awt.Robot.class.getName();
|
java.awt.Robot.class.getName();
|
||||||
List<java.lang.instrument.ClassDefinition> defs = new ArrayList<>();
|
List<java.lang.instrument.ClassDefinition> defs = new ArrayList<>();
|
||||||
if(rt) {
|
if (rt) {
|
||||||
try {
|
try {
|
||||||
defs.add(new java.lang.instrument.ClassDefinition(java.lang.Runtime.class, transformClass(java.lang.Runtime.class.getName(), getClassFile(java.lang.Runtime.class))));
|
defs.add(new java.lang.instrument.ClassDefinition(java.lang.Runtime.class, transformClass(java.lang.Runtime.class.getName(), getClassFile(java.lang.Runtime.class))));
|
||||||
} catch(Exception e) {
|
} catch (Exception e) {
|
||||||
throw new Error(e);
|
throw new Error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(pb) {
|
if (pb) {
|
||||||
try {
|
try {
|
||||||
defs.add(new java.lang.instrument.ClassDefinition(java.lang.ProcessBuilder.class, transformClass(java.lang.ProcessBuilder.class.getName(), getClassFile(java.lang.ProcessBuilder.class))));
|
defs.add(new java.lang.instrument.ClassDefinition(java.lang.ProcessBuilder.class, transformClass(java.lang.ProcessBuilder.class.getName(), getClassFile(java.lang.ProcessBuilder.class))));
|
||||||
} catch(Exception e) {
|
} catch (Exception e) {
|
||||||
throw new Error(e);
|
throw new Error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
defs.add(new java.lang.instrument.ClassDefinition(java.awt.Robot.class, transformClass(java.awt.Robot.class.getName(), getClassFile(java.awt.Robot.class))));
|
defs.add(new java.lang.instrument.ClassDefinition(java.awt.Robot.class, transformClass(java.awt.Robot.class.getName(), getClassFile(java.awt.Robot.class))));
|
||||||
} catch(Exception e) {
|
} catch (Exception e) {
|
||||||
throw new Error(e);
|
throw new Error(e);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
inst.redefineClasses(defs.toArray(new java.lang.instrument.ClassDefinition[0]));
|
inst.redefineClasses(defs.toArray(new java.lang.instrument.ClassDefinition[0]));
|
||||||
} catch(Exception e) {
|
} catch (Exception e) {
|
||||||
throw new Error(e);
|
throw new Error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author https://github.com/Konloch/JVM-Sandbox
|
* @author https://github.com/Konloch/JVM-Sandbox
|
||||||
* Use ASM to modify the byte array
|
* Use ASM to modify the byte array
|
||||||
*/
|
*/
|
||||||
private static byte[] transformClass(String className, byte[] classBytes) {
|
private static byte[] transformClass(String className, byte[] classBytes) {
|
||||||
switch (className) {
|
switch (className) {
|
||||||
case "java.lang.Runtime": {
|
case "java.lang.Runtime": {
|
||||||
ClassReader cr = new ClassReader(classBytes);
|
ClassReader cr = new ClassReader(classBytes);
|
||||||
|
@ -153,26 +153,26 @@ private static byte[] transformClass(String className, byte[] classBytes) {
|
||||||
return cw.toByteArray();
|
return cw.toByteArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return classBytes;
|
return classBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param clazz
|
||||||
|
* @return array, respending this class in bytecode.
|
||||||
|
* @throws IOException
|
||||||
* @author https://github.com/Konloch/JVM-Sandbox
|
* @author https://github.com/Konloch/JVM-Sandbox
|
||||||
* Do not remove this method. Do not to cause classloading!
|
* Do not remove this method. Do not to cause classloading!
|
||||||
* Grab the byte array from the loaded Class object
|
* Grab the byte array from the loaded Class object
|
||||||
* @param clazz
|
*/
|
||||||
* @return array, respending this class in bytecode.
|
private static byte[] getClassFile(Class<?> clazz) throws IOException {
|
||||||
* @throws IOException
|
try (InputStream is = clazz.getResourceAsStream("/" + clazz.getName().replace('.', '/') + ".class");
|
||||||
*/
|
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
||||||
private static byte[] getClassFile(Class<?> clazz) throws IOException {
|
int r = 0;
|
||||||
try (InputStream is = clazz.getResourceAsStream( "/" + clazz.getName().replace('.', '/') + ".class");
|
byte[] buffer = new byte[8192];
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
while ((r = is.read(buffer)) >= 0) {
|
||||||
int r = 0;
|
baos.write(buffer, 0, r);
|
||||||
byte[] buffer = new byte[8192];
|
}
|
||||||
while((r=is.read(buffer))>=0) {
|
return baos.toByteArray();
|
||||||
baos.write(buffer, 0, r);
|
}
|
||||||
}
|
}
|
||||||
return baos.toByteArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,9 +33,8 @@ public static void main(String... args) throws Throwable {
|
||||||
initGson();
|
initGson();
|
||||||
ConsoleManager.initConsole();
|
ConsoleManager.initConsole();
|
||||||
LauncherConfig config = Launcher.getConfig();
|
LauncherConfig config = Launcher.getConfig();
|
||||||
if(config.environment.equals(LauncherConfig.LauncherEnvironment.PROD))
|
if (config.environment.equals(LauncherConfig.LauncherEnvironment.PROD)) {
|
||||||
{
|
if (!LauncherAgent.isStarted()) throw new SecurityException("LauncherAgent must started");
|
||||||
if(!LauncherAgent.isStarted()) throw new SecurityException("LauncherAgent must started");
|
|
||||||
}
|
}
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
try {
|
try {
|
||||||
|
@ -73,8 +72,7 @@ public void start(String... args) throws Throwable {
|
||||||
if (runtimeProvider == null) runtimeProvider = new JSRuntimeProvider();
|
if (runtimeProvider == null) runtimeProvider = new JSRuntimeProvider();
|
||||||
runtimeProvider.init(false);
|
runtimeProvider.init(false);
|
||||||
runtimeProvider.preLoad();
|
runtimeProvider.preLoad();
|
||||||
if(Request.service == null)
|
if (Request.service == null) {
|
||||||
{
|
|
||||||
String address = Launcher.getConfig().address;
|
String address = Launcher.getConfig().address;
|
||||||
LogHelper.debug("Start async connection to %s", address);
|
LogHelper.debug("Start async connection to %s", address);
|
||||||
Request.service = StandartClientWebSocketService.initWebSockets(address, true);
|
Request.service = StandartClientWebSocketService.initWebSockets(address, true);
|
||||||
|
|
|
@ -37,8 +37,8 @@ public class NewLauncherSettings {
|
||||||
public List<ClientProfile> lastProfiles = new LinkedList<>();
|
public List<ClientProfile> lastProfiles = new LinkedList<>();
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public Map<String, UserSettings> userSettings = new HashMap<>();
|
public Map<String, UserSettings> userSettings = new HashMap<>();
|
||||||
public static class HashedStoreEntry
|
|
||||||
{
|
public static class HashedStoreEntry {
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public HashedDir hdir;
|
public HashedDir hdir;
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
|
@ -52,15 +52,15 @@ public HashedStoreEntry(HashedDir hdir, String name, String fullPath) {
|
||||||
this.fullPath = fullPath;
|
this.fullPath = fullPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public transient List<HashedStoreEntry> lastHDirs = new ArrayList<>(16);
|
public transient List<HashedStoreEntry> lastHDirs = new ArrayList<>(16);
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void putHDir(String name, Path path, HashedDir dir)
|
public void putHDir(String name, Path path, HashedDir dir) {
|
||||||
{
|
|
||||||
String fullPath = path.toAbsolutePath().toString();
|
String fullPath = path.toAbsolutePath().toString();
|
||||||
for(HashedStoreEntry e : lastHDirs)
|
for (HashedStoreEntry e : lastHDirs) {
|
||||||
{
|
if (e.fullPath.equals(fullPath) && e.name.equals(name)) return;
|
||||||
if(e.fullPath.equals(fullPath) && e.name.equals(name)) return;
|
|
||||||
}
|
}
|
||||||
lastHDirs.add(new HashedStoreEntry(dir, name, fullPath));
|
lastHDirs.add(new HashedStoreEntry(dir, name, fullPath));
|
||||||
}
|
}
|
||||||
|
|
|
@ -541,8 +541,7 @@ public static void verifyHDir(Path dir, HashedDir hdir, FileNameMatcher matcher,
|
||||||
// Hash directory and compare (ignore update-only matcher entries, it will break offline-mode)
|
// Hash directory and compare (ignore update-only matcher entries, it will break offline-mode)
|
||||||
HashedDir currentHDir = new HashedDir(dir, matcher, true, digest);
|
HashedDir currentHDir = new HashedDir(dir, matcher, true, digest);
|
||||||
HashedDir.Diff diff = hdir.diff(currentHDir, matcher);
|
HashedDir.Diff diff = hdir.diff(currentHDir, matcher);
|
||||||
if (!diff.isSame())
|
if (!diff.isSame()) {
|
||||||
{
|
|
||||||
/*AtomicBoolean isFoundFile = new AtomicBoolean(false);
|
/*AtomicBoolean isFoundFile = new AtomicBoolean(false);
|
||||||
diff.extra.walk(File.separator, (e,k,v) -> {
|
diff.extra.walk(File.separator, (e,k,v) -> {
|
||||||
if(v.getType().equals(HashedEntry.Type.FILE)) { LogHelper.error("Extra file %s", e); isFoundFile.set(true); }
|
if(v.getType().equals(HashedEntry.Type.FILE)) { LogHelper.error("Extra file %s", e); isFoundFile.set(true); }
|
||||||
|
|
|
@ -68,19 +68,19 @@ public static Path getAppDataDir() throws IOException {
|
||||||
public static Path getLauncherDir(String projectname) throws IOException {
|
public static Path getLauncherDir(String projectname) throws IOException {
|
||||||
return getAppDataDir().resolve(projectname);
|
return getAppDataDir().resolve(projectname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static Path getStoreDir(String projectname) throws IOException
|
public static Path getStoreDir(String projectname) throws IOException {
|
||||||
{
|
if (JVMHelper.OS_TYPE == JVMHelper.OS.LINUX)
|
||||||
if(JVMHelper.OS_TYPE == JVMHelper.OS.LINUX)
|
|
||||||
return getAppDataDir().resolve("store");
|
return getAppDataDir().resolve("store");
|
||||||
else if(JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE)
|
else if (JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE)
|
||||||
return getAppDataDir().resolve("GravitLauncherStore");
|
return getAppDataDir().resolve("GravitLauncherStore");
|
||||||
else
|
else
|
||||||
return getAppDataDir().resolve("minecraftStore");
|
return getAppDataDir().resolve("minecraftStore");
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static Path getProjectStoreDir(String projectname) throws IOException
|
public static Path getProjectStoreDir(String projectname) throws IOException {
|
||||||
{
|
|
||||||
return getStoreDir(projectname).resolve(projectname);
|
return getStoreDir(projectname).resolve(projectname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class FunctionalBridge {
|
||||||
public static AtomicReference<HWID> hwid = new AtomicReference<>();
|
public static AtomicReference<HWID> hwid = new AtomicReference<>();
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static Thread getHWID = null;
|
public static Thread getHWID = null;
|
||||||
|
|
||||||
private static long cachedMemorySize = -1;
|
private static long cachedMemorySize = -1;
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
|
@ -57,8 +57,8 @@ public static HWID getHWID() {
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static int getTotalMemory() {
|
public static int getTotalMemory() {
|
||||||
if (cachedMemorySize > 0) return (int)cachedMemorySize;
|
if (cachedMemorySize > 0) return (int) cachedMemorySize;
|
||||||
return (int)(cachedMemorySize = hwidProvider.getTotalMemory() >> 20);
|
return (int) (cachedMemorySize = hwidProvider.getTotalMemory() >> 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
|
@ -79,21 +79,20 @@ public static int getJVMTotalMemory() {
|
||||||
public static HasherStore getDefaultHasherStore() {
|
public static HasherStore getDefaultHasherStore() {
|
||||||
return HasherManager.getDefaultStore();
|
return HasherManager.getDefaultStore();
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static void registerUserSettings(String typename, Class<? extends UserSettings> clazz)
|
public static void registerUserSettings(String typename, Class<? extends UserSettings> clazz) {
|
||||||
{
|
|
||||||
UserSettings.providers.register(typename, clazz);
|
UserSettings.providers.register(typename, clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static void close() throws Exception
|
public static void close() throws Exception {
|
||||||
{
|
|
||||||
threadPool.awaitTermination(2, TimeUnit.SECONDS);
|
threadPool.awaitTermination(2, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static void setAuthParams(AuthRequestEvent event) {
|
public static void setAuthParams(AuthRequestEvent event) {
|
||||||
if(event.session != 0)
|
if (event.session != 0) {
|
||||||
{
|
|
||||||
Request.setSession(event.session);
|
Request.setSession(event.session);
|
||||||
}
|
}
|
||||||
LauncherGuardManager.guard.setProtectToken(event.protectToken);
|
LauncherGuardManager.guard.setProtectToken(event.protectToken);
|
||||||
|
@ -105,13 +104,12 @@ public interface HashedDirRunnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static void evalCommand(String cmd)
|
public static void evalCommand(String cmd) {
|
||||||
{
|
|
||||||
ConsoleManager.handler.eval(cmd, false);
|
ConsoleManager.handler.eval(cmd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static void addPlainOutput(LogHelper.Output output)
|
public static void addPlainOutput(LogHelper.Output output) {
|
||||||
{
|
|
||||||
LogHelper.addOutput(output, LogHelper.OutputTypes.PLAIN);
|
LogHelper.addOutput(output, LogHelper.OutputTypes.PLAIN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,14 +18,11 @@ public String getUsageDescription() {
|
||||||
@Override
|
@Override
|
||||||
public void invoke(String... args) throws Exception {
|
public void invoke(String... args) throws Exception {
|
||||||
verifyArgs(args, 1);
|
verifyArgs(args, 1);
|
||||||
if(ConsoleManager.checkUnlockKey(args[0]))
|
if (ConsoleManager.checkUnlockKey(args[0])) {
|
||||||
{
|
|
||||||
LogHelper.info("Unlock successful");
|
LogHelper.info("Unlock successful");
|
||||||
ConsoleManager.unlock();
|
ConsoleManager.unlock();
|
||||||
ConsoleManager.handler.unregisterCommand("unlock");
|
ConsoleManager.handler.unregisterCommand("unlock");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
LogHelper.error("Unlock key incorrect");
|
LogHelper.error("Unlock key incorrect");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,6 @@ public String getUsageDescription() {
|
||||||
@Override
|
@Override
|
||||||
public void invoke(String... args) throws Exception {
|
public void invoke(String... args) throws Exception {
|
||||||
ExecCommandRequestEvent request = new ExecCommandRequest(String.join(" ", args)).request();
|
ExecCommandRequestEvent request = new ExecCommandRequest(String.join(" ", args)).request();
|
||||||
if(!request.success) LogHelper.error("Error executing command");
|
if (!request.success) LogHelper.error("Error executing command");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,7 @@
|
||||||
import ru.gravit.utils.helper.LogHelper;
|
import ru.gravit.utils.helper.LogHelper;
|
||||||
|
|
||||||
public class LogListenerCommand extends Command {
|
public class LogListenerCommand extends Command {
|
||||||
public class LogListenerRequest implements RequestInterface
|
public class LogListenerRequest implements RequestInterface {
|
||||||
{
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public LogHelper.OutputTypes outputType;
|
public LogHelper.OutputTypes outputType;
|
||||||
|
|
||||||
|
@ -22,6 +21,7 @@ public String getType() {
|
||||||
return "addLogListener";
|
return "addLogListener";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getArgsDescription() {
|
public String getArgsDescription() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -38,8 +38,7 @@ public void invoke(String... args) throws Exception {
|
||||||
Request.service.sendObject(new LogListenerRequest(LogHelper.JANSI ? LogHelper.OutputTypes.JANSI : LogHelper.OutputTypes.PLAIN));
|
Request.service.sendObject(new LogListenerRequest(LogHelper.JANSI ? LogHelper.OutputTypes.JANSI : LogHelper.OutputTypes.PLAIN));
|
||||||
LogHelper.info("Add log handler");
|
LogHelper.info("Add log handler");
|
||||||
Request.service.registerHandler((result) -> {
|
Request.service.registerHandler((result) -> {
|
||||||
if(result instanceof LogEvent)
|
if (result instanceof LogEvent) {
|
||||||
{
|
|
||||||
LogHelper.rawLog(() -> ((LogEvent) result).string, () -> ((LogEvent) result).string, () -> ((LogEvent) result).string);
|
LogHelper.rawLog(() -> ((LogEvent) result).string, () -> ((LogEvent) result).string, () -> ((LogEvent) result).string);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,20 +10,16 @@ public class LauncherGuardManager {
|
||||||
|
|
||||||
public static void initGuard(boolean clientInstance) {
|
public static void initGuard(boolean clientInstance) {
|
||||||
LauncherConfig config = Launcher.getConfig();
|
LauncherConfig config = Launcher.getConfig();
|
||||||
switch (config.guardType)
|
switch (config.guardType) {
|
||||||
{
|
case "wrapper": {
|
||||||
case "wrapper":
|
|
||||||
{
|
|
||||||
guard = new LauncherWrapperGuard();
|
guard = new LauncherWrapperGuard();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "java":
|
case "java": {
|
||||||
{
|
|
||||||
guard = new LauncherJavaGuard();
|
guard = new LauncherJavaGuard();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default: {
|
||||||
{
|
|
||||||
guard = new LauncherNoGuard();
|
guard = new LauncherNoGuard();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ public String getMacAddr() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTotalMemory() {
|
public long getTotalMemory() {
|
||||||
if (noHWID) return 1024<<20;
|
if (noHWID) return 1024 << 20;
|
||||||
if (hardware == null) hardware = systemInfo.getHardware();
|
if (hardware == null) hardware = systemInfo.getHardware();
|
||||||
return hardware.getMemory().getTotal();
|
return hardware.getMemory().getTotal();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
public class ConsoleManager {
|
public class ConsoleManager {
|
||||||
public static CommandHandler handler;
|
public static CommandHandler handler;
|
||||||
public static Thread thread;
|
public static Thread thread;
|
||||||
public static void initConsole() throws IOException
|
|
||||||
{
|
public static void initConsole() throws IOException {
|
||||||
CommandHandler localCommandHandler;
|
CommandHandler localCommandHandler;
|
||||||
try {
|
try {
|
||||||
Class.forName("org.jline.terminal.Terminal");
|
Class.forName("org.jline.terminal.Terminal");
|
||||||
|
@ -37,19 +37,19 @@ public static void initConsole() throws IOException
|
||||||
thread = CommonHelper.newThread("Launcher Console", true, handler);
|
thread = CommonHelper.newThread("Launcher Console", true, handler);
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
public static void registerCommands()
|
|
||||||
{
|
public static void registerCommands() {
|
||||||
handler.registerCommand("help", new HelpCommand(handler));
|
handler.registerCommand("help", new HelpCommand(handler));
|
||||||
handler.registerCommand("gc", new GCCommand());
|
handler.registerCommand("gc", new GCCommand());
|
||||||
handler.registerCommand("clear", new ClearCommand(handler));
|
handler.registerCommand("clear", new ClearCommand(handler));
|
||||||
handler.registerCommand("unlock", new UnlockCommand());
|
handler.registerCommand("unlock", new UnlockCommand());
|
||||||
}
|
}
|
||||||
public static boolean checkUnlockKey(String key)
|
|
||||||
{
|
public static boolean checkUnlockKey(String key) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
public static void unlock()
|
|
||||||
{
|
public static void unlock() {
|
||||||
handler.registerCommand("debug", new DebugCommand());
|
handler.registerCommand("debug", new DebugCommand());
|
||||||
BaseCommandCategory admin = new BaseCommandCategory();
|
BaseCommandCategory admin = new BaseCommandCategory();
|
||||||
admin.registerCommand("exec", new ExecCommand());
|
admin.registerCommand("exec", new ExecCommand());
|
||||||
|
|
|
@ -18,10 +18,8 @@ public class SettingsManager extends JsonConfigurable<NewLauncherSettings> {
|
||||||
public class StoreFileVisitor extends SimpleFileVisitor<Path> {
|
public class StoreFileVisitor extends SimpleFileVisitor<Path> {
|
||||||
@Override
|
@Override
|
||||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
|
||||||
throws IOException
|
throws IOException {
|
||||||
{
|
try (HInput input = new HInput(IOHelper.newInput(file))) {
|
||||||
try(HInput input = new HInput(IOHelper.newInput(file)))
|
|
||||||
{
|
|
||||||
String dirName = input.readString(128);
|
String dirName = input.readString(128);
|
||||||
String fullPath = input.readString(1024);
|
String fullPath = input.readString(1024);
|
||||||
HashedDir dir = new HashedDir(input);
|
HashedDir dir = new HashedDir(input);
|
||||||
|
@ -31,61 +29,63 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public static NewLauncherSettings settings;
|
public static NewLauncherSettings settings;
|
||||||
|
|
||||||
public SettingsManager() {
|
public SettingsManager() {
|
||||||
super(NewLauncherSettings.class, DirBridge.dir.resolve("settings.json"));
|
super(NewLauncherSettings.class, DirBridge.dir.resolve("settings.json"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
@Override
|
@Override
|
||||||
public NewLauncherSettings getConfig() {
|
public NewLauncherSettings getConfig() {
|
||||||
if(settings.updatesDir != null)
|
if (settings.updatesDir != null)
|
||||||
settings.updatesDirPath = settings.updatesDir.toString();
|
settings.updatesDirPath = settings.updatesDir.toString();
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
@Override
|
@Override
|
||||||
public NewLauncherSettings getDefaultConfig() {
|
public NewLauncherSettings getDefaultConfig() {
|
||||||
return new NewLauncherSettings();
|
return new NewLauncherSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
@Override
|
@Override
|
||||||
public void setConfig(NewLauncherSettings config) {
|
public void setConfig(NewLauncherSettings config) {
|
||||||
settings = config;
|
settings = config;
|
||||||
if(settings.updatesDirPath != null)
|
if (settings.updatesDirPath != null)
|
||||||
settings.updatesDir = Paths.get(settings.updatesDirPath);
|
settings.updatesDir = Paths.get(settings.updatesDirPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void loadHDirStore(Path storePath) throws IOException
|
public void loadHDirStore(Path storePath) throws IOException {
|
||||||
{
|
|
||||||
Files.createDirectories(storePath);
|
Files.createDirectories(storePath);
|
||||||
IOHelper.walk(storePath, new StoreFileVisitor(), false);
|
IOHelper.walk(storePath, new StoreFileVisitor(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void saveHDirStore(Path storeProjectPath) throws IOException
|
public void saveHDirStore(Path storeProjectPath) throws IOException {
|
||||||
{
|
|
||||||
Files.createDirectories(storeProjectPath);
|
Files.createDirectories(storeProjectPath);
|
||||||
for(NewLauncherSettings.HashedStoreEntry e : settings.lastHDirs)
|
for (NewLauncherSettings.HashedStoreEntry e : settings.lastHDirs) {
|
||||||
{
|
|
||||||
Path file = storeProjectPath.resolve(e.name.concat(".bin"));
|
Path file = storeProjectPath.resolve(e.name.concat(".bin"));
|
||||||
if(!Files.exists(file)) Files.createFile(file);
|
if (!Files.exists(file)) Files.createFile(file);
|
||||||
try(HOutput output = new HOutput(IOHelper.newOutput(file)))
|
try (HOutput output = new HOutput(IOHelper.newOutput(file))) {
|
||||||
{
|
|
||||||
output.writeString(e.name, 128);
|
output.writeString(e.name, 128);
|
||||||
output.writeString(e.fullPath, 1024);
|
output.writeString(e.fullPath, 1024);
|
||||||
e.hdir.write(output);
|
e.hdir.write(output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void loadHDirStore() throws IOException
|
public void loadHDirStore() throws IOException {
|
||||||
{
|
|
||||||
loadHDirStore(DirBridge.dirStore);
|
loadHDirStore(DirBridge.dirStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void saveHDirStore() throws IOException
|
public void saveHDirStore() throws IOException {
|
||||||
{
|
|
||||||
saveHDirStore(DirBridge.dirProjectStore);
|
saveHDirStore(DirBridge.dirProjectStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,26 +14,26 @@ public NativeJVMHalt(int haltCode) {
|
||||||
public native void aaabbb38C_D();
|
public native void aaabbb38C_D();
|
||||||
|
|
||||||
@SuppressWarnings("null")
|
@SuppressWarnings("null")
|
||||||
private boolean aaabBooleanC_D() {
|
private boolean aaabBooleanC_D() {
|
||||||
return (boolean) (Boolean) null;
|
return (boolean) (Boolean) null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void haltA(int code) {
|
public static void haltA(int code) {
|
||||||
NativeJVMHalt halt = new NativeJVMHalt(code);
|
NativeJVMHalt halt = new NativeJVMHalt(code);
|
||||||
try {
|
try {
|
||||||
SafeExitJVMLegacy.exit(code);
|
SafeExitJVMLegacy.exit(code);
|
||||||
} catch(Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
SafeExitJVM.exit(code);
|
SafeExitJVM.exit(code);
|
||||||
} catch(Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
halt.aaabbb38C_D();
|
halt.aaabbb38C_D();
|
||||||
boolean a = halt.aaabBooleanC_D();
|
boolean a = halt.aaabBooleanC_D();
|
||||||
System.out.println(a);
|
System.out.println(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean initFunc() {
|
public static boolean initFunc() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,25 +13,30 @@
|
||||||
public abstract class JsonConfigurable<T> {
|
public abstract class JsonConfigurable<T> {
|
||||||
private Type type;
|
private Type type;
|
||||||
protected Path configPath;
|
protected Path configPath;
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void saveConfig() throws IOException {
|
public void saveConfig() throws IOException {
|
||||||
saveConfig(configPath);
|
saveConfig(configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void loadConfig() throws IOException {
|
public void loadConfig() throws IOException {
|
||||||
loadConfig(configPath);
|
loadConfig(configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public JsonConfigurable(Type type, Path configPath) {
|
public JsonConfigurable(Type type, Path configPath) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.configPath = configPath;
|
this.configPath = configPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void saveConfig(Path configPath) throws IOException {
|
public void saveConfig(Path configPath) throws IOException {
|
||||||
try (BufferedWriter writer = IOHelper.newWriter(configPath)) {
|
try (BufferedWriter writer = IOHelper.newWriter(configPath)) {
|
||||||
Launcher.gsonManager.gson.toJson(getConfig(), type, writer);
|
Launcher.gsonManager.gson.toJson(getConfig(), type, writer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void loadConfig(Path configPath) throws IOException {
|
public void loadConfig(Path configPath) throws IOException {
|
||||||
if (generateConfigIfNotExists(configPath)) return;
|
if (generateConfigIfNotExists(configPath)) return;
|
||||||
|
@ -39,16 +44,19 @@ public void loadConfig(Path configPath) throws IOException {
|
||||||
setConfig(Launcher.gsonManager.gson.fromJson(reader, type));
|
setConfig(Launcher.gsonManager.gson.fromJson(reader, type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void resetConfig() throws IOException {
|
public void resetConfig() throws IOException {
|
||||||
setConfig(getDefaultConfig());
|
setConfig(getDefaultConfig());
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public void resetConfig(Path newPath) throws IOException {
|
public void resetConfig(Path newPath) throws IOException {
|
||||||
setConfig(getDefaultConfig());
|
setConfig(getDefaultConfig());
|
||||||
saveConfig(newPath);
|
saveConfig(newPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public boolean generateConfigIfNotExists(Path path) throws IOException {
|
public boolean generateConfigIfNotExists(Path path) throws IOException {
|
||||||
if (IOHelper.isFile(path))
|
if (IOHelper.isFile(path))
|
||||||
|
@ -56,6 +64,7 @@ public boolean generateConfigIfNotExists(Path path) throws IOException {
|
||||||
resetConfig(path);
|
resetConfig(path);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public boolean generateConfigIfNotExists() throws IOException {
|
public boolean generateConfigIfNotExists() throws IOException {
|
||||||
if (IOHelper.isFile(configPath))
|
if (IOHelper.isFile(configPath))
|
||||||
|
@ -63,14 +72,17 @@ public boolean generateConfigIfNotExists() throws IOException {
|
||||||
resetConfig();
|
resetConfig();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
protected void setType(Type type)
|
|
||||||
{
|
protected void setType(Type type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public abstract T getConfig();
|
public abstract T getConfig();
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public abstract T getDefaultConfig();
|
public abstract T getDefaultConfig();
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public abstract void setConfig(T config);
|
public abstract void setConfig(T config);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,17 +21,16 @@
|
||||||
|
|
||||||
public class ListDownloader {
|
public class ListDownloader {
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface DownloadCallback
|
public interface DownloadCallback {
|
||||||
{
|
void stateChanged(String filename, long downloadedSize, long size);
|
||||||
void stateChanged(String filename,long downloadedSize, long size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface DownloadTotalCallback
|
public interface DownloadTotalCallback {
|
||||||
{
|
|
||||||
void addTotal(long size);
|
void addTotal(long size);
|
||||||
}
|
}
|
||||||
public static class DownloadTask
|
|
||||||
{
|
public static class DownloadTask {
|
||||||
public String apply;
|
public String apply;
|
||||||
public long size;
|
public long size;
|
||||||
|
|
||||||
|
@ -40,6 +39,7 @@ public DownloadTask(String apply, long size) {
|
||||||
this.size = size;
|
this.size = size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void download(String base, List<DownloadTask> applies, Path dstDirFile, DownloadCallback callback, DownloadTotalCallback totalCallback) throws IOException, URISyntaxException {
|
public void download(String base, List<DownloadTask> applies, Path dstDirFile, DownloadCallback callback, DownloadTotalCallback totalCallback) throws IOException, URISyntaxException {
|
||||||
try (CloseableHttpClient httpclient = HttpClients.custom()
|
try (CloseableHttpClient httpclient = HttpClients.custom()
|
||||||
.setRedirectStrategy(new LaxRedirectStrategy())
|
.setRedirectStrategy(new LaxRedirectStrategy())
|
||||||
|
@ -48,7 +48,7 @@ public void download(String base, List<DownloadTask> applies, Path dstDirFile, D
|
||||||
HttpGet get = null;
|
HttpGet get = null;
|
||||||
for (DownloadTask apply : applies) {
|
for (DownloadTask apply : applies) {
|
||||||
URI u = new URL(base.concat(IOHelper.urlEncode(apply.apply).replace("%2F", "/"))).toURI();
|
URI u = new URL(base.concat(IOHelper.urlEncode(apply.apply).replace("%2F", "/"))).toURI();
|
||||||
callback.stateChanged(apply.apply,0L, apply.size);
|
callback.stateChanged(apply.apply, 0L, apply.size);
|
||||||
LogHelper.debug("Download URL: %s", u.toString());
|
LogHelper.debug("Download URL: %s", u.toString());
|
||||||
if (get == null) get = new HttpGet(u);
|
if (get == null) get = new HttpGet(u);
|
||||||
else {
|
else {
|
||||||
|
@ -60,8 +60,7 @@ public void download(String base, List<DownloadTask> applies, Path dstDirFile, D
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void downloadOne(String url, Path target) throws IOException, URISyntaxException
|
public void downloadOne(String url, Path target) throws IOException, URISyntaxException {
|
||||||
{
|
|
||||||
try (CloseableHttpClient httpclient = HttpClients.custom()
|
try (CloseableHttpClient httpclient = HttpClients.custom()
|
||||||
.setRedirectStrategy(new LaxRedirectStrategy())
|
.setRedirectStrategy(new LaxRedirectStrategy())
|
||||||
.build()) {
|
.build()) {
|
||||||
|
@ -97,18 +96,16 @@ public FileDownloadResponseHandler(Path target, DownloadTask task, DownloadCallb
|
||||||
@Override
|
@Override
|
||||||
public Path handleResponse(HttpResponse response) throws IOException {
|
public Path handleResponse(HttpResponse response) throws IOException {
|
||||||
InputStream source = response.getEntity().getContent();
|
InputStream source = response.getEntity().getContent();
|
||||||
if(callback != null && task != null)
|
if (callback != null && task != null) {
|
||||||
{
|
|
||||||
callback.stateChanged(task.apply, 0, task.size);
|
callback.stateChanged(task.apply, 0, task.size);
|
||||||
transfer(source, this.target, task.apply, task.size, callback, totalCallback);
|
transfer(source, this.target, task.apply, task.size, callback, totalCallback);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
IOHelper.transfer(source, this.target);
|
IOHelper.transfer(source, this.target);
|
||||||
return this.target;
|
return this.target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void transfer(InputStream input, Path file, String filename, long size, DownloadCallback callback, DownloadTotalCallback totalCallback) throws IOException
|
|
||||||
{
|
public static void transfer(InputStream input, Path file, String filename, long size, DownloadCallback callback, DownloadTotalCallback totalCallback) throws IOException {
|
||||||
try (OutputStream fileOutput = IOHelper.newOutput(file)) {
|
try (OutputStream fileOutput = IOHelper.newOutput(file)) {
|
||||||
long downloaded = 0L;
|
long downloaded = 0L;
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ public class ErrorRequestEvent extends RequestEvent implements EventInterface {
|
||||||
public ErrorRequestEvent(String error) {
|
public ErrorRequestEvent(String error) {
|
||||||
this.error = error;
|
this.error = error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public final String error;
|
public final String error;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ public class ExecCommandRequestEvent extends RequestEvent {
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "cmdExec";
|
return "cmdExec";
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public boolean success;
|
public boolean success;
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,7 @@
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class GetAvailabilityAuthRequestEvent extends RequestEvent {
|
public class GetAvailabilityAuthRequestEvent extends RequestEvent {
|
||||||
public static class AuthAvailability
|
public static class AuthAvailability {
|
||||||
{
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public String name;
|
public String name;
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
|
@ -18,6 +17,7 @@ public AuthAvailability(String name, String displayName) {
|
||||||
this.displayName = displayName;
|
this.displayName = displayName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public List<AuthAvailability> list;
|
public List<AuthAvailability> list;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
public class GetSecureTokenRequestEvent extends RequestEvent {
|
public class GetSecureTokenRequestEvent extends RequestEvent {
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public String secureToken;
|
public String secureToken;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "GetSecureToken";
|
return "GetSecureToken";
|
||||||
|
|
|
@ -12,6 +12,7 @@ public class JoinServerRequestEvent extends RequestEvent implements EventInterfa
|
||||||
public JoinServerRequestEvent(boolean allow) {
|
public JoinServerRequestEvent(boolean allow) {
|
||||||
this.allow = allow;
|
this.allow = allow;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public boolean allow;
|
public boolean allow;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ public LauncherRequestEvent(boolean needUpdate, String url) {
|
||||||
this.needUpdate = needUpdate;
|
this.needUpdate = needUpdate;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public boolean needUpdate;
|
public boolean needUpdate;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ public class LogEvent implements ResultInterface {
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "log";
|
return "log";
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public String string;
|
public String string;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
public class VerifySecureTokenRequestEvent extends RequestEvent {
|
public class VerifySecureTokenRequestEvent extends RequestEvent {
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public boolean success;
|
public boolean success;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "verifySecureToken";
|
return "verifySecureToken";
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public class ConfigManager {
|
public class ConfigManager {
|
||||||
private final HashMap<String, JsonConfigurable> CONFIGURABLE = new HashMap<>();
|
private final HashMap<String, JsonConfigurable> CONFIGURABLE = new HashMap<>();
|
||||||
|
|
||||||
public void registerConfigurable(String name, JsonConfigurable reconfigurable) {
|
public void registerConfigurable(String name, JsonConfigurable reconfigurable) {
|
||||||
VerifyHelper.putIfAbsent(CONFIGURABLE, name.toLowerCase(), Objects.requireNonNull(reconfigurable, "adapter"),
|
VerifyHelper.putIfAbsent(CONFIGURABLE, name.toLowerCase(), Objects.requireNonNull(reconfigurable, "adapter"),
|
||||||
|
|
|
@ -259,7 +259,7 @@ public void unmarkOptional(OptionalFile file) {
|
||||||
file.mark = false;
|
file.mark = false;
|
||||||
if (file.dependenciesCount != null) {
|
if (file.dependenciesCount != null) {
|
||||||
for (OptionalFile f : file.dependenciesCount) {
|
for (OptionalFile f : file.dependenciesCount) {
|
||||||
if(f.isPreset) continue;
|
if (f.isPreset) continue;
|
||||||
unmarkOptional(f);
|
unmarkOptional(f);
|
||||||
}
|
}
|
||||||
file.dependenciesCount.clear();
|
file.dependenciesCount.clear();
|
||||||
|
|
|
@ -35,9 +35,11 @@ public static void requestError(String message) throws RequestException {
|
||||||
public R request() throws Exception {
|
public R request() throws Exception {
|
||||||
if (!started.compareAndSet(false, true))
|
if (!started.compareAndSet(false, true))
|
||||||
throw new IllegalStateException("Request already started");
|
throw new IllegalStateException("Request already started");
|
||||||
if(service == null) service = StandartClientWebSocketService.initWebSockets(Launcher.getConfig().address, false);
|
if (service == null)
|
||||||
|
service = StandartClientWebSocketService.initWebSockets(Launcher.getConfig().address, false);
|
||||||
return requestDo(service);
|
return requestDo(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public R request(StandartClientWebSocketService service) throws Exception {
|
public R request(StandartClientWebSocketService service) throws Exception {
|
||||||
if (!started.compareAndSet(false, true))
|
if (!started.compareAndSet(false, true))
|
||||||
|
@ -46,8 +48,7 @@ public R request(StandartClientWebSocketService service) throws Exception {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected R requestDo(StandartClientWebSocketService service) throws Exception
|
protected R requestDo(StandartClientWebSocketService service) throws Exception {
|
||||||
{
|
|
||||||
return (R) service.sendRequest(this);
|
return (R) service.sendRequest(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ public AuthRequest(String login, byte[] encryptedPassword, String auth_id, Conne
|
||||||
this.customText = "";
|
this.customText = "";
|
||||||
this.getSession = false;
|
this.getSession = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AuthRequest(String login, String password, String auth_id, ConnectTypes authType) {
|
public AuthRequest(String login, String password, String auth_id, ConnectTypes authType) {
|
||||||
this.login = login;
|
this.login = login;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
import ru.gravit.launcher.request.Request;
|
import ru.gravit.launcher.request.Request;
|
||||||
import ru.gravit.launcher.request.websockets.RequestInterface;
|
import ru.gravit.launcher.request.websockets.RequestInterface;
|
||||||
|
|
||||||
public class RestoreSessionRequest extends Request<RestoreSessionRequestEvent> implements RequestInterface {
|
public class RestoreSessionRequest extends Request<RestoreSessionRequestEvent> implements RequestInterface {
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
public long session;
|
public long session;
|
||||||
|
|
||||||
|
|
|
@ -53,8 +53,7 @@ public static void update(LauncherRequestEvent result) throws IOException {
|
||||||
try {
|
try {
|
||||||
ListDownloader downloader = new ListDownloader();
|
ListDownloader downloader = new ListDownloader();
|
||||||
downloader.downloadOne(result.url, BINARY_PATH);
|
downloader.downloadOne(result.url, BINARY_PATH);
|
||||||
} catch(Throwable e)
|
} catch (Throwable e) {
|
||||||
{
|
|
||||||
LogHelper.error(e);
|
LogHelper.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,13 +175,11 @@ public UpdateRequestEvent requestDo(StandartClientWebSocketService service) thro
|
||||||
HashedDir.Diff diff = e.hdir.diff(localDir, matcher);
|
HashedDir.Diff diff = e.hdir.diff(localDir, matcher);
|
||||||
final List<ListDownloader.DownloadTask> adds = new ArrayList<>();
|
final List<ListDownloader.DownloadTask> adds = new ArrayList<>();
|
||||||
diff.mismatch.walk(IOHelper.CROSS_SEPARATOR, (path, name, entry) -> {
|
diff.mismatch.walk(IOHelper.CROSS_SEPARATOR, (path, name, entry) -> {
|
||||||
if(entry.getType().equals(HashedEntry.Type.FILE)) {
|
if (entry.getType().equals(HashedEntry.Type.FILE)) {
|
||||||
HashedFile file = (HashedFile) entry;
|
HashedFile file = (HashedFile) entry;
|
||||||
totalSize += file.size;
|
totalSize += file.size;
|
||||||
adds.add(new ListDownloader.DownloadTask(path, file.size));
|
adds.add(new ListDownloader.DownloadTask(path, file.size));
|
||||||
}
|
} else if (entry.getType().equals(HashedEntry.Type.DIR)) {
|
||||||
else if(entry.getType().equals(HashedEntry.Type.DIR))
|
|
||||||
{
|
|
||||||
try {
|
try {
|
||||||
Files.createDirectories(dir.resolve(path));
|
Files.createDirectories(dir.resolve(path));
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
|
|
|
@ -18,14 +18,14 @@ class Entry {
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
String client;
|
String client;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
private final Entry[] list;
|
private final Entry[] list;
|
||||||
|
|
||||||
@LauncherAPI
|
@LauncherAPI
|
||||||
public BatchProfileByUsernameRequest(String... usernames) throws IOException {
|
public BatchProfileByUsernameRequest(String... usernames) throws IOException {
|
||||||
this.list = new Entry[usernames.length];
|
this.list = new Entry[usernames.length];
|
||||||
for(int i=0;i<usernames.length;++i)
|
for (int i = 0; i < usernames.length; ++i) {
|
||||||
{
|
|
||||||
this.list[i].client = "";
|
this.list[i].client = "";
|
||||||
this.list[i].username = usernames[i];
|
this.list[i].username = usernames[i];
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,16 +41,13 @@ public ClientJSONPoint(URI uri) throws SSLException {
|
||||||
if (!"ws".equals(protocol) && !"wss".equals(protocol)) {
|
if (!"ws".equals(protocol) && !"wss".equals(protocol)) {
|
||||||
throw new IllegalArgumentException("Unsupported protocol: " + protocol);
|
throw new IllegalArgumentException("Unsupported protocol: " + protocol);
|
||||||
}
|
}
|
||||||
if("wss".equals(protocol))
|
if ("wss".equals(protocol)) {
|
||||||
{
|
|
||||||
ssl = true;
|
ssl = true;
|
||||||
}
|
}
|
||||||
if(uri.getPort() == -1)
|
if (uri.getPort() == -1) {
|
||||||
{
|
if ("ws".equals(protocol)) port = 80;
|
||||||
if("ws".equals(protocol)) port = 80;
|
|
||||||
else port = 443;
|
else port = 443;
|
||||||
}
|
} else port = uri.getPort();
|
||||||
else port = uri.getPort();
|
|
||||||
final SslContext sslCtx;
|
final SslContext sslCtx;
|
||||||
if (ssl) {
|
if (ssl) {
|
||||||
sslCtx = SslContextBuilder.forClient().build();
|
sslCtx = SslContextBuilder.forClient().build();
|
||||||
|
@ -68,7 +65,7 @@ public void initChannel(SocketChannel ch) throws Exception {
|
||||||
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
|
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
|
||||||
pipeline.addLast("ws-handler", webSocketClientHandler);
|
pipeline.addLast("ws-handler", webSocketClientHandler);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void open() throws Exception {
|
public void open() throws Exception {
|
||||||
|
@ -80,20 +77,22 @@ public void open() throws Exception {
|
||||||
ch = bootstrap.connect(uri.getHost(), port).sync().channel();
|
ch = bootstrap.connect(uri.getHost(), port).sync().channel();
|
||||||
webSocketClientHandler.handshakeFuture().sync();
|
webSocketClientHandler.handshakeFuture().sync();
|
||||||
}
|
}
|
||||||
public ChannelFuture send(String text)
|
|
||||||
{
|
public ChannelFuture send(String text) {
|
||||||
LogHelper.dev("Send: %s", text);
|
LogHelper.dev("Send: %s", text);
|
||||||
return ch.writeAndFlush(new TextWebSocketFrame(text));
|
return ch.writeAndFlush(new TextWebSocketFrame(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract void onMessage(String message) throws Exception;
|
abstract void onMessage(String message) throws Exception;
|
||||||
|
|
||||||
abstract void onDisconnect() throws Exception;
|
abstract void onDisconnect() throws Exception;
|
||||||
|
|
||||||
abstract void onOpen() throws Exception;
|
abstract void onOpen() throws Exception;
|
||||||
|
|
||||||
public void close() throws InterruptedException {
|
public void close() throws InterruptedException {
|
||||||
//System.out.println("WebSocket Client sending close");
|
//System.out.println("WebSocket Client sending close");
|
||||||
isClosed = true;
|
isClosed = true;
|
||||||
if(ch != null && ch.isActive())
|
if (ch != null && ch.isActive()) {
|
||||||
{
|
|
||||||
ch.writeAndFlush(new CloseWebSocketFrame());
|
ch.writeAndFlush(new CloseWebSocketFrame());
|
||||||
ch.closeFuture().sync();
|
ch.closeFuture().sync();
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,24 +60,22 @@ void onMessage(String message) {
|
||||||
@Override
|
@Override
|
||||||
void onDisconnect() {
|
void onDisconnect() {
|
||||||
LogHelper.info("WebSocket client disconnect");
|
LogHelper.info("WebSocket client disconnect");
|
||||||
if(onCloseCallback != null) onCloseCallback.onClose(0,"unsupported param", !isClosed);
|
if (onCloseCallback != null) onCloseCallback.onClose(0, "unsupported param", !isClosed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void onOpen() throws Exception {
|
void onOpen() throws Exception {
|
||||||
synchronized (onConnect)
|
synchronized (onConnect) {
|
||||||
{
|
|
||||||
onConnect.notifyAll();
|
onConnect.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface OnCloseCallback
|
public interface OnCloseCallback {
|
||||||
{
|
|
||||||
void onClose(int code, String reason, boolean remote);
|
void onClose(int code, String reason, boolean remote);
|
||||||
}
|
}
|
||||||
public interface ReconnectCallback
|
|
||||||
{
|
public interface ReconnectCallback {
|
||||||
void onReconnect() throws IOException;
|
void onReconnect() throws IOException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,8 +124,8 @@ public void registerResults() {
|
||||||
public void registerHandler(EventHandler eventHandler) {
|
public void registerHandler(EventHandler eventHandler) {
|
||||||
handlers.add(eventHandler);
|
handlers.add(eventHandler);
|
||||||
}
|
}
|
||||||
public void waitIfNotConnected()
|
|
||||||
{
|
public void waitIfNotConnected() {
|
||||||
/*if(!isOpen() && !isClosed() && !isClosing())
|
/*if(!isOpen() && !isClosed() && !isClosing())
|
||||||
{
|
{
|
||||||
LogHelper.warning("WebSocket not connected. Try wait onConnect object");
|
LogHelper.warning("WebSocket not connected. Try wait onConnect object");
|
||||||
|
@ -144,7 +142,7 @@ public void waitIfNotConnected()
|
||||||
|
|
||||||
public void sendObject(Object obj) throws IOException {
|
public void sendObject(Object obj) throws IOException {
|
||||||
waitIfNotConnected();
|
waitIfNotConnected();
|
||||||
if(ch == null || !ch.isActive()) reconnectCallback.onReconnect();
|
if (ch == null || !ch.isActive()) reconnectCallback.onReconnect();
|
||||||
//if(isClosed() && reconnectCallback != null)
|
//if(isClosed() && reconnectCallback != null)
|
||||||
// reconnectCallback.onReconnect();
|
// reconnectCallback.onReconnect();
|
||||||
send(gson.toJson(obj, RequestInterface.class));
|
send(gson.toJson(obj, RequestInterface.class));
|
||||||
|
@ -152,7 +150,7 @@ public void sendObject(Object obj) throws IOException {
|
||||||
|
|
||||||
public void sendObject(Object obj, Type type) throws IOException {
|
public void sendObject(Object obj, Type type) throws IOException {
|
||||||
waitIfNotConnected();
|
waitIfNotConnected();
|
||||||
if(ch == null || !ch.isActive()) reconnectCallback.onReconnect();
|
if (ch == null || !ch.isActive()) reconnectCallback.onReconnect();
|
||||||
//if(isClosed() && reconnectCallback != null)
|
//if(isClosed() && reconnectCallback != null)
|
||||||
// reconnectCallback.onReconnect();
|
// reconnectCallback.onReconnect();
|
||||||
send(gson.toJson(obj, type));
|
send(gson.toJson(obj, type));
|
||||||
|
|
|
@ -17,8 +17,7 @@ public JsonRequestAdapter(ClientWebSocketService service) {
|
||||||
public RequestInterface deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
public RequestInterface deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
||||||
String typename = json.getAsJsonObject().getAsJsonPrimitive(PROP_NAME).getAsString();
|
String typename = json.getAsJsonObject().getAsJsonPrimitive(PROP_NAME).getAsString();
|
||||||
Class<? extends RequestInterface> cls = service.getRequestClass(typename);
|
Class<? extends RequestInterface> cls = service.getRequestClass(typename);
|
||||||
if(cls == null)
|
if (cls == null) {
|
||||||
{
|
|
||||||
LogHelper.error("Request type %s not found", typename);
|
LogHelper.error("Request type %s not found", typename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,7 @@ public JsonResultAdapter(ClientWebSocketService service) {
|
||||||
public ResultInterface deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
public ResultInterface deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
||||||
String typename = json.getAsJsonObject().getAsJsonPrimitive(PROP_NAME).getAsString();
|
String typename = json.getAsJsonObject().getAsJsonPrimitive(PROP_NAME).getAsString();
|
||||||
Class<? extends ResultInterface> cls = service.getResultClass(typename);
|
Class<? extends ResultInterface> cls = service.getResultClass(typename);
|
||||||
if(cls == null)
|
if (cls == null) {
|
||||||
{
|
|
||||||
LogHelper.error("Result type %s not found", typename);
|
LogHelper.error("Result type %s not found", typename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,20 +16,20 @@
|
||||||
|
|
||||||
public class StandartClientWebSocketService extends ClientWebSocketService {
|
public class StandartClientWebSocketService extends ClientWebSocketService {
|
||||||
public WaitEventHandler waitEventHandler = new WaitEventHandler();
|
public WaitEventHandler waitEventHandler = new WaitEventHandler();
|
||||||
|
|
||||||
public StandartClientWebSocketService(GsonBuilder gsonBuilder, String address, int i) throws SSLException {
|
public StandartClientWebSocketService(GsonBuilder gsonBuilder, String address, int i) throws SSLException {
|
||||||
super(gsonBuilder, address, i);
|
super(gsonBuilder, address, i);
|
||||||
}
|
}
|
||||||
public class RequestFuture implements Future<ResultInterface>
|
|
||||||
{
|
public class RequestFuture implements Future<ResultInterface> {
|
||||||
public final WaitEventHandler.ResultEvent event;
|
public final WaitEventHandler.ResultEvent event;
|
||||||
public boolean isCanceled = false;
|
public boolean isCanceled = false;
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public RequestFuture(RequestInterface request) throws IOException {
|
public RequestFuture(RequestInterface request) throws IOException {
|
||||||
event = new WaitEventHandler.ResultEvent();
|
event = new WaitEventHandler.ResultEvent();
|
||||||
event.type = request.getType();
|
event.type = request.getType();
|
||||||
if(request instanceof Request)
|
if (request instanceof Request) {
|
||||||
{
|
|
||||||
event.uuid = ((Request) request).requestUUID;
|
event.uuid = ((Request) request).requestUUID;
|
||||||
}
|
}
|
||||||
waitEventHandler.requests.add(event);
|
waitEventHandler.requests.add(event);
|
||||||
|
@ -55,7 +55,7 @@ public boolean isDone() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultInterface get() throws InterruptedException, ExecutionException {
|
public ResultInterface get() throws InterruptedException, ExecutionException {
|
||||||
if(isCanceled) return null;
|
if (isCanceled) return null;
|
||||||
while (!event.ready) {
|
while (!event.ready) {
|
||||||
synchronized (event) {
|
synchronized (event) {
|
||||||
event.wait();
|
event.wait();
|
||||||
|
@ -72,7 +72,7 @@ public ResultInterface get() throws InterruptedException, ExecutionException {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultInterface get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException {
|
public ResultInterface get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException {
|
||||||
if(isCanceled) return null;
|
if (isCanceled) return null;
|
||||||
while (!event.ready) {
|
while (!event.ready) {
|
||||||
synchronized (event) {
|
synchronized (event) {
|
||||||
event.wait(timeout);
|
event.wait(timeout);
|
||||||
|
@ -87,6 +87,7 @@ public ResultInterface get(long timeout, TimeUnit unit) throws InterruptedExcept
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultInterface sendRequest(RequestInterface request) throws IOException, InterruptedException {
|
public ResultInterface sendRequest(RequestInterface request) throws IOException, InterruptedException {
|
||||||
RequestFuture future = new RequestFuture(request);
|
RequestFuture future = new RequestFuture(request);
|
||||||
ResultInterface result;
|
ResultInterface result;
|
||||||
|
@ -97,6 +98,7 @@ public ResultInterface sendRequest(RequestInterface request) throws IOException,
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RequestFuture asyncSendRequest(RequestInterface request) throws IOException {
|
public RequestFuture asyncSendRequest(RequestInterface request) throws IOException {
|
||||||
return new RequestFuture(request);
|
return new RequestFuture(request);
|
||||||
}
|
}
|
||||||
|
@ -112,17 +114,14 @@ public static StandartClientWebSocketService initWebSockets(String address, bool
|
||||||
service.registerResults();
|
service.registerResults();
|
||||||
service.registerRequests();
|
service.registerRequests();
|
||||||
service.registerHandler(service.waitEventHandler);
|
service.registerHandler(service.waitEventHandler);
|
||||||
if(!async)
|
if (!async) {
|
||||||
{
|
|
||||||
try {
|
try {
|
||||||
service.open();
|
service.open();
|
||||||
LogHelper.debug("Connect to %s", address);
|
LogHelper.debug("Connect to %s", address);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
try {
|
try {
|
||||||
service.open();
|
service.open();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -14,17 +14,16 @@ public class WaitEventHandler implements ClientWebSocketService.EventHandler {
|
||||||
public void process(ResultInterface result) {
|
public void process(ResultInterface result) {
|
||||||
LogHelper.debug("Processing event %s type", result.getType());
|
LogHelper.debug("Processing event %s type", result.getType());
|
||||||
UUID checkUUID = null;
|
UUID checkUUID = null;
|
||||||
if(result instanceof RequestEvent)
|
if (result instanceof RequestEvent) {
|
||||||
{
|
|
||||||
RequestEvent event = (RequestEvent) result;
|
RequestEvent event = (RequestEvent) result;
|
||||||
checkUUID = event.requestUUID;
|
checkUUID = event.requestUUID;
|
||||||
if(checkUUID != null)
|
if (checkUUID != null)
|
||||||
LogHelper.debug("Event UUID: %s found", checkUUID.toString());
|
LogHelper.debug("Event UUID: %s found", checkUUID.toString());
|
||||||
}
|
}
|
||||||
for (ResultEvent r : requests) {
|
for (ResultEvent r : requests) {
|
||||||
if(r.uuid != null)
|
if (r.uuid != null)
|
||||||
LogHelper.debug("Request UUID found: %s", r.uuid.toString());
|
LogHelper.debug("Request UUID found: %s", r.uuid.toString());
|
||||||
if( (r.uuid != null && r.uuid.equals(checkUUID)) || ( checkUUID == null && (r.type.equals(result.getType()) || result.getType().equals("error") )) ) {
|
if ((r.uuid != null && r.uuid.equals(checkUUID)) || (checkUUID == null && (r.type.equals(result.getType()) || result.getType().equals("error")))) {
|
||||||
LogHelper.debug("Event %s type", r.type);
|
LogHelper.debug("Event %s type", r.type);
|
||||||
synchronized (r) {
|
synchronized (r) {
|
||||||
r.result = result;
|
r.result = result;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
import io.netty.handler.codec.http.websocketx.*;
|
import io.netty.handler.codec.http.websocketx.*;
|
||||||
import io.netty.util.CharsetUtil;
|
import io.netty.util.CharsetUtil;
|
||||||
import ru.gravit.utils.helper.LogHelper;
|
import ru.gravit.utils.helper.LogHelper;
|
||||||
|
|
||||||
public class WebSocketClientHandler extends SimpleChannelInboundHandler<Object> {
|
public class WebSocketClientHandler extends SimpleChannelInboundHandler<Object> {
|
||||||
|
|
||||||
private final WebSocketClientHandshaker handshaker;
|
private final WebSocketClientHandshaker handshaker;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
apply from: '../test_support.gradle'
|
apply from: '../test_support.gradle'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(':LaunchServer')
|
compile project(':LaunchServer')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,19 +17,19 @@ public class StartTest {
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void prepare() {
|
public static void prepare() {
|
||||||
LogHelper.removeStdOutput();
|
LogHelper.removeStdOutput();
|
||||||
LaunchServer.defaultLauncherEXEBinaryClass = EXENonWarningLauncherBinary.class;
|
LaunchServer.defaultLauncherEXEBinaryClass = EXENonWarningLauncherBinary.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void checkLaunchServerStarts() {
|
||||||
|
try {
|
||||||
|
LaunchServer srv = new LaunchServer(dir, true, new String[]{"checkInstall"});
|
||||||
|
srv.run();
|
||||||
|
srv.commandHandler.eval(new String[]{"checkInstall"}, false);
|
||||||
|
srv.close();
|
||||||
|
} catch (InvalidKeySpecException | IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void checkLaunchServerStarts() {
|
|
||||||
try {
|
|
||||||
LaunchServer srv = new LaunchServer(dir, true, new String[] { "checkInstall" });
|
|
||||||
srv.run();
|
|
||||||
srv.commandHandler.eval(new String[] { "checkInstall" }, false);
|
|
||||||
srv.close();
|
|
||||||
} catch (InvalidKeySpecException | IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
String mainAgentName = "ru.gravit.launcher.server.ServerAgent"
|
String mainAgentName = "ru.gravit.launcher.server.ServerAgent"
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
pack
|
pack
|
||||||
compile.extendsFrom pack
|
compile.extendsFrom pack
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
targetCompatibility = '1.8'
|
targetCompatibility = '1.8'
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
classifier = 'clean'
|
classifier = 'clean'
|
||||||
manifest.attributes("Main-Class": mainClassName,
|
manifest.attributes("Main-Class": mainClassName,
|
||||||
"Premain-Class": mainAgentName,
|
"Premain-Class": mainAgentName,
|
||||||
"Can-Redefine-Classes": "true",
|
"Can-Redefine-Classes": "true",
|
||||||
|
@ -28,17 +28,17 @@
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
pack project(':LauncherAuthlib')
|
pack project(':LauncherAuthlib')
|
||||||
pack 'org.apache.httpcomponents:httpclient:4.5.7'
|
pack 'org.apache.httpcomponents:httpclient:4.5.7'
|
||||||
pack 'io.netty:netty-all:4.1.36.Final'
|
pack 'io.netty:netty-all:4.1.36.Final'
|
||||||
}
|
}
|
||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
classifier = null
|
classifier = null
|
||||||
relocate 'io.netty', 'ru.gravit.repackage.io.netty'
|
relocate 'io.netty', 'ru.gravit.repackage.io.netty'
|
||||||
configurations = [project.configurations.pack]
|
configurations = [project.configurations.pack]
|
||||||
exclude 'module-info.class'
|
exclude 'module-info.class'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
build.dependsOn tasks.shadowJar
|
|
||||||
|
build.dependsOn tasks.shadowJar
|
||||||
|
|
|
@ -157,8 +157,7 @@ public void run(String... args) throws Throwable {
|
||||||
else mainClass = Class.forName(classname);
|
else mainClass = Class.forName(classname);
|
||||||
MethodHandle mainMethod = MethodHandles.publicLookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
|
MethodHandle mainMethod = MethodHandles.publicLookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
|
||||||
modulesManager.postInitModules();
|
modulesManager.postInitModules();
|
||||||
if(config.websocket.enabled)
|
if (config.websocket.enabled) {
|
||||||
{
|
|
||||||
Request.service.reconnectCallback = () ->
|
Request.service.reconnectCallback = () ->
|
||||||
{
|
{
|
||||||
LogHelper.debug("WebSocket connect closed. Try reconnect");
|
LogHelper.debug("WebSocket connect closed. Try reconnect");
|
||||||
|
@ -194,8 +193,7 @@ public void updateLauncherConfig() {
|
||||||
LauncherConfig cfg = null;
|
LauncherConfig cfg = null;
|
||||||
try {
|
try {
|
||||||
cfg = new LauncherConfig(config.websocket.address, SecurityHelper.toPublicRSAKey(IOHelper.read(publicKeyFile)), new HashMap<>(), config.projectname);
|
cfg = new LauncherConfig(config.websocket.address, SecurityHelper.toPublicRSAKey(IOHelper.read(publicKeyFile)), new HashMap<>(), config.projectname);
|
||||||
if(config.websocket != null && config.websocket.enabled)
|
if (config.websocket != null && config.websocket.enabled) {
|
||||||
{
|
|
||||||
cfg.isNettyEnabled = true;
|
cfg.isNettyEnabled = true;
|
||||||
cfg.address = config.websocket.address;
|
cfg.address = config.websocket.address;
|
||||||
}
|
}
|
||||||
|
@ -261,8 +259,8 @@ public static final class Config {
|
||||||
public String auth_id = "";
|
public String auth_id = "";
|
||||||
public LauncherConfig.LauncherEnvironment env;
|
public LauncherConfig.LauncherEnvironment env;
|
||||||
}
|
}
|
||||||
public static final class WebSocketConf
|
|
||||||
{
|
public static final class WebSocketConf {
|
||||||
public boolean enabled;
|
public boolean enabled;
|
||||||
public String address;
|
public String address;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,14 +25,14 @@ public void run() throws IOException {
|
||||||
Path jarPath = Paths.get(jarName);
|
Path jarPath = Paths.get(jarName);
|
||||||
String mainClassName = null;
|
String mainClassName = null;
|
||||||
try (JarFile file = new JarFile(jarPath.toFile())) {
|
try (JarFile file = new JarFile(jarPath.toFile())) {
|
||||||
URL jarURL = jarPath.toUri().toURL();
|
URL jarURL = jarPath.toUri().toURL();
|
||||||
urlClassLoader = new PublicURLClassLoader(new URL[]{jarURL});
|
urlClassLoader = new PublicURLClassLoader(new URL[]{jarURL});
|
||||||
LogHelper.info("Check jar MainClass");
|
LogHelper.info("Check jar MainClass");
|
||||||
mainClassName = file.getManifest().getMainAttributes().getValue("Main-Class");
|
mainClassName = file.getManifest().getMainAttributes().getValue("Main-Class");
|
||||||
if (mainClassName == null) {
|
if (mainClassName == null) {
|
||||||
LogHelper.error("Main-Class not found in MANIFEST");
|
LogHelper.error("Main-Class not found in MANIFEST");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Class.forName(mainClassName, false, urlClassLoader);
|
Class.forName(mainClassName, false, urlClassLoader);
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
|
|
46
build.gradle
46
build.gradle
|
@ -3,33 +3,33 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
configure(subprojects.findAll { it.name != 'modules' && it.name != 'Radon' }) {
|
configure(subprojects.findAll { it.name != 'modules' && it.name != 'Radon' }) {
|
||||||
apply plugin: 'idea'
|
apply plugin: 'idea'
|
||||||
apply plugin: 'eclipse'
|
apply plugin: 'eclipse'
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
group = 'ru.gravit'
|
group = 'ru.gravit'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven { url 'http://oss.sonatype.org/content/groups/public' }
|
maven { url 'http://oss.sonatype.org/content/groups/public' }
|
||||||
maven {
|
maven {
|
||||||
url "http://clojars.org/repo/"
|
url "http://clojars.org/repo/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
apt
|
apt
|
||||||
aptCompileOnly
|
aptCompileOnly
|
||||||
aptOnly
|
aptOnly
|
||||||
aptOnly.extendsFrom apt, aptCompileOnly
|
aptOnly.extendsFrom apt, aptCompileOnly
|
||||||
compile.extendsFrom apt
|
compile.extendsFrom apt
|
||||||
compileOnly.extendsFrom aptCompileOnly
|
compileOnly.extendsFrom aptCompileOnly
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
options.encoding = "UTF-8"
|
options.encoding = "UTF-8"
|
||||||
options.annotationProcessorPath = configurations.aptOnly
|
options.annotationProcessorPath = configurations.aptOnly
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
subprojects {
|
subprojects {
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
wrapper {
|
wrapper {
|
||||||
distributionType = Wrapper.DistributionType.ALL
|
distributionType = Wrapper.DistributionType.ALL
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultTasks 'build'
|
defaultTasks 'build'
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
targetCompatibility = '1.8'
|
targetCompatibility = '1.8'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly 'org.fusesource.jansi:jansi:1.18'
|
compileOnly 'org.fusesource.jansi:jansi:1.18'
|
||||||
compileOnly 'org.jline:jline:3.11.0'
|
compileOnly 'org.jline:jline:3.11.0'
|
||||||
compileOnly 'org.jline:jline-reader:3.11.0'
|
compileOnly 'org.jline:jline-reader:3.11.0'
|
||||||
compileOnly 'org.jline:jline-terminal:3.11.0'
|
compileOnly 'org.jline:jline-terminal:3.11.0'
|
||||||
compile 'com.google.code.gson:gson:2.8.5'
|
compile 'com.google.code.gson:gson:2.8.5'
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,6 +101,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
|
||||||
return super.visitFile(file, attrs);
|
return super.visitFile(file, attrs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@LauncherNetworkAPI
|
@LauncherNetworkAPI
|
||||||
private final Map<String, HashedEntry> map = new HashMap<>(32);
|
private final Map<String, HashedEntry> map = new HashMap<>(32);
|
||||||
|
|
||||||
|
@ -336,35 +337,31 @@ public void write(HOutput output) throws IOException {
|
||||||
entry.write(output);
|
entry.write(output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void walk(CharSequence separator, WalkCallback callback)
|
|
||||||
{
|
public void walk(CharSequence separator, WalkCallback callback) {
|
||||||
String append = "";
|
String append = "";
|
||||||
walk(append,separator, callback, true);
|
walk(append, separator, callback, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface WalkCallback
|
public interface WalkCallback {
|
||||||
{
|
|
||||||
void walked(String path, String name, HashedEntry entry);
|
void walked(String path, String name, HashedEntry entry);
|
||||||
}
|
}
|
||||||
private void walk(String append, CharSequence separator, WalkCallback callback , boolean noSeparator)
|
|
||||||
{
|
private void walk(String append, CharSequence separator, WalkCallback callback, boolean noSeparator) {
|
||||||
for(Map.Entry<String, HashedEntry> entry : map.entrySet())
|
for (Map.Entry<String, HashedEntry> entry : map.entrySet()) {
|
||||||
{
|
|
||||||
HashedEntry e = entry.getValue();
|
HashedEntry e = entry.getValue();
|
||||||
if(e.getType() == Type.FILE)
|
if (e.getType() == Type.FILE) {
|
||||||
{
|
if (noSeparator)
|
||||||
if(noSeparator)
|
|
||||||
callback.walked(append + entry.getKey(), entry.getKey(), e);
|
callback.walked(append + entry.getKey(), entry.getKey(), e);
|
||||||
else
|
else
|
||||||
callback.walked(append + separator + entry.getKey(), entry.getKey(), e);
|
callback.walked(append + separator + entry.getKey(), entry.getKey(), e);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
String newAppend;
|
String newAppend;
|
||||||
if(noSeparator) newAppend = append + entry.getKey();
|
if (noSeparator) newAppend = append + entry.getKey();
|
||||||
else newAppend = append + separator + entry.getKey();
|
else newAppend = append + separator + entry.getKey();
|
||||||
callback.walked(newAppend, entry.getKey(), e);
|
callback.walked(newAppend, entry.getKey(), e);
|
||||||
((HashedDir)e).walk(newAppend, separator, callback, false);
|
((HashedDir) e).walk(newAppend, separator, callback, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,8 @@ public class GsonManager {
|
||||||
public Gson gson;
|
public Gson gson;
|
||||||
public GsonBuilder configGsonBuilder;
|
public GsonBuilder configGsonBuilder;
|
||||||
public Gson configGson;
|
public Gson configGson;
|
||||||
public void initGson()
|
|
||||||
{
|
public void initGson() {
|
||||||
gsonBuilder = new GsonBuilder();
|
gsonBuilder = new GsonBuilder();
|
||||||
configGsonBuilder = new GsonBuilder();
|
configGsonBuilder = new GsonBuilder();
|
||||||
configGsonBuilder.setPrettyPrinting();
|
configGsonBuilder.setPrettyPrinting();
|
||||||
|
@ -22,16 +22,16 @@ public void initGson()
|
||||||
gson = gsonBuilder.create();
|
gson = gsonBuilder.create();
|
||||||
configGson = configGsonBuilder.create();
|
configGson = configGsonBuilder.create();
|
||||||
}
|
}
|
||||||
public void registerAdapters(GsonBuilder builder)
|
|
||||||
{
|
public void registerAdapters(GsonBuilder builder) {
|
||||||
builder.registerTypeAdapter(HashedEntry.class, new HashedEntryAdapter());
|
builder.registerTypeAdapter(HashedEntry.class, new HashedEntryAdapter());
|
||||||
}
|
}
|
||||||
public void preConfigGson(GsonBuilder gsonBuilder)
|
|
||||||
{
|
public void preConfigGson(GsonBuilder gsonBuilder) {
|
||||||
//skip
|
//skip
|
||||||
}
|
}
|
||||||
public void preGson(GsonBuilder gsonBuilder)
|
|
||||||
{
|
public void preGson(GsonBuilder gsonBuilder) {
|
||||||
//skip
|
//skip
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,26 +3,25 @@
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class BiHookSet<V,R> {
|
public class BiHookSet<V, R> {
|
||||||
public Set<Hook<V,R>> list = new HashSet<>();
|
public Set<Hook<V, R>> list = new HashSet<>();
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface Hook<V, R>
|
public interface Hook<V, R> {
|
||||||
{
|
|
||||||
boolean hook(V object, R context) throws HookException;
|
boolean hook(V object, R context) throws HookException;
|
||||||
}
|
}
|
||||||
public void registerHook(Hook<V, R> hook)
|
|
||||||
{
|
public void registerHook(Hook<V, R> hook) {
|
||||||
list.add(hook);
|
list.add(hook);
|
||||||
}
|
}
|
||||||
public boolean unregisterHook(Hook<V, R> hook)
|
|
||||||
{
|
public boolean unregisterHook(Hook<V, R> hook) {
|
||||||
return list.remove(hook);
|
return list.remove(hook);
|
||||||
}
|
}
|
||||||
public boolean hook(V context, R object) throws HookException
|
|
||||||
{
|
public boolean hook(V context, R object) throws HookException {
|
||||||
for(Hook<V, R> hook : list)
|
for (Hook<V, R> hook : list) {
|
||||||
{
|
if (hook.hook(context, object)) return true;
|
||||||
if(hook.hook(context, object)) return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ public static JsonElement jsonRequest(JsonElement request, URL url) throws IOExc
|
||||||
try {
|
try {
|
||||||
return parser.parse(reader);
|
return parser.parse(reader);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if(200 > statusCode || statusCode > 300) {
|
if (200 > statusCode || statusCode > 300) {
|
||||||
LogHelper.error("JsonRequest failed. Server response code %d", statusCode);
|
LogHelper.error("JsonRequest failed. Server response code %d", statusCode);
|
||||||
throw new IOException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ru.gravit.utils;
|
package ru.gravit.utils;
|
||||||
|
|
||||||
public class HookException extends RuntimeException {
|
public class HookException extends RuntimeException {
|
||||||
private static final long serialVersionUID = -529141998961943161L;
|
private static final long serialVersionUID = -529141998961943161L;
|
||||||
|
|
||||||
public HookException(String message) {
|
public HookException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
|
|
|
@ -5,24 +5,23 @@
|
||||||
|
|
||||||
public class HookSet<R> {
|
public class HookSet<R> {
|
||||||
public Set<Hook<R>> list = new HashSet<>();
|
public Set<Hook<R>> list = new HashSet<>();
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface Hook<R>
|
public interface Hook<R> {
|
||||||
{
|
|
||||||
boolean hook(R context) throws HookException;
|
boolean hook(R context) throws HookException;
|
||||||
}
|
}
|
||||||
public void registerHook(Hook<R> hook)
|
|
||||||
{
|
public void registerHook(Hook<R> hook) {
|
||||||
list.add(hook);
|
list.add(hook);
|
||||||
}
|
}
|
||||||
public boolean unregisterHook(Hook<R> hook)
|
|
||||||
{
|
public boolean unregisterHook(Hook<R> hook) {
|
||||||
return list.remove(hook);
|
return list.remove(hook);
|
||||||
}
|
}
|
||||||
public boolean hook(R context) throws HookException
|
|
||||||
{
|
public boolean hook(R context) throws HookException {
|
||||||
for(Hook<R> hook : list)
|
for (Hook<R> hook : list) {
|
||||||
{
|
if (hook.hook(context)) return true;
|
||||||
if(hook.hook(context)) return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue