Skip to content
This repository has been archived by the owner on Apr 7, 2021. It is now read-only.

Commit

Permalink
Added loopbackfix command
Browse files Browse the repository at this point in the history
Since many people were having problems with DragonProxy when it tried to do the loopback exemption, especially since it would always do it automatically at startup. As a result, I have made it a command that can be executed optionally.
  • Loading branch information
whirvis committed Sep 16, 2018
1 parent accaead commit 34f6d8c
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 106 deletions.
4 changes: 2 additions & 2 deletions proxy/src/main/java/org/dragonet/proxy/DragonProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,8 @@ private DragonProxy() {
pluginManager.startPlugins();

// Add loopback exemption for Minecraft on Windows 10
if(!UniversalWindowsProgram.MINECRAFT.addLoopbackExempt()) {
logger.info(lang.get(Lang.ERROR_MCW10_LOOPBACK));
if(!UniversalWindowsProgram.MINECRAFT.isLoopbackExempt()) {
logger.info(lang.get(Lang.MESSAGE_MCW10_LOOPBACK));
}

// Bind
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,54 +25,56 @@

public final class CommandRegister {

private final Map<String, Command> commandMap = Collections.synchronizedMap(new HashMap<String, Command>());
private final DragonProxy proxy;
private final Map<String, Command> commandMap = Collections.synchronizedMap(new HashMap<String, Command>());
private final DragonProxy proxy;

public CommandRegister(DragonProxy proxy) {
this.proxy = proxy;
registerDefaults();
}
public CommandRegister(DragonProxy proxy) {
this.proxy = proxy;
registerDefaults();
}

public void registerDefaults() {
registerCommand("stop", new StopCommand("stop"));
registerCommand("help", new HelpCommand("help"));
registerCommand("kill", new KillCommand("kill")); // Bad things could happen
registerCommand("test", new TestCommand("test")); // FOR TESTING
registerCommand("timings", new TimingsCommand("timings"));
registerCommand("cache", new CacheCommand("cache"));
}
public void registerDefaults() {
registerCommand("stop", new StopCommand("stop"));
registerCommand("help", new HelpCommand("help"));
registerCommand("kill", new KillCommand("kill")); // Bad things could
// happen
registerCommand("test", new TestCommand("test")); // FOR TESTING
registerCommand("timings", new TimingsCommand("timings"));
registerCommand("cache", new CacheCommand("cache"));
registerCommand("loopbackfix", new LoopbackFixCommand("loopbackfix"));
}

public void registerCommand(String command, Command console) {
commandMap.put(command, console);
}
public void registerCommand(String command, Command console) {
commandMap.put(command, console);
}

public Map<String, Command> getCommands() {
return commandMap;
}
public Map<String, Command> getCommands() {
return commandMap;
}

public void callCommand(String cmd) {
String trimedCmd = cmd.trim();
String label = null;
String[] args = null;
if (!cmd.trim().contains(" ")) {
label = trimedCmd.toLowerCase();
args = new String[0];
} else {
label = trimedCmd.substring(0, trimedCmd.indexOf(" ")).toLowerCase();
String argLine = trimedCmd.substring(trimedCmd.indexOf(" ") + 1);
args = argLine.contains(" ") ? argLine.split(" ") : new String[]{argLine};
}
if (label == null) {
proxy.getLogger().warning(proxy.getLang().get(Lang.COMMAND_NOT_FOUND));
return;
}
Command command = commandMap.get(label);
if (command == null) {
proxy.getLogger().warning(proxy.getLang().get(Lang.COMMAND_NOT_FOUND));
return;
}
try (Timing timing = Timings.getCommandTiming(command)) {
command.execute(proxy, args);
}
}
public void callCommand(String cmd) {
String trimedCmd = cmd.trim();
String label = null;
String[] args = null;
if (!cmd.trim().contains(" ")) {
label = trimedCmd.toLowerCase();
args = new String[0];
} else {
label = trimedCmd.substring(0, trimedCmd.indexOf(" ")).toLowerCase();
String argLine = trimedCmd.substring(trimedCmd.indexOf(" ") + 1);
args = argLine.contains(" ") ? argLine.split(" ") : new String[] { argLine };
}
if (label == null) {
proxy.getLogger().warning(proxy.getLang().get(Lang.COMMAND_NOT_FOUND));
return;
}
Command command = commandMap.get(label);
if (command == null) {
proxy.getLogger().warning(proxy.getLang().get(Lang.COMMAND_NOT_FOUND));
return;
}
try (Timing timing = Timings.getCommandTiming(command)) {
command.execute(proxy, args);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.dragonet.proxy.commands.defaults;

import org.dragonet.proxy.DragonProxy;
import org.dragonet.proxy.commands.Command;
import org.dragonet.proxy.configuration.Lang;

import com.whirvis.jraknet.windows.UniversalWindowsProgram;

public class LoopbackFixCommand extends Command {

public LoopbackFixCommand(String name) {
super(name,
"Adds Minecraft to the Windows 10 loopback exemption list, allowing connections from the same machine that the server is running on");
}

@Override
public void execute(DragonProxy proxy, String[] args) {
if (UniversalWindowsProgram.MINECRAFT.isLoopbackExempt()) {
proxy.getLogger().info(proxy.getLang().get(Lang.MESSAGE_MCW10_LOOPBACK_ALREADY_EXEMPT));
return; // Minecraft is already loopback exempt
}
if (!UniversalWindowsProgram.MINECRAFT.addLoopbackExempt()) {
proxy.getLogger().info(proxy.getLang().get(Lang.ERROR_MCW10_LOOPBACK));
} else {
proxy.getLogger().info(proxy.getLang().get(Lang.MESSAGE_MCW10_LOOPBACK_SUCCESS));
}
}

}
119 changes: 61 additions & 58 deletions proxy/src/main/java/org/dragonet/proxy/configuration/Lang.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,66 +16,69 @@

public class Lang extends PropertiesConfig {

public static final String INIT_LOADING = "init_loading";
public static final String INIT_MC_PC_SUPPORT = "init_mc_pc_support";
public static final String INIT_MC_PE_SUPPORT = "init_mc_pe_support";
public static final String INIT_CREATING_THREAD_POOL = "init_creating_thread_pool";
public static final String INIT_BINDING = "init_binding";
public static final String INIT_DONE = "init_done";
public static final String BROADCAST_TITLE = "broadcast_title";
public static final String MESSAGE_CLIENT_CONNECTED = "message_client_connected";
public static final String MESSAGE_CLS_NOTICE = "message_cls_notice";
public static final String MESSAGE_SERVER_ERROR = "message_server_error";
public static final String ERROR_CLS_UNREACHABLE = "error_cls_unreachable";
public static final String ERROR_CLS_ERROR = "error_cls_error";
public static final String ERROR_CLS_LOGIN = "error_cls_login";
public static final String ERROR_MCW10_LOOPBACK = "error_mcw10_loopback";
//public static final String MESSAGE_ONLINE_NOTICE = "message_online_notice";
//public static final String MESSAGE_ONLINE_EMAIL = "message_online_email";
public static final String MESSAGE_LOGIN_PROMPT = "message_login_prompt";
public static final String MESSAGE_LOGIN_PROGRESS = "message_login_progress";
public static final String FORM_LOGIN_TITLE = "form_login_title";
public static final String FORM_LOGIN_DESC = "form_login_desc";
public static final String FORM_LOGIN_PROMPT = "form_login_prompt";
public static final String FORM_LOGIN_USERNAME = "form_login_username";
public static final String FORM_LOGIN_PASSWORD = "form_login_password";
public static final String MESSAGE_ONLINE_ERROR = "message_online_error";
public static final String MESSAGE_ONLINE_PASSWORD = "message_online_password";
public static final String MESSAGE_ONLINE_LOGGING_IN = "message_online_logging_in";
public static final String MESSAGE_ONLINE_LOGIN_SUCCESS = "message_online_login_success";
public static final String MESSAGE_ONLINE_LOGIN_SUCCESS_CONSOLE = "message_online_login_success_console";
public static final String MESSAGE_TELEPORT_TO_SPAWN = "message_teleport_to_spawn";
public static final String MESSAGE_ONLINE_USERNAME = "message_online_username";
public static final String MESSAGE_ONLINE_LOGIN_FAILD = "message_online_login_faild";
public static final String MESSAGE_REMOTE_CONNECTED = "message_remote_connected";
public static final String MESSAGE_REMOTE_CONNECT_FAILURE = "message_remote_connect_failure";
public static final String MESSAGE_JOINED = "message_joined";
public static final String MESSAGE_KICKED = "message_kicked";
public static final String MESSAGE_CLIENT_DISCONNECT = "message_client_disconnect";
public static final String MESSAGE_REMOTE_IS_ONLINE = "message_remote_is_online";
public static final String MESSAGE_REMOTE_ERROR = "message_remote_error";
public static final String MESSAGE_REMOTE_DISCONNECTED = "message_remote_disconnected";
public static final String CLIENT_DISCONNECTED = "client_disconnected";
public static final String COMMAND_NOT_FOUND = "command_not_found";
public static final String SHUTTING_DOWN = "shutting_down";
public static final String MESSAGE_UNSUPPORTED_CLIENT = "message_unsupported_client";
public static final String QUERY_FAILED = "query_failed";
public static final String LOGIN_VERIFY_FAILED = "error_bad_login_packet";
public static final String INIT_LOADING = "init_loading";
public static final String INIT_MC_PC_SUPPORT = "init_mc_pc_support";
public static final String INIT_MC_PE_SUPPORT = "init_mc_pe_support";
public static final String INIT_CREATING_THREAD_POOL = "init_creating_thread_pool";
public static final String INIT_BINDING = "init_binding";
public static final String INIT_DONE = "init_done";
public static final String BROADCAST_TITLE = "broadcast_title";
public static final String MESSAGE_CLIENT_CONNECTED = "message_client_connected";
public static final String MESSAGE_CLS_NOTICE = "message_cls_notice";
public static final String MESSAGE_SERVER_ERROR = "message_server_error";
public static final String ERROR_CLS_UNREACHABLE = "error_cls_unreachable";
public static final String ERROR_CLS_ERROR = "error_cls_error";
public static final String ERROR_CLS_LOGIN = "error_cls_login";
public static final String ERROR_MCW10_LOOPBACK = "error_mcw10_loopback";
// public static final String MESSAGE_ONLINE_NOTICE = "message_online_notice";
// public static final String MESSAGE_ONLINE_EMAIL = "message_online_email";
public static final String MESSAGE_LOGIN_PROMPT = "message_login_prompt";
public static final String MESSAGE_LOGIN_PROGRESS = "message_login_progress";
public static final String FORM_LOGIN_TITLE = "form_login_title";
public static final String FORM_LOGIN_DESC = "form_login_desc";
public static final String FORM_LOGIN_PROMPT = "form_login_prompt";
public static final String FORM_LOGIN_USERNAME = "form_login_username";
public static final String FORM_LOGIN_PASSWORD = "form_login_password";
public static final String MESSAGE_ONLINE_ERROR = "message_online_error";
public static final String MESSAGE_ONLINE_PASSWORD = "message_online_password";
public static final String MESSAGE_ONLINE_LOGGING_IN = "message_online_logging_in";
public static final String MESSAGE_ONLINE_LOGIN_SUCCESS = "message_online_login_success";
public static final String MESSAGE_ONLINE_LOGIN_SUCCESS_CONSOLE = "message_online_login_success_console";
public static final String MESSAGE_TELEPORT_TO_SPAWN = "message_teleport_to_spawn";
public static final String MESSAGE_ONLINE_USERNAME = "message_online_username";
public static final String MESSAGE_ONLINE_LOGIN_FAILD = "message_online_login_faild";
public static final String MESSAGE_REMOTE_CONNECTED = "message_remote_connected";
public static final String MESSAGE_REMOTE_CONNECT_FAILURE = "message_remote_connect_failure";
public static final String MESSAGE_MCW10_LOOPBACK = "message_mcw10_loopback";
public static final String MESSAGE_MCW10_LOOPBACK_SUCCESS = "message_mcw10_loopback_success";
public static final String MESSAGE_MCW10_LOOPBACK_ALREADY_EXEMPT = "message_mcw10_loopback_already_exempt";
public static final String MESSAGE_JOINED = "message_joined";
public static final String MESSAGE_KICKED = "message_kicked";
public static final String MESSAGE_CLIENT_DISCONNECT = "message_client_disconnect";
public static final String MESSAGE_REMOTE_IS_ONLINE = "message_remote_is_online";
public static final String MESSAGE_REMOTE_ERROR = "message_remote_error";
public static final String MESSAGE_REMOTE_DISCONNECTED = "message_remote_disconnected";
public static final String CLIENT_DISCONNECTED = "client_disconnected";
public static final String COMMAND_NOT_FOUND = "command_not_found";
public static final String SHUTTING_DOWN = "shutting_down";
public static final String MESSAGE_UNSUPPORTED_CLIENT = "message_unsupported_client";
public static final String QUERY_FAILED = "query_failed";
public static final String LOGIN_VERIFY_FAILED = "error_bad_login_packet";

public Lang(String langFileName) throws IOException {
super("/en_US.properties", langFileName, false);
}
public Lang(String langFileName) throws IOException {
super("/en_US.properties", langFileName, false);
}

public String get(String key) {
String str = getConfig().getProperty(key);
if(str == null)
return key;
public String get(String key) {
String str = getConfig().getProperty(key);
if (str == null)
return key;

str = str.replace("[PROJNAME]", getConfig().getProperty("project_name"));
return str;
}
str = str.replace("[PROJNAME]", getConfig().getProperty("project_name"));
return str;
}

public String get(String key, Object... repl) {
return String.format(get(key), repl);
}
public String get(String key, Object... repl) {
return String.format(get(key), repl);
}
}
5 changes: 4 additions & 1 deletion proxy/src/main/resources/en_US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ message_kicked=Player %s[%s] was kicked because: %s
message_remote_disconnected=Remote server disconnected!
message_client_disconnect=Client disconnect
message_unsupported_client=Unsupported client!
message_mcw10_loopback=Use /loopbackfix in order to be able to connect to the server on the same machine that you are running it on.
message_mcw10_loopback_success=Added Minecraft to the loopback exemption list!
message_mcw10_loopback_already_exempt=Minecraft is already loopback exempt.
client_disconnected=Client %s[%s] disconnected! Reason: %s
shutting_down=Shutting down [PROJNAME]...
query_failed=Couldn't connect to %ip%:%port%!
Expand All @@ -45,5 +48,5 @@ message_server_error=\u00a7cServer was unable to log you in because it had an er
error_cls_unreachable=Unable to reach CLS HTTP API
error_cls_error=CLS System replied weird stuff. Please retry.
error_cls_login=Faild to login with your login token, try re-login on CLS?
error_mcw10_loopback=Failed to add Minecraft to the Windows 10 loopback exemption list. Did you give the process permission to do so? You can ignore this if you do not need to join the server on the same machine that you are running it on.
error_mcw10_loopback=Failed to add Minecraft to the Windows 10 loopback exemption list. Did you give the process permission to do so?
error_bad_login_packet=Invalid session (try restarting your game)

0 comments on commit 34f6d8c

Please sign in to comment.