Skip to content

Commit 18c5c34

Browse files
committed
core: Clean Parsing and Generified messageTypes and callbacks
1 parent d59dfb2 commit 18c5c34

File tree

1 file changed

+34
-31
lines changed

1 file changed

+34
-31
lines changed

src/main/java/net/twasi/obsremotejava/OBSCommunicator.java

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ public class OBSCommunicator {
122122
private boolean debug;
123123
private final String password;
124124
private final CountDownLatch closeLatch;
125-
public final Map<String, Class> messageTypes = new HashMap<>();
125+
public final Map<String, Class<? extends ResponseBase>> messageTypes = new HashMap<>();
126126

127-
private final Map<Class, Callback> callbacks = new HashMap<>();
127+
private final Map<Class<? extends ResponseBase>, Callback> callbacks = new HashMap<>();
128128

129129
private Session session;
130130

131-
private Gson gson;
131+
private final Gson gson;
132132

133133
private Callback<GetVersionResponse> onConnect;
134134
private VoidCallback onDisconnect;
@@ -215,38 +215,41 @@ public void onMessage(String msg) {
215215
}
216216

217217
try {
218-
if (this.gson.fromJson(msg, JsonObject.class).has("message-id")) {
219-
// Response
220-
ResponseBase responseBase = this.gson.fromJson(msg, ResponseBase.class);
221-
Class type = messageTypes.get(responseBase.getMessageId());
222-
log.trace(String.format("Trying to deserialize response with type %s and message '%s'", type, msg));
223-
responseBase = (ResponseBase) this.gson.fromJson(msg, type);
224-
225-
try {
226-
processIncomingResponse(responseBase, type);
218+
JsonElement jsonElement = JsonParser.parseString(msg);
219+
if (jsonElement.isJsonObject()) {
220+
JsonObject jsonObject = jsonElement.getAsJsonObject();
221+
222+
if (jsonObject.has("message-id")) {
223+
Class<? extends ResponseBase> responseType = messageTypes.get(jsonObject.get("message-id").getAsString());
224+
log.trace(String.format("Trying to deserialize response with type %s and message '%s'", responseType, msg));
225+
// Response
226+
ResponseBase responseBase = this.gson.fromJson(jsonObject, responseType);
227+
228+
try {
229+
processIncomingResponse(responseBase, responseType);
230+
}
231+
catch (Throwable t) {
232+
runOnError("Failed to process response '" + responseType.getSimpleName() + "' from websocket", t);
233+
}
227234
}
228-
catch (Throwable t) {
229-
runOnError("Failed to process response '" + type.getSimpleName() + "' from websocket", t);
235+
else if (jsonObject.has("update-type")) {
236+
try {
237+
EventType eventType = EventType.valueOf(jsonObject.get("update-type").getAsString());
238+
239+
try {
240+
processIncomingEvent(msg, eventType);
241+
}
242+
catch (Throwable t) {
243+
runOnError("Failed to execute callback for event: " + eventType, t);
244+
}
245+
}
246+
catch (IllegalArgumentException ignored) {
247+
log.trace("Unsupported Event received");
248+
}
230249
}
231-
232250
}
233251
else {
234-
JsonElement elem = JsonParser.parseString(msg);
235-
EventType eventType;
236-
237-
try {
238-
eventType = EventType.valueOf(elem.getAsJsonObject().get("update-type").getAsString());
239-
}
240-
catch (Throwable t) {
241-
return;
242-
}
243-
244-
try {
245-
processIncomingEvent(msg, eventType);
246-
}
247-
catch (Throwable t) {
248-
runOnError("Failed to execute callback for event: " + eventType, t);
249-
}
252+
throw new IllegalArgumentException("Received message is not a JsonObject");
250253
}
251254
}
252255
catch (Throwable t) {

0 commit comments

Comments
 (0)