Skip to content

Commit 4ce7846

Browse files
Extend API calls to parameters to handle multiple clients
1 parent 0c037b1 commit 4ce7846

5 files changed

Lines changed: 85 additions & 77 deletions

File tree

src/main/java/com/gravitylab/obscontrollerapi/config/WebSocketConfig.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/main/java/com/gravitylab/obscontrollerapi/controller/OBSController.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.springframework.http.ResponseEntity;
55
import org.springframework.web.bind.annotation.PostMapping;
66
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RequestParam;
78
import org.springframework.web.bind.annotation.RestController;
89

910
import com.gravitylab.obscontrollerapi.service.OBSWebSocketService;
@@ -22,36 +23,45 @@ public OBSController(OBSWebSocketService obsWebSocketService) {
2223
this.obsWebSocketService = obsWebSocketService;
2324
}
2425

26+
@PostMapping("/connect")
27+
public ResponseEntity<?> connect(@RequestParam String ipAddress, @RequestParam int port,
28+
@RequestParam String password) {
29+
try {
30+
obsWebSocketService.connectClient(ipAddress, port, password);
31+
return ResponseEntity.ok("Connected to OBS at " + ipAddress + ":" + port);
32+
} catch (Exception e) {
33+
log.error("Error connecting to OBS: ", e);
34+
return ResponseEntity.badRequest().body("Failed to connect: " + e.getMessage());
35+
}
36+
}
37+
2538
@PostMapping("/authenticate")
26-
public ResponseEntity<?> authenticate() {
27-
this.obsWebSocketService.authenticate();
28-
return ResponseEntity.ok().build();
39+
public ResponseEntity<?> authenticate(@RequestParam String ipAddress, @RequestParam int port) {
40+
obsWebSocketService.authenticate(ipAddress, port);
41+
return ResponseEntity.ok("Authenticated OBS at " + ipAddress + ":" + port);
2942
}
3043

3144
@PostMapping("/reconnect")
32-
public ResponseEntity<?> reconnect() {
33-
this.obsWebSocketService.reconnect();
34-
return ResponseEntity.ok().build();
45+
public ResponseEntity<?> reconnect(@RequestParam String ipAddress, @RequestParam int port) {
46+
obsWebSocketService.reconnect(ipAddress, port);
47+
return ResponseEntity.ok("Reconnected to OBS at " + ipAddress + ":" + port);
3548
}
3649

37-
@PostMapping("disconnect")
38-
public ResponseEntity<?> disconnect() {
39-
obsWebSocketService.disconnect();
40-
return ResponseEntity.ok().build();
50+
@PostMapping("/disconnect")
51+
public ResponseEntity<?> disconnect(@RequestParam String ipAddress, @RequestParam int port) {
52+
obsWebSocketService.disconnect(ipAddress, port);
53+
return ResponseEntity.ok("Disconnected from OBS at " + ipAddress + ":" + port);
4154
}
4255

4356
@PostMapping("/startRecording")
44-
public ResponseEntity<?> startRecording() {
45-
// Call service method to start recording
46-
this.obsWebSocketService.startRecording();
47-
return ResponseEntity.ok().build();
57+
public ResponseEntity<?> startRecording(@RequestParam String ipAddress, @RequestParam int port) {
58+
obsWebSocketService.startRecording(ipAddress, port);
59+
return ResponseEntity.ok("Started recording on OBS at " + ipAddress + ":" + port);
4860
}
4961

5062
@PostMapping("/stopRecording")
51-
public ResponseEntity<?> stopRecording() {
52-
// Call service method to stop recording
53-
obsWebSocketService.stopRecording();
54-
return ResponseEntity.ok().build();
63+
public ResponseEntity<?> stopRecording(@RequestParam String ipAddress, @RequestParam int port) {
64+
obsWebSocketService.stopRecording(ipAddress, port);
65+
return ResponseEntity.ok("Stopped recording on OBS at " + ipAddress + ":" + port);
5566
}
56-
57-
}
67+
}
Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,66 @@
11
package com.gravitylab.obscontrollerapi.service;
22

3-
import org.springframework.beans.factory.annotation.Autowired;
3+
import java.net.URISyntaxException;
4+
import java.util.Map;
5+
import java.util.concurrent.ConcurrentHashMap;
6+
47
import org.springframework.stereotype.Service;
58

69
import com.gravitylab.obscontrollerapi.websocket.OBSWebSocketClient;
710

8-
import lombok.extern.slf4j.Slf4j;
9-
10-
@Slf4j
1111
@Service
1212
public class OBSWebSocketService {
13-
private final OBSWebSocketClient obsWebSocketClient;
1413

15-
@Autowired
16-
public OBSWebSocketService(OBSWebSocketClient obsWebSocketClient) {
17-
this.obsWebSocketClient = obsWebSocketClient;
18-
obsWebSocketClient.connect();
14+
private final Map<String, OBSWebSocketClient> clients = new ConcurrentHashMap<>();
15+
16+
public void connectClient(String ipAddress, int port, String password) throws URISyntaxException {
17+
String key = createClientKey(ipAddress, port);
18+
OBSWebSocketClient client = new OBSWebSocketClient(ipAddress, port, password);
19+
clients.put(key, client);
20+
client.connect();
21+
}
22+
23+
public void authenticate(String ipAddress, int port) {
24+
OBSWebSocketClient client = getClient(ipAddress, port);
25+
if (client != null) {
26+
client.authenticate();
27+
}
28+
}
29+
30+
public void disconnect(String ipAddress, int port) {
31+
OBSWebSocketClient client = getClient(ipAddress, port);
32+
if (client != null) {
33+
client.close();
34+
clients.remove(createClientKey(ipAddress, port));
35+
}
1936
}
2037

21-
public void authenticate() {
22-
obsWebSocketClient.authenticate();
38+
public void startRecording(String ipAddress, int port) {
39+
OBSWebSocketClient client = getClient(ipAddress, port);
40+
if (client != null) {
41+
client.startRecording();
42+
}
2343
}
2444

25-
public void disconnect() {
26-
obsWebSocketClient.close();
45+
public void stopRecording(String ipAddress, int port) {
46+
OBSWebSocketClient client = getClient(ipAddress, port);
47+
if (client != null) {
48+
client.stopRecording();
49+
}
2750
}
2851

29-
public void startRecording() {
30-
this.obsWebSocketClient.startRecording();
52+
public void reconnect(String ipAddress, int port) {
53+
OBSWebSocketClient client = getClient(ipAddress, port);
54+
if (client != null) {
55+
client.reconnect();
56+
}
3157
}
3258

33-
public void stopRecording() {
34-
this.obsWebSocketClient.stopRecording();
59+
private OBSWebSocketClient getClient(String ipAddress, int port) {
60+
return clients.get(createClientKey(ipAddress, port));
3561
}
3662

37-
public void reconnect() {
38-
obsWebSocketClient.reconnect();
63+
private String createClientKey(String ipAddress, int port) {
64+
return ipAddress + ":" + port;
3965
}
4066
}

src/main/java/com/gravitylab/obscontrollerapi/websocket/OBSWebSocketClient.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.gravitylab.obscontrollerapi.websocket;
22

33
import java.net.URI;
4+
import java.net.URISyntaxException;
45
import java.nio.charset.StandardCharsets;
56
import java.security.MessageDigest;
67
import java.security.NoSuchAlgorithmException;
@@ -12,32 +13,25 @@
1213
import org.java_websocket.client.WebSocketClient;
1314
import org.java_websocket.handshake.ServerHandshake;
1415
import org.json.JSONObject;
15-
import org.springframework.beans.factory.annotation.Autowired;
16-
import org.springframework.beans.factory.annotation.Value;
17-
import org.springframework.stereotype.Component;
1816

1917
import lombok.extern.slf4j.Slf4j;
2018

2119
@Slf4j
22-
@Component
2320
public class OBSWebSocketClient extends WebSocketClient {
2421

25-
@Value("${obs.websocket.password}")
26-
private String obsPassword;
22+
private final String obsPassword;
2723

28-
private String salt = "";
29-
private String challenge = "";
3024
private String authToken = "";
3125

32-
private URI serverUri;
33-
3426
static int requestID = 0;
3527
static int rpcVersion = 1;
3628
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
3729

38-
@Autowired
39-
public OBSWebSocketClient(@Value("${obs.websocket.uri}") URI serverUri) {
40-
super(serverUri);
30+
public OBSWebSocketClient(String ipAddress, int port, String password) throws URISyntaxException {
31+
super(new URI("ws://" + ipAddress + ":" + port));
32+
log.info("OBSWebSocketClient initialised!");
33+
this.obsPassword = password;
34+
log.info("OBS Password set to {}", this.obsPassword);
4135
}
4236

4337
@Override
@@ -59,6 +53,7 @@ public void onMessage(String s) {
5953

6054
if (operation == 0) {
6155
handleAuthentication(receivedJson);
56+
log.info("Authentication successful!");
6257
}
6358
}
6459

@@ -87,8 +82,8 @@ public void stopRecording() {
8782

8883
private void handleAuthentication(JSONObject receivedJson) {
8984
JSONObject authenticationData = receivedJson.optJSONObject("d").getJSONObject("authentication");
90-
this.salt = authenticationData.getString("salt");
91-
this.challenge = authenticationData.getString("challenge");
85+
String salt = authenticationData.getString("salt");
86+
String challenge = authenticationData.getString("challenge");
9287
this.authToken = generateAuthToken(salt, challenge);
9388
log.info("Token generated :)");
9489
}
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
obs.websocket.uri=ws://localhost:4444
2-
obs.websocket.password=secret

0 commit comments

Comments
 (0)