aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java
diff options
context:
space:
mode:
authorZhongheng Liu <z.liu@outlook.com.gr>2023-12-21 12:32:56 +0200
committerZhongheng Liu <z.liu@outlook.com.gr>2023-12-21 12:32:56 +0200
commitfe8af0fedfed569b565bbabe81b576fe2526806c (patch)
treec623668e10e964305380b444f41cc6092f2cc049 /src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java
downloadepq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.tar.gz
epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.tar.bz2
epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.zip
initial commit
Diffstat (limited to 'src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java')
-rw-r--r--src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java b/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java
new file mode 100644
index 0000000..25d653d
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java
@@ -0,0 +1,71 @@
+package me.imsonmia.epqapi.messaging;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.slf4j.Logger;
+
+import jakarta.websocket.EncodeException;
+import jakarta.websocket.OnClose;
+import jakarta.websocket.OnMessage;
+import jakarta.websocket.OnOpen;
+import jakarta.websocket.Session;
+import jakarta.websocket.server.ServerEndpoint;
+import me.imsonmia.epqapi.model.ChatConvert;
+import me.imsonmia.epqapi.model.ChatMessage;
+import me.imsonmia.epqapi.repository.ChatMessageRepository;
+
+// https://www.baeldung.com/java-websockets
+@ServerEndpoint(
+ value = "/chat/{username}",
+ encoders = MessageEncoder.class,
+ decoders = MessageDecoder.class
+ )
+public class WebSocketHandler {
+ private Logger logger;
+ private ChatMessageRepository chatMessageRepository;
+ private Session session;
+ private Set<WebSocketHandler> chatEndpoints = new CopyOnWriteArraySet<>();
+ private HashMap<String, String> users = new HashMap<>();
+ @OnOpen
+ public void onOpen(Session session, String username) throws IOException {
+ this.session = session;
+ chatEndpoints.add(this);
+ users.put(session.getId(), username);
+ Message message = new Message();
+ message.setFrom(username);
+ message.setContent("Connected, hello world!");
+ broadcast(message);
+ ChatMessage cmessage = new ChatConvert().fromMessage(message);
+ chatMessageRepository.save(cmessage);
+ }
+ @OnMessage
+ public void onMessage(Session session, Message message) throws IOException {
+ message.setFrom(users.get(session.getId()));
+ broadcast(message);
+ }
+ @OnClose
+ public void onClose(Session session) throws IOException {
+ chatEndpoints.remove(this);
+ Message message = new Message();
+ message.setFrom(users.get(session.getId()));
+ message.setContent("Disconnected!");
+ broadcast(message);
+ }
+ public void broadcast(Message message) {
+ chatEndpoints.forEach(endpoint -> {
+ try {
+ endpoint.session.getBasicRemote().sendObject(message);
+ }
+ catch (IOException e) {
+ logger.info("Error sending message! IOException");
+ logger.error(null, e);
+ }
+ catch (EncodeException e) {
+ logger.info("Error sending message! EncodeException");
+ }
+ });
+ }
+}