From 2f5a83e171f567fb27f5ead1dbc7d5b7e0916efc Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Fri, 30 Mar 2018 08:37:17 -0600 Subject: [PATCH] Show external IP when hosting, if possible Fixes: core-developers/forge#396 Signed-off-by: Jamin W. Collins --- .../main/java/forge/net/NetConnectUtil.java | 22 ++++++++++--- .../java/forge/net/server/FServerManager.java | 33 +++++++++++++++---- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/forge-gui/src/main/java/forge/net/NetConnectUtil.java b/forge-gui/src/main/java/forge/net/NetConnectUtil.java index cf1e624a423..3e3cdf8e28b 100644 --- a/forge-gui/src/main/java/forge/net/NetConnectUtil.java +++ b/forge-gui/src/main/java/forge/net/NetConnectUtil.java @@ -106,10 +106,24 @@ public class NetConnectUtil { } public static void copyHostedServerUrl() { - String hostname = FServerManager.getInstance().getLocalAddress(); - String url = hostname + ":" + ForgeProfileProperties.getServerPort(); - GuiBase.getInterface().copyToClipboard(url); - SOptionPane.showMessageDialog("Share the following URL with anyone who wishes to join your server. It has been copied to your clipboard for convenience.\n\n" + url, "Server URL", SOptionPane.INFORMATION_ICON); + String internalAddress = FServerManager.getInstance().getLocalAddress(); + String externalAddress = FServerManager.getInstance().getExternalAddress(); + String internalUrl = internalAddress + ":" + ForgeProfileProperties.getServerPort(); + String externalUrl = null; + if (externalAddress != null) { + externalUrl = externalAddress + ":" + ForgeProfileProperties.getServerPort(); + GuiBase.getInterface().copyToClipboard(externalUrl); + } else { + GuiBase.getInterface().copyToClipboard(internalAddress); + } + + String message = "Share the following URL with anyone who wishes to join your server. It has been copied to your clipboard for convenience.\n\n"; + if (externalUrl != null) { + message += externalUrl + "\n\nFor internal games, use the following URL: " + internalUrl; + } else { + message = "Forge was unable to determine your external IP!\n\n" + message + internalUrl; + } + SOptionPane.showMessageDialog(message, "Server URL", SOptionPane.INFORMATION_ICON); } public static ChatMessage join(final String url, final IOnlineLobby onlineLobby, final IOnlineChatInterface chatInterface) { diff --git a/forge-gui/src/main/java/forge/net/server/FServerManager.java b/forge-gui/src/main/java/forge/net/server/FServerManager.java index c5af180361c..fad16bfb982 100644 --- a/forge-gui/src/main/java/forge/net/server/FServerManager.java +++ b/forge-gui/src/main/java/forge/net/server/FServerManager.java @@ -30,13 +30,10 @@ import io.netty.handler.codec.serialization.ObjectEncoder; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; -import java.net.DatagramSocket; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.*; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; @@ -253,6 +250,28 @@ public final class FServerManager { } } + public static String getExternalAddress() { + BufferedReader in = null; + try { + URL whatismyip = new URL("http://checkip.amazonaws.com"); + in = new BufferedReader(new InputStreamReader( + whatismyip.openStream())); + String ip = in.readLine(); + return ip; + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + private void mapNatPort(final int port) { final String localAddress = getLocalAddress(); final PortMapping portMapping = new PortMapping(port, localAddress, PortMapping.Protocol.TCP, "Forge");