feat: add PlayroomWebSocketHandler
All checks were successful
dev middleware install / deploy (push) Successful in 52s
All checks were successful
dev middleware install / deploy (push) Successful in 52s
This commit is contained in:
@@ -14,7 +14,9 @@ import org.springframework.web.socket.WebSocketSession;
|
||||
import org.springframework.web.socket.handler.TextWebSocketHandler;
|
||||
import xin.merlin.myplayerbackend.config.RabbitMQConfig;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Set;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@@ -32,7 +34,7 @@ public class PlayroomWebSocketHandler extends TextWebSocketHandler {
|
||||
@Override
|
||||
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
|
||||
Integer userId = (Integer) session.getAttributes().get("id");
|
||||
String payload = "{\"cmd\": \"PING\", \"to\": "+ userId +", \"time\":\""+ LocalDateTime.now() +"\"}";
|
||||
String payload = "{\"cmd\": \"PING\", \"to\": "+ userId +", \"time\":\""+ LocalDateTime.now() +"\", \"playroom\":"+ session.getAttributes().get("r_id")+ "}";
|
||||
sessionManager.addSession(userId, session);
|
||||
rabbitTemplate.convertAndSend(RabbitMQConfig.WS_VIDEO_QUEUE,payload);
|
||||
}
|
||||
@@ -42,18 +44,53 @@ public class PlayroomWebSocketHandler extends TextWebSocketHandler {
|
||||
JSONObject payload = JSONObject.parseObject(message.getPayload());
|
||||
Integer userId = (Integer) session.getAttributes().get("id");
|
||||
if(payload.get("cmd").equals("PONG")) {
|
||||
if(Boolean.TRUE.equals(redis.opsForSet().isMember(IN_ROOM_BASE_KEY + session.getAttributes().get("r_id") + ":", String.valueOf(userId)))){
|
||||
if(Boolean.TRUE.equals(redis.opsForSet().isMember(IN_ROOM_BASE_KEY + session.getAttributes().get("r_id"), String.valueOf(userId)))){
|
||||
return;
|
||||
}
|
||||
redis.opsForSet().add(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id")+":", String.valueOf(userId));
|
||||
redis.opsForSet().add(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"), String.valueOf(userId));
|
||||
}
|
||||
if (payload.get("cmd").equals("VIDEO_SYNC")){
|
||||
String url = payload.getString("url");
|
||||
String timestamp = payload.getString("timestamp");
|
||||
// Integer playroom = (Integer) session.getAttributes().get("r_id");
|
||||
String sending = "{\"cmd\": \"VIDEO_SYNC\", \"from\": "+
|
||||
userId
|
||||
+", \"time\":\""+
|
||||
LocalDateTime.now()
|
||||
+"\", \"url\":\""+
|
||||
url
|
||||
+"\", \"timestamp\":\""+
|
||||
timestamp
|
||||
+"\", \"playroom\":"+
|
||||
session.getAttributes().get("r_id")
|
||||
+"}";
|
||||
Set<String> members = redis.opsForSet().members(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"));
|
||||
try {
|
||||
for (String member : members) {
|
||||
sessionManager.sendToUser(Integer.valueOf(member),sending);
|
||||
}
|
||||
} catch (IOException | NumberFormatException e) {
|
||||
log.error(e.getMessage());
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
if(payload.get("cmd").equals("VIDEO_PLAY") || payload.get("cmd").equals("VIDEO_PAUSE")){
|
||||
Set<String> members = redis.opsForSet().members(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"));
|
||||
try {
|
||||
for (String member : members) {
|
||||
sessionManager.sendToUser(Integer.valueOf(member),message.getPayload());
|
||||
}
|
||||
} catch (IOException | NumberFormatException e) {
|
||||
log.error(e.getMessage());
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
|
||||
Integer userId = (Integer) session.getAttributes().get("id");
|
||||
redis.opsForSet().remove(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id")+":", userId.toString());
|
||||
redis.opsForSet().remove(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"), userId.toString());
|
||||
sessionManager.removeSession(userId);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user