diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java index c08110b3608..3e73e53f994 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java @@ -5,6 +5,7 @@ import forge.deckchooser.FDeckChooser; import forge.gamemodes.match.GameLobby; import forge.gamemodes.net.IOnlineLobby; +import forge.gamemodes.net.NetConnectUtil; import forge.gamemodes.net.client.FGameClient; import forge.gamemodes.net.server.FServerManager; import forge.gui.FNetOverlay; @@ -82,7 +83,14 @@ public void populate() { lobby.getLblTitle().setText(Localizer.getInstance().getMessage("lblOnlineLobbyTitle")); pnlTitle.removeAll(); pnlTitle.setOpaque(false); - pnlTitle.add(lobby.getLblTitle(), "w 95%, h 40px!, gap 0 0 15px 15px, span 2"); + final boolean hosting = FServerManager.getInstance().isHosting(); + pnlTitle.add(lobby.getLblTitle(), "w 95%, h 40px!, gap 0 0 15px 15px, span " + (hosting ? "3" : "2")); + if (hosting) { + FButton btnServerUrl = new FButton(Localizer.getInstance().getMessage("lblServerURL")); + btnServerUrl.setFont(FSkin.getRelativeFont(14)); + pnlTitle.add(btnServerUrl, "w 150!, h 35!, gap 10 10 0 0, align right"); + btnServerUrl.addActionListener(e -> NetConnectUtil.copyHostedServerUrl()); + } pnlTitle.add(btnStop, "gap 10 10 0 0, align right"); container.add(pnlTitle,"w 80%, gap 0 0 0 0, al right, pushx"); diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index e80b3201cd6..c2874a6402e 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -3065,9 +3065,11 @@ lblConnectingToServer=Connecting to server... #NetConnectUtil.java lblOnlineMultiplayerDest=This feature is under active development.\nYou are likely to find bugs.\n\n - = * H E R E B E E L D R A Z I * = -\n\nEnter the URL of the server to join.\nLeave blank to host your own server. lblHostingPortOnN=Hosting on port {0}. -lblShareURLToMakePlayerJoinServer=Share the following URL with anyone who wishes to join your server. It has been copied to your clipboard for convenience.\n\n{0}\n\nFor internal games, use the following URL: {1} -lblForgeUnableDetermineYourExternalIP=Forge was unable to determine your external IP!\n\n{0} +lblShareURLToMakePlayerJoinServer=Share a URL below with anyone who wishes to join your server.\nThe external URL has been copied to your clipboard.\n\nExternal URL (for players outside your network):\n{0}\n\nLocal URL (for players on your network):\n{1} +lblForgeUnableDetermineYourExternalIP=Forge was unable to determine your external IP.\nThe local URL has been copied to your clipboard.\n\nLocal URL (for players on your network):\n{0} lblServerURL=Server URL +lblCopyExternalURL=Copy External URL +lblCopyLocalURL=Copy Local URL lblYourConnectionToHostWasInterrupted=Your connection to the host ({0}) was interrupted. lblConnectedIPPort=Connected to {0}:{1} #FServerManager.java diff --git a/forge-gui/src/main/java/forge/gamemodes/net/NetConnectUtil.java b/forge-gui/src/main/java/forge/gamemodes/net/NetConnectUtil.java index 5c5fdf4a270..898f922c7e6 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/NetConnectUtil.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/NetConnectUtil.java @@ -24,6 +24,8 @@ import forge.util.URLValidator; import org.apache.commons.lang3.StringUtils; +import java.util.List; + import static forge.util.URLValidator.parseURL; public class NetConnectUtil { @@ -106,6 +108,7 @@ public Object sendAndWait(final IdentifiableNetEvent event) { } public static void copyHostedServerUrl() { + final Localizer localizer = Localizer.getInstance(); String internalAddress = FServerManager.getLocalAddress(); String externalAddress = FServerManager.getExternalAddress(); String internalUrl = internalAddress + ":" + FModel.getNetPreferences().getPrefInt(ForgeNetPreferences.FNetPref.NET_PORT); @@ -114,16 +117,42 @@ public static void copyHostedServerUrl() { externalUrl = externalAddress + ":" + FModel.getNetPreferences().getPrefInt(ForgeNetPreferences.FNetPref.NET_PORT); GuiBase.getInterface().copyToClipboard(externalUrl); } else { - GuiBase.getInterface().copyToClipboard(internalAddress); + GuiBase.getInterface().copyToClipboard(internalUrl); } - String message = ""; + String message; + String title = localizer.getMessage("lblServerURL"); + List options; + int closeIndex; + int localCopyIndex; + if (externalUrl != null) { - message = Localizer.getInstance().getMessage("lblShareURLToMakePlayerJoinServer", externalUrl, internalUrl); + message = localizer.getMessage("lblShareURLToMakePlayerJoinServer", externalUrl, internalUrl); + options = List.of( + localizer.getMessage("lblCopyExternalURL"), + localizer.getMessage("lblCopyLocalURL"), + localizer.getMessage("lblClose")); + closeIndex = 2; + localCopyIndex = 1; } else { - message = Localizer.getInstance().getMessage("lblForgeUnableDetermineYourExternalIP", message + internalUrl); + message = localizer.getMessage("lblForgeUnableDetermineYourExternalIP", internalUrl); + options = List.of( + localizer.getMessage("lblCopyLocalURL"), + localizer.getMessage("lblClose")); + closeIndex = 1; + localCopyIndex = 0; + } + + while (true) { + int result = SOptionPane.showOptionDialog(message, title, SOptionPane.INFORMATION_ICON, options, closeIndex); + if (externalUrl != null && result == 0) { + GuiBase.getInterface().copyToClipboard(externalUrl); + } else if (result == localCopyIndex) { + GuiBase.getInterface().copyToClipboard(internalUrl); + } else { + break; + } } - SOptionPane.showMessageDialog(message, Localizer.getInstance().getMessage("lblServerURL"), SOptionPane.INFORMATION_ICON); } public static ChatMessage join(final String url, final IOnlineLobby onlineLobby, final IOnlineChatInterface chatInterface) {