Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ public String serialize(FriendListResponseEvent value) {
entryJson.put("nickname", entry.nickname != null ? entry.nickname : JSONObject.NULL);
entryJson.put("isBest", entry.isBest);
entryJson.put("isOnline", entry.isOnline);
entryJson.put("lastSeen", entry.lastSeen);
entryJson.put("friendSince", entry.friendSince);
entryJson.put("server", entry.server != null ? entry.server : JSONObject.NULL);
friendsArray.put(entryJson);
}
json.put("friends", friendsArray);
Expand All @@ -71,7 +74,10 @@ public FriendListResponseEvent deserialize(String json) {
entryJson.getString("name"),
entryJson.isNull("nickname") ? null : entryJson.getString("nickname"),
entryJson.getBoolean("isBest"),
entryJson.getBoolean("isOnline")
entryJson.getBoolean("isOnline"),
entryJson.optLong("lastSeen", 0L),
entryJson.optLong("friendSince", 0L),
entryJson.isNull("server") ? null : entryJson.getString("server")
));
}

Expand All @@ -98,13 +104,19 @@ public static class FriendListEntry {
private final String nickname;
private final boolean isBest;
private final boolean isOnline;
private final long lastSeen;
private final long friendSince;
private final String server;

public FriendListEntry(UUID uuid, String name, String nickname, boolean isBest, boolean isOnline) {
public FriendListEntry(UUID uuid, String name, String nickname, boolean isBest, boolean isOnline, long lastSeen, long friendSince, String server) {
this.uuid = uuid;
this.name = name;
this.nickname = nickname;
this.isBest = isBest;
this.isOnline = isOnline;
this.lastSeen = lastSeen;
this.friendSince = friendSince;
this.server = server;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package net.swofty.commons.presence;

import lombok.Getter;
import net.swofty.commons.protocol.Serializer;
import org.json.JSONObject;

import java.util.UUID;

@Getter
public class PresenceInfo {
private final UUID uuid;
private final boolean online;
private final String serverType;
private final String serverId;
private final long lastSeen;

public PresenceInfo(UUID uuid, boolean online, String serverType, String serverId, long lastSeen) {
this.uuid = uuid;
this.online = online;
this.serverType = serverType;
this.serverId = serverId;
this.lastSeen = lastSeen;
}

public static Serializer<PresenceInfo> getSerializer() {
return new Serializer<>() {
@Override
public String serialize(PresenceInfo value) {
JSONObject json = new JSONObject();
json.put("uuid", value.uuid.toString());
json.put("online", value.online);
json.put("serverType", value.serverType != null ? value.serverType : JSONObject.NULL);
json.put("serverId", value.serverId != null ? value.serverId : JSONObject.NULL);
json.put("lastSeen", value.lastSeen);
return json.toString();
}

@Override
public PresenceInfo deserialize(String json) {
JSONObject jsonObject = new JSONObject(json);
return new PresenceInfo(
UUID.fromString(jsonObject.getString("uuid")),
jsonObject.getBoolean("online"),
jsonObject.isNull("serverType") ? null : jsonObject.getString("serverType"),
jsonObject.isNull("serverId") ? null : jsonObject.getString("serverId"),
jsonObject.getLong("lastSeen")
);
}

@Override
public PresenceInfo clone(PresenceInfo value) {
return new PresenceInfo(value.uuid, value.online, value.serverType, value.serverId, value.lastSeen);
}
};
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package net.swofty.commons.protocol.objects.presence;

import net.swofty.commons.presence.PresenceInfo;
import net.swofty.commons.protocol.ProtocolObject;
import net.swofty.commons.protocol.Serializer;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class GetPresenceBulkProtocolObject extends ProtocolObject<
GetPresenceBulkProtocolObject.GetPresenceBulkMessage,
GetPresenceBulkProtocolObject.GetPresenceBulkResponse> {

@Override
public Serializer<GetPresenceBulkMessage> getSerializer() {
return new Serializer<>() {
@Override
public String serialize(GetPresenceBulkMessage value) {
JSONArray array = new JSONArray();
for (UUID uuid : value.uuids) {
array.put(uuid.toString());
}
JSONObject json = new JSONObject();
json.put("uuids", array);
return json.toString();
}

@Override
public GetPresenceBulkMessage deserialize(String json) {
JSONObject obj = new JSONObject(json);
JSONArray array = obj.getJSONArray("uuids");
List<UUID> ids = new ArrayList<>();
for (int i = 0; i < array.length(); i++) {
ids.add(UUID.fromString(array.getString(i)));
}
return new GetPresenceBulkMessage(ids);
}

@Override
public GetPresenceBulkMessage clone(GetPresenceBulkMessage value) {
return new GetPresenceBulkMessage(new ArrayList<>(value.uuids));
}
};
}

@Override
public Serializer<GetPresenceBulkResponse> getReturnSerializer() {
return new Serializer<>() {
@Override
public String serialize(GetPresenceBulkResponse value) {
JSONArray array = new JSONArray();
for (PresenceInfo info : value.presence()) {
array.put(new JSONObject(PresenceInfo.getSerializer().serialize(info)));
}
JSONObject json = new JSONObject();
json.put("presence", array);
return json.toString();
}

@Override
public GetPresenceBulkResponse deserialize(String json) {
JSONObject obj = new JSONObject(json);
JSONArray array = obj.getJSONArray("presence");
List<PresenceInfo> presence = new ArrayList<>();
for (int i = 0; i < array.length(); i++) {
presence.add(PresenceInfo.getSerializer().deserialize(array.getJSONObject(i).toString()));
}
return new GetPresenceBulkResponse(presence);
}

@Override
public GetPresenceBulkResponse clone(GetPresenceBulkResponse value) {
return new GetPresenceBulkResponse(new ArrayList<>(value.presence()));
}
};
}

public record GetPresenceBulkMessage(List<UUID> uuids) {}

public record GetPresenceBulkResponse(List<PresenceInfo> presence) {}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package net.swofty.commons.protocol.objects.presence;

import net.swofty.commons.presence.PresenceInfo;
import net.swofty.commons.protocol.ProtocolObject;
import net.swofty.commons.protocol.Serializer;
import org.json.JSONObject;

public class UpdatePresenceProtocolObject extends ProtocolObject<
UpdatePresenceProtocolObject.UpdatePresenceMessage,
UpdatePresenceProtocolObject.UpdatePresenceResponse> {

@Override
public Serializer<UpdatePresenceMessage> getSerializer() {
return new Serializer<>() {
@Override
public String serialize(UpdatePresenceMessage value) {
JSONObject json = new JSONObject();
json.put("presence", new JSONObject(PresenceInfo.getSerializer().serialize(value.presence())));
return json.toString();
}

@Override
public UpdatePresenceMessage deserialize(String json) {
JSONObject obj = new JSONObject(json);
PresenceInfo presence = PresenceInfo.getSerializer().deserialize(obj.getJSONObject("presence").toString());
return new UpdatePresenceMessage(presence);
}

@Override
public UpdatePresenceMessage clone(UpdatePresenceMessage value) {
return new UpdatePresenceMessage(value.presence());
}
};
}

@Override
public Serializer<UpdatePresenceResponse> getReturnSerializer() {
return new Serializer<>() {
@Override
public String serialize(UpdatePresenceResponse value) {
return value.success ? "true" : "false";
}

@Override
public UpdatePresenceResponse deserialize(String json) {
return new UpdatePresenceResponse(Boolean.parseBoolean(json));
}

@Override
public UpdatePresenceResponse clone(UpdatePresenceResponse value) {
return new UpdatePresenceResponse(value.success);
}
};
}

public record UpdatePresenceMessage(PresenceInfo presence) {}

public record UpdatePresenceResponse(boolean success) {}
}

Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,42 @@ public static void sendMessageToService(ServiceType service,
specification.channel(), message).toJSON().toString());
}

/**
* Fire-and-forget: send to a service and do not wait for or register a response.
*/
public static void sendMessageToServiceFireAndForget(ServiceType service,
ProtocolObject specification,
Object rawMessage) {
UUID requestId = UUID.randomUUID();
String callback = null;
try {
callback = RedisAPI.getInstance().getFilterId();
} catch (Exception ignored) {
}

String message = specification.translateToString(rawMessage);
RedisAPI.getInstance().publishMessage(
service.name(),
ChannelRegistry.getFromName(specification.channel()),
new ServiceProxyRequest(
requestId,
callback != null ? callback : "proxy",
specification.channel(),
message
).toJSON().toString()
);
}

/**
* Fire-and-forget broadcast to all service types.
*/
public static void sendMessageToAllServicesFireAndForget(ProtocolObject specification,
Object rawMessage) {
for (ServiceType serviceType : ServiceType.values()) {
sendMessageToServiceFireAndForget(serviceType, specification, rawMessage);
}
}

private static String getRequestTypeName(ProtocolObject<?, ?> protocolObject) {
Class<?> clazz = protocolObject.getClass();
Type genericSuperclass = clazz.getGenericSuperclass();
Expand Down
Loading