forked from Swofty-Developments/HypixelSkyBlock
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathProxyAPI.java
More file actions
90 lines (73 loc) · 3.55 KB
/
ProxyAPI.java
File metadata and controls
90 lines (73 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package net.swofty.proxyapi;
import net.swofty.proxyapi.redis.ProxyToClient;
import net.swofty.proxyapi.redis.ServiceToClient;
import net.swofty.redisapi.api.ChannelRegistry;
import net.swofty.redisapi.api.RedisAPI;
import org.json.JSONObject;
import org.tinylog.Logger;
import java.util.UUID;
public class ProxyAPI {
private final UUID serverUUID;
public ProxyAPI(String URI, UUID serverUUID) {
this.serverUUID = serverUUID;
RedisAPI.generateInstance(URI);
RedisAPI.getInstance().setFilterId(serverUUID.toString());
}
public void registerFromProxyHandler(ProxyToClient handler) {
RedisAPI.getInstance().registerChannel(handler.getChannel().getChannelName(), (event) -> {
String[] split = event.message.split("}=-=-=\\{");
UUID request = UUID.fromString(split[0].substring(split[0].indexOf(";") + 1));
String rawMessage = split[1];
JSONObject json = new JSONObject(rawMessage);
JSONObject response = handler.onMessage(json);
if (!handler.getChannel().matchesRequirementsServerSide(response)) {
Logger.error("Handler " + handler.getClass().getName());
throw new RuntimeException("Message does not match requirements for server side");
}
RedisAPI.getInstance().publishMessage(
"proxy",
ChannelRegistry.getFromName(handler.getChannel().getChannelName()),
request + "}=-=-={" + response.toString());
});
}
public void registerFromServiceHandler(ServiceToClient handler) {
RedisAPI.getInstance().registerChannel("service_" + handler.getChannel().getChannelName(), (event) -> {
String[] split = event.message.split("}=-=-=\\{");
String serviceId = split[0].substring(split[0].indexOf(";") + 1);
UUID requestId = UUID.fromString(split[1]);
String rawMessage = split[2];
JSONObject json = new JSONObject(rawMessage);
Thread.startVirtualThread(() -> {
JSONObject response = handler.onMessage(json);
// Send response back to service
RedisAPI.getInstance().publishMessage(
serviceId,
ChannelRegistry.getFromName("service_response"),
requestId + "}=-=-={" + response.toString());
});
});
RedisAPI.getInstance().registerChannel("service_broadcast_" + handler.getChannel().getChannelName(), (event) -> {
String[] split = event.message.split("}=-=-=\\{");
String serviceId = split[0].substring(split[0].indexOf(";") + 1);
UUID requestId = UUID.fromString(split[1]);
String rawMessage = split[2];
JSONObject json = new JSONObject(rawMessage);
Thread.startVirtualThread(() -> {
// Handle message
JSONObject response = handler.onMessage(json);
if (response == null) {
// Don't send a response if null
return;
}
// Send response back to service with this server's UUID
RedisAPI.getInstance().publishMessage(
serviceId,
ChannelRegistry.getFromName("service_broadcast_response"),
requestId + "}=-=-={" + serverUUID.toString() + "}=-=-={" + response.toString());
});
});
}
public void start() {
RedisAPI.getInstance().startListeners();
}
}