Skip to content

Commit efc657e

Browse files
committed
Feat: implement event listeners for subscribe, unsubscribe, disconnect events for dealing user's state in session
1 parent 4cb6968 commit efc657e

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.example.plzdrawing.common.listener.websocket;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.example.plzdrawing.api.chat.repository.ChatPresenceRepository;
5+
import org.springframework.context.ApplicationListener;
6+
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
7+
import org.springframework.stereotype.Component;
8+
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
9+
10+
@Component
11+
@RequiredArgsConstructor
12+
public class ChatDisconnectEventListener implements ApplicationListener<SessionDisconnectEvent> {
13+
14+
private final ChatPresenceRepository chatPresenceRepository;
15+
16+
@Override
17+
public void onApplicationEvent(SessionDisconnectEvent event) {
18+
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
19+
Long memberId = Long.parseLong(accessor.getFirstNativeHeader("memberId"));
20+
chatPresenceRepository.removeActive(memberId);
21+
}
22+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.example.plzdrawing.common.listener.websocket;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.example.plzdrawing.api.chat.repository.ChatPresenceRepository;
5+
import org.example.plzdrawing.api.chatRoom.repository.UnreadCountRepository;
6+
import org.example.plzdrawing.util.websocket.MessagePublisher;
7+
import org.springframework.context.ApplicationListener;
8+
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.web.socket.messaging.SessionSubscribeEvent;
11+
12+
@Component
13+
@RequiredArgsConstructor
14+
public class ChatSubscriptionEventListener implements ApplicationListener<SessionSubscribeEvent> {
15+
16+
private final ChatPresenceRepository chatPresenceRepository;
17+
private final UnreadCountRepository unreadCountRepository;
18+
private final MessagePublisher messagePublisher;
19+
20+
@Override
21+
public void onApplicationEvent(SessionSubscribeEvent event) {
22+
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
23+
String destination = accessor.getDestination();
24+
if (destination.startsWith("/topic/join/")) {
25+
String chatRoomId = destination.substring("/topic/join/".length());
26+
27+
Long memberId = Long.parseLong(accessor.getFirstNativeHeader("memberId"));
28+
chatPresenceRepository.setActive(chatRoomId, memberId);
29+
unreadCountRepository.resetUnreadCount(chatRoomId, memberId);
30+
31+
messagePublisher.removeUnreadCheck(chatRoomId, memberId);
32+
}
33+
}
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.example.plzdrawing.common.listener.websocket;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.example.plzdrawing.api.chat.repository.ChatPresenceRepository;
5+
import org.springframework.context.ApplicationListener;
6+
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
7+
import org.springframework.stereotype.Component;
8+
import org.springframework.web.socket.messaging.SessionUnsubscribeEvent;
9+
10+
@Component
11+
@RequiredArgsConstructor
12+
public class ChatUnsubscribeEventListener implements ApplicationListener<SessionUnsubscribeEvent> {
13+
14+
private final ChatPresenceRepository chatPresenceRepository;
15+
16+
@Override
17+
public void onApplicationEvent(SessionUnsubscribeEvent event) {
18+
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
19+
String destination = accessor.getDestination();
20+
if (destination.startsWith("/topic/join/")) {
21+
Long memberId = Long.parseLong(accessor.getFirstNativeHeader("memberId"));
22+
chatPresenceRepository.removeActive(memberId);
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)