From 3211c642f519de173c675cc0052c6cdc2ea54a67 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 19 Mar 2024 21:27:43 +0100 Subject: [PATCH] feat: receive match record --- .../titionfire/ffsaf/net2/packet/RFile.java | 42 +++++++++ .../ffsaf/net2/packet/RegisterAction.java | 1 + .../fr/titionfire/ffsaf/ws/FileSocket.java | 86 ++++++++++++------- .../src/pages/club/member/NewMemberPage.jsx | 1 - 4 files changed, 100 insertions(+), 30 deletions(-) create mode 100644 src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java diff --git a/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java b/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java new file mode 100644 index 0000000..48b885f --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/net2/packet/RFile.java @@ -0,0 +1,42 @@ +package fr.titionfire.ffsaf.net2.packet; + +import fr.titionfire.ffsaf.ws.FileSocket; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; + +import java.util.HashMap; +import java.util.UUID; + +@ApplicationScoped +public class RFile { + private static final Logger LOGGER = Logger.getLogger(RFile.class); + + final IAction requestSend = (client_Thread, message) -> { + try { + switch (message.data().get("type").asText()) { + case "match": + String code = UUID.randomUUID() + "-" + UUID.randomUUID(); + + FileSocket.FileRecv fileRecv = new FileSocket.FileRecv(message.data().get("name").asText(), null, null, + System.currentTimeMillis()); + FileSocket.sessions.put(code, fileRecv); + + client_Thread.sendRepTo(code, message); + break; + default: + client_Thread.sendErrTo("", message); + break; + + } + } catch (Throwable e) { + LOGGER.error(e.getMessage(), e); + client_Thread.sendErrTo(e.getMessage(), message); + } + }; + + public static void register(HashMap iMap) { + RFile rFile = new RFile(); + + iMap.put("requestSend", rFile.requestSend); + } +} diff --git a/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java b/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java index bc7fe66..3078ab9 100644 --- a/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java +++ b/src/main/java/fr/titionfire/ffsaf/net2/packet/RegisterAction.java @@ -9,5 +9,6 @@ public class RegisterAction { RComb.register(iMap); RClub.register(iMap); + RFile.register(iMap); } } diff --git a/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java b/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java index be5e725..74dbb75 100644 --- a/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java +++ b/src/main/java/fr/titionfire/ffsaf/ws/FileSocket.java @@ -6,79 +6,107 @@ import jakarta.websocket.*; import jakarta.websocket.server.PathParam; import jakarta.websocket.server.ServerEndpoint; import lombok.AllArgsConstructor; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -@ServerEndpoint("/api/ws/file/{id}") +@ServerEndpoint("/api/ws/file/{code}") @ApplicationScoped public class FileSocket { - Map sessions = new ConcurrentHashMap<>(); + private static final Logger logger = Logger.getLogger(FileSocket.class); + public static Map sessions = new ConcurrentHashMap<>(); + + @ConfigProperty(name = "upload_dir") + String media; @OnOpen - public void onOpen(Session session, @PathParam("id") String id) { + public void onOpen(Session session, @PathParam("code") String code) { try { - File file = File.createTempFile("safca-", ".tmp"); - FileRecv fileRecv = new FileRecv(file, new FileOutputStream(file, true), System.currentTimeMillis(), - session); - System.out.println("File created: " + file.getAbsolutePath()); - sessions.put(id, fileRecv); + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); + fileRecv.file = new File(media, "record/" + fileRecv.name);; + fileRecv.fos = new FileOutputStream(fileRecv.file, false); + logger.info("Start reception of file: " + fileRecv.file.getAbsolutePath()); + } else { + session.close(new CloseReason(CloseReason.CloseCodes.VIOLATED_POLICY, "File not found")); + } } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } @OnClose - public void onClose(Session session, @PathParam("id") String id) { - if (sessions.containsKey(id)) { - FileRecv fileRecv = sessions.get(id); + public void onClose(Session session, @PathParam("code") String code) { + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); if (fileRecv.fos != null) { try { fileRecv.fos.close(); } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } + logger.info("File received: " + fileRecv.file.getAbsolutePath()); } - sessions.remove(id); + sessions.remove(code); } @OnError - public void onError(Session session, @PathParam("id") String id, Throwable throwable) { - if (sessions.containsKey(id)) { - FileRecv fileRecv = sessions.get(id); + public void onError(Session session, @PathParam("code") String code, Throwable throwable) { + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); if (fileRecv.fos != null) { try { fileRecv.fos.close(); + if (fileRecv.file.exists()) { + //noinspection ResultOfMethodCallIgnored + fileRecv.file.delete(); + } } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } } - sessions.remove(id); + sessions.remove(code); + logger.error("Error on file reception: " + throwable.getMessage()); + } + + + + @OnMessage + public void onMessage(String message, @PathParam("code") String code) { + System.out.println("Received: " + message); } @OnMessage - public void onMessage(String message, @PathParam("id") String id) { - if (sessions.containsKey(id)) { - FileRecv fileRecv = sessions.get(id); + public void onMessage(byte[] data, @PathParam("code") String code) { + if (sessions.containsKey(code)) { + FileRecv fileRecv = sessions.get(code); try { - fileRecv.fos.write(message.getBytes()); + fileRecv.fos.write(data); } catch (IOException e) { - e.printStackTrace(); + StringWriter errors = new StringWriter(); + e.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); } } } @AllArgsConstructor @RegisterForReflection - class FileRecv { + public static class FileRecv { + String name; File file; FileOutputStream fos; long time; - Session session; } } diff --git a/src/main/webapp/src/pages/club/member/NewMemberPage.jsx b/src/main/webapp/src/pages/club/member/NewMemberPage.jsx index aaddd9b..b3d588f 100644 --- a/src/main/webapp/src/pages/club/member/NewMemberPage.jsx +++ b/src/main/webapp/src/pages/club/member/NewMemberPage.jsx @@ -3,7 +3,6 @@ import {useLoadingSwitcher} from "../../../hooks/useLoading.jsx"; import {apiAxios} from "../../../utils/Tools.js"; import {toast} from "react-toastify"; import {BirthDayField, OptionField, TextField} from "../../../components/MemberCustomFiels.jsx"; -import {ClubSelect} from "../../../components/ClubSelect.jsx"; import {addPhoto} from "../../admin/member/InformationForm.jsx"; export function NewMemberPage() {