Skip to content

Commit

Permalink
Merge pull request #3789 from thelsing/feature-webrtc
Browse files Browse the repository at this point in the history
Webrtc improvements
  • Loading branch information
Phergus committed Dec 27, 2022
2 parents d1db0cc + ad5368c commit c9de655
Show file tree
Hide file tree
Showing 16 changed files with 1,878 additions and 1,925 deletions.
8 changes: 4 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -423,13 +423,13 @@ dependencies {

// webrtc
implementation group: 'org.java-websocket', name: 'Java-WebSocket', version: '1.5.2'
implementation 'dev.onvoid.webrtc:webrtc-java:0.5.0'
implementation 'dev.onvoid.webrtc:webrtc-java:0.7.0'
if (osdetector.os.is('windows'))
implementation 'dev.onvoid.webrtc:webrtc-java:0.5.0:windows-x86_64'
implementation 'dev.onvoid.webrtc:webrtc-java:0.7.0:windows-x86_64'
else if (osdetector.os.is('osx'))
implementation 'dev.onvoid.webrtc:webrtc-java:0.5.0:macos-x86_64'
implementation 'dev.onvoid.webrtc:webrtc-java:0.7.0:macos-x86_64'
else if (osdetector.os.is('linux'))
implementation 'dev.onvoid.webrtc:webrtc-java:0.5.0:linux-x86_64'
implementation 'dev.onvoid.webrtc:webrtc-java:0.7.0:linux-x86_64'

// protobuf
implementation "io.grpc:grpc-protobuf:1.47.0"
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/net/rptools/clientserver/ConnectionFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import net.rptools.clientserver.simple.server.ServerConnection;
import net.rptools.clientserver.simple.server.SocketServerConnection;
import net.rptools.clientserver.simple.server.WebRTCServerConnection;
import net.rptools.maptool.client.AppState;
import net.rptools.maptool.server.ServerConfig;

public class ConnectionFactory {
Expand All @@ -34,15 +33,15 @@ public static ConnectionFactory getInstance() {

public ClientConnection createClientConnection(String id, ServerConfig config)
throws IOException {
if (!AppState.useWebRTC() || config.isPersonalServer())
if (!config.getUseWebRTC() || config.isPersonalServer())
return new SocketClientConnection(id, config.getHostName(), config.getPort());

return new WebRTCClientConnection(id, config);
}

public ServerConnection createServerConnection(ServerConfig config, HandshakeProvider handshake)
throws IOException {
if (!AppState.useWebRTC() || config.isPersonalServer())
if (!config.getUseWebRTC() || config.isPersonalServer())
return new SocketServerConnection(config.getPort(), handshake);

return new WebRTCServerConnection(config, handshake);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,37 @@ public void onError(Exception ex) {
}

private void init() {
RTCIceServer iceServer = new RTCIceServer();
iceServer.urls.add("stun:stun.l.google.com:19302");
iceServer.urls.add("stun:stun1.l.google.com:19302");
iceServer.urls.add("stun:stun2.l.google.com:19302");
iceServer.urls.add("stun:stun3.l.google.com:19302");
iceServer.urls.add("stun:stun4.l.google.com:19302");

rtcConfig = new RTCConfiguration();
rtcConfig.iceServers.add(iceServer);

var googleStun = new RTCIceServer();
googleStun.urls.add("stun:stun.l.google.com:19302");
googleStun.urls.add("stun:stun1.l.google.com:19302");
googleStun.urls.add("stun:stun2.l.google.com:19302");
googleStun.urls.add("stun:stun3.l.google.com:19302");
googleStun.urls.add("stun:stun4.l.google.com:19302");
rtcConfig.iceServers.add(googleStun);

var openRelayStun = new RTCIceServer();
openRelayStun.urls.add("stun:openrelay.metered.ca:80");
rtcConfig.iceServers.add(openRelayStun);

var openRelayTurn = new RTCIceServer();
openRelayTurn.urls.add("turn:openrelay.metered.ca:80");
openRelayTurn.username = "openrelayproject";
openRelayTurn.password = "openrelayproject";
rtcConfig.iceServers.add(openRelayTurn);

var openRelayTurn2 = new RTCIceServer();
openRelayTurn2.urls.add("turn:openrelay.metered.ca:443");
openRelayTurn2.username = "openrelayproject";
openRelayTurn2.password = "openrelayproject";
rtcConfig.iceServers.add(openRelayTurn2);

var openRelayTurn3 = new RTCIceServer();
openRelayTurn3.urls.add("turn:openrelay.metered.ca:443?transport=tcp");
openRelayTurn3.username = "openrelayproject";
openRelayTurn3.password = "openrelayproject";
rtcConfig.iceServers.add(openRelayTurn3);
}

@Override
Expand Down Expand Up @@ -253,7 +275,7 @@ public void onFailure(String error) {

private void onLogin(LoginMessageDto message) {
if (!message.success) {
MapTool.showError("Player already taken!");
MapTool.showError("Handshake.msg.playerAlreadyConnected");
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ private void handleSignalingMessage(String message) {
case "login" -> {
var loginMsg = gson.fromJson(message, LoginMessageDto.class);
if (!loginMsg.success) {
MapTool.showError("Servername already taken!");
MapTool.showError("ServerDialog.error.serverAlreadyExists");
}
}
case "offer" -> {
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/net/rptools/maptool/client/AppActions.java
Original file line number Diff line number Diff line change
Expand Up @@ -2242,7 +2242,8 @@ protected void executeAction() {
serverProps.getPort(),
serverProps.getRPToolsName(),
"localhost",
serverProps.getUseEasyConnect());
serverProps.getUseEasyConnect(),
serverProps.getUseWebRtc());

// Use the existing campaign
Campaign campaign = MapTool.getCampaign();
Expand Down Expand Up @@ -2414,7 +2415,8 @@ protected void executeAction() {
"",
dialog.getPort(),
prefs.getServerName(),
dialog.getServer());
dialog.getServer(),
dialog.getUseWebRTC());

String password =
prefs.getUsePublicKey()
Expand Down
9 changes: 0 additions & 9 deletions src/main/java/net/rptools/maptool/client/AppState.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ public class AppState {
private static boolean collectProfilingData = false;
private static boolean isLoggingToConsole = false;
private static boolean isLockedForBackgroundTask = false;
private static boolean useWebRTC = false;
private static boolean enableFullScreenUI = true;

private static PropertyChangeSupport changeSupport = new PropertyChangeSupport(AppState.class);
Expand Down Expand Up @@ -218,14 +217,6 @@ public static void setNotificationEnforced(boolean enforce) {
enforceNotification = enforce;
}

public static boolean useWebRTC() {
return useWebRTC;
}

public static void setUseWebRTC(boolean use) {
useWebRTC = use;
}

public static boolean isFullScreenUIEnabled() {
return enableFullScreenUI;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/rptools/maptool/client/MapTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -1035,7 +1035,7 @@ public static void startServer(
try {
MapToolRegistry.RegisterResponse result =
MapToolRegistry.getInstance()
.registerInstance(config.getServerName(), config.getPort());
.registerInstance(config.getServerName(), config.getPort(), config.getUseWebRTC());
if (result == MapToolRegistry.RegisterResponse.NAME_EXISTS) {
MapTool.showError("msg.error.alreadyRegistered");
}
Expand Down
14 changes: 13 additions & 1 deletion src/main/java/net/rptools/maptool/client/MapToolRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public static MapToolRegistry getInstance() {
public static class SeverConnectionDetails {
public String address;
public int port;
public boolean webrtc;
}

public enum RegisterResponse {
Expand All @@ -94,6 +95,16 @@ public SeverConnectionDetails findInstance(String id) {
details.address = json.getAsJsonPrimitive("address").getAsString();
details.port = json.getAsJsonPrimitive("port").getAsInt();

// currently the webrtc property is sent as int. In the future this will
// change to boolean. So we check what the type is. Can be removed when
// we get it as boolean.
var webrtcProperty = json.getAsJsonPrimitive("webrtc");
if (webrtcProperty.isBoolean()) {
details.webrtc = webrtcProperty.getAsBoolean();
} else {
details.webrtc = webrtcProperty.getAsInt() > 0;
}

return details;

} catch (IOException | NullPointerException e) {
Expand Down Expand Up @@ -121,11 +132,12 @@ public List<String> findAllInstances() {
}
}

public RegisterResponse registerInstance(String id, int port) {
public RegisterResponse registerInstance(String id, int port, boolean webrtc) {
JsonObject body = new JsonObject();
body.addProperty("name", id);
body.addProperty("port", port);
body.addProperty("address", getAddress());
body.addProperty("webrtc", webrtc);
if (MapTool.isDevelopment()) {
body.addProperty("version", "Dev");
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,10 @@
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import net.rptools.maptool.client.AppConstants;
import net.rptools.maptool.client.AppState;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.MapToolRegistry;
import net.rptools.maptool.client.MapToolRegistry.SeverConnectionDetails;
Expand All @@ -62,8 +59,7 @@ public class ConnectToServerDialog extends AbeillePanel<ConnectToServerDialogPre

private boolean accepted;
private GenericDialog dialog;
private int port;
private String hostname;
private SeverConnectionDetails connectionDetails = new SeverConnectionDetails();

/** This is the default constructor */
public ConnectToServerDialog() {
Expand All @@ -78,11 +74,15 @@ protected void preModelBind() {
}

public int getPort() {
return port;
return connectionDetails.port;
}

public String getServer() {
return hostname;
return connectionDetails.address;
}

public boolean getUseWebRTC() {
return connectionDetails.webrtc;
}

public void showDialog() {
Expand All @@ -100,30 +100,7 @@ public void showDialog() {

boolean usePublicKey = getUsePublicKeyCheckBox().isSelected();
getPasswordTextField().setEnabled(!usePublicKey);
getServerNameTextField()
.getDocument()
.addDocumentListener(
new DocumentListener() {
private void checkName() {
getUseWebRTCCheckBox().setEnabled(getServerNameTextField().getText().length() > 0);
}

@Override
public void insertUpdate(DocumentEvent e) {
checkName();
}

@Override
public void removeUpdate(DocumentEvent e) {
checkName();
}

@Override
public void changedUpdate(DocumentEvent e) {
checkName();
}
});
getUseWebRTCCheckBox().setEnabled(getServerNameTextField().getText().length() > 0);
dialog.showDialog();
}

Expand Down Expand Up @@ -264,10 +241,6 @@ public void initRefreshButton() {
getRefreshButton().addActionListener(e -> updateRemoteServerList());
}

public JCheckBox getUseWebRTCCheckBox() {
return (JCheckBox) getComponent("@useWebRTC");
}

public JTextField getUsernameTextField() {
return (JTextField) getComponent("@username");
}
Expand Down Expand Up @@ -327,8 +300,8 @@ private void handleOK() {
}
// OK
ServerInfo info = (ServerInfo) getLocalServerList().getSelectedValue();
port = info.port;
hostname = info.address.getHostAddress();
connectionDetails.port = info.port;
connectionDetails.address = info.address.getHostAddress();
}
if (SwingUtil.hasComponent(selectedPanel, "directPanel")) {
// TODO: put these into a validation method
Expand All @@ -352,8 +325,8 @@ private void handleOK() {
getHostTextField().setText(host);

// OK
port = portTemp;
hostname = host;
connectionDetails.port = portTemp;
connectionDetails.address = host;
}
if (SwingUtil.hasComponent(selectedPanel, "rptoolsPanel")) {
String serverName = getServerNameTextField().getText().trim();
Expand All @@ -369,18 +342,12 @@ private void handleOK() {
MapTool.showError(I18N.getText("ServerDialog.error.serverNotFound", serverName));
return;
}
hostname = serverInfo.address;
try {
port = serverInfo.port;
} catch (NumberFormatException nfe) {
MapTool.showError("ServerDialog.error.portNumberException");
return;
}
connectionDetails = serverInfo;
}
try {
InetAddress server = InetAddress.getByName(hostname);
InetAddress server = InetAddress.getByName(connectionDetails.address);
InetAddress extAddress = InetAddress.getByName(externalAddress);
if (extAddress != null && extAddress.equals(server) && !getUseWebRTCCheckBox().isSelected()) {
if (extAddress != null && extAddress.equals(server) && !connectionDetails.webrtc) {
boolean yes =
MapTool.confirm(
"ConnectToServerDialog.warning.doNotUseExternalAddress",
Expand All @@ -393,8 +360,6 @@ private void handleOK() {
}
if (commit()) {
accepted = true;
JCheckBox useWebRTCCheckBox = getUseWebRTCCheckBox();
AppState.setUseWebRTC(useWebRTCCheckBox.isEnabled() && useWebRTCCheckBox.isSelected());
dialog.closeDialog();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import net.rptools.maptool.client.AppPreferences;
import net.rptools.maptool.client.AppState;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.swing.AbeillePanel;
import net.rptools.maptool.client.swing.GenericDialog;
Expand Down Expand Up @@ -264,9 +263,11 @@ public void initOKButton() {
prefs.setLockTokenEditOnStart(lockTokenEditOnStartup.isSelected());
prefs.setLockPlayerMovementOnStart(lockPlayerMoveOnStartup.isSelected());
prefs.setPlayerLibraryLock(lockPlayerLibrary.isSelected());

JCheckBox useWebRTCCheckBox = getUseWebRTCCheckBox();
AppState.setUseWebRTC(
prefs.setKeyUseWebrtc(
useWebRTCCheckBox.isEnabled() && useWebRTCCheckBox.isSelected());

accepted = true;
dialog.closeDialog();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public class StartServerDialogPreferences {
private static final String KEY_START_LOCKED_PLAYER_MOVEMENT = "lockPlayerMovementOnStartup";
private static final String KEY_LOCK_PLAYER_LIBRARY = "lockPlayerLibrary";

private static final String KEY_USE_WEBRTC = "useWebRTC";

private static Boolean useToolTipsForUnformattedRolls = null;

public Player.Role getRole() {
Expand Down Expand Up @@ -259,4 +261,12 @@ public boolean getPlayerLibraryLock() {
public void setPlayerLibraryLock(boolean flag) {
prefs.putBoolean(KEY_LOCK_PLAYER_LIBRARY, flag);
}

public boolean getUseWebRtc() {
return prefs.getBoolean(KEY_USE_WEBRTC, false);
}

public void setKeyUseWebrtc(boolean flag) {
prefs.putBoolean(KEY_USE_WEBRTC, flag);
}
}

0 comments on commit c9de655

Please sign in to comment.