mirror of
https://github.com/Qortal/qortal.git
synced 2025-03-30 09:05:52 +00:00
Allow PresenceType filtering on presence websocket via presenceType query param
This commit is contained in:
parent
7cbdbbcc8d
commit
688f215dfd
@ -79,6 +79,9 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener {
|
|||||||
/** Outer map key is PresenceType (enum), inner map key is public key in base58, inner map value is timestamp */
|
/** Outer map key is PresenceType (enum), inner map key is public key in base58, inner map value is timestamp */
|
||||||
private static final Map<PresenceType, Map<String, Long>> currentEntries = Collections.synchronizedMap(new EnumMap<>(PresenceType.class));
|
private static final Map<PresenceType, Map<String, Long>> currentEntries = Collections.synchronizedMap(new EnumMap<>(PresenceType.class));
|
||||||
|
|
||||||
|
/** (Optional) PresenceType used for filtering by that Session. */
|
||||||
|
private static final Map<Session, PresenceType> sessionPresenceTypes = Collections.synchronizedMap(new HashMap<>());
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configure(WebSocketServletFactory factory) {
|
public void configure(WebSocketServletFactory factory) {
|
||||||
factory.register(PresenceWebSocket.class);
|
factory.register(PresenceWebSocket.class);
|
||||||
@ -118,17 +121,40 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener {
|
|||||||
List<PresenceInfo> presenceInfo = Collections.singletonList(new PresenceInfo(presenceType, pubKey58, computedTimestamp));
|
List<PresenceInfo> presenceInfo = Collections.singletonList(new PresenceInfo(presenceType, pubKey58, computedTimestamp));
|
||||||
|
|
||||||
// Notify sessions
|
// Notify sessions
|
||||||
for (Session session : getSessions())
|
for (Session session : getSessions()) {
|
||||||
sendPresenceInfo(session, presenceInfo);
|
PresenceType sessionPresenceType = sessionPresenceTypes.get(session);
|
||||||
|
|
||||||
|
if (sessionPresenceType == null || sessionPresenceType == presenceType)
|
||||||
|
sendPresenceInfo(session, presenceInfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OnWebSocketConnect
|
@OnWebSocketConnect
|
||||||
@Override
|
@Override
|
||||||
public void onWebSocketConnect(Session session) {
|
public void onWebSocketConnect(Session session) {
|
||||||
|
Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap();
|
||||||
|
List<String> presenceTypes = queryParams.get("presenceType");
|
||||||
|
|
||||||
|
// We only support ONE presenceType
|
||||||
|
String presenceTypeName = presenceTypes == null || presenceTypes.isEmpty() ? null : presenceTypes.get(0);
|
||||||
|
|
||||||
|
PresenceType presenceType = presenceTypeName == null ? null : PresenceType.fromString(presenceTypeName);
|
||||||
|
|
||||||
|
// Make sure that if caller does give a presenceType, that it is a valid/known one.
|
||||||
|
if (presenceTypeName != null && presenceType == null) {
|
||||||
|
session.close(4003, "unknown presenceType: " + presenceTypeName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save session's requested PresenceType, if given
|
||||||
|
if (presenceType != null)
|
||||||
|
sessionPresenceTypes.put(session, presenceType);
|
||||||
|
|
||||||
List<PresenceInfo> presenceInfo;
|
List<PresenceInfo> presenceInfo;
|
||||||
|
|
||||||
synchronized (currentEntries) {
|
synchronized (currentEntries) {
|
||||||
presenceInfo = currentEntries.entrySet().stream()
|
presenceInfo = currentEntries.entrySet().stream()
|
||||||
|
.filter(entry -> presenceType == null ? true : entry.getKey() == presenceType)
|
||||||
.flatMap(entry -> entry.getValue().entrySet().stream().map(innerEntry -> new PresenceInfo(entry.getKey(), innerEntry.getKey(), innerEntry.getValue())))
|
.flatMap(entry -> entry.getValue().entrySet().stream().map(innerEntry -> new PresenceInfo(entry.getKey(), innerEntry.getKey(), innerEntry.getValue())))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
@ -144,6 +170,9 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener {
|
|||||||
@OnWebSocketClose
|
@OnWebSocketClose
|
||||||
@Override
|
@Override
|
||||||
public void onWebSocketClose(Session session, int statusCode, String reason) {
|
public void onWebSocketClose(Session session, int statusCode, String reason) {
|
||||||
|
// clean up
|
||||||
|
sessionPresenceTypes.remove(session);
|
||||||
|
|
||||||
super.onWebSocketClose(session, statusCode, reason);
|
super.onWebSocketClose(session, statusCode, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user