From 297696fba1fd840915b489a3efc22e04e8594e83 Mon Sep 17 00:00:00 2001 From: Partow Roshani Date: Fri, 5 Sep 2025 01:17:52 +0330 Subject: [PATCH] Manage block list --- .../Database/ContactDatabase.java | 31 ++++++++++ .../Server/ClientHandler.java | 27 +++++++++ .../UI/ChatPageController.java | 57 ++++++++++++++++++- .../UI/MainController.java | 4 ++ 4 files changed, 117 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/to/telegramfinalproject/Database/ContactDatabase.java b/src/main/java/org/to/telegramfinalproject/Database/ContactDatabase.java index e10c899..051475d 100644 --- a/src/main/java/org/to/telegramfinalproject/Database/ContactDatabase.java +++ b/src/main/java/org/to/telegramfinalproject/Database/ContactDatabase.java @@ -127,6 +127,37 @@ public class ContactDatabase { return out; } + public static UUID findOtherUserInPrivateChat(UUID chatId, UUID viewerId) { + if (chatId == null || viewerId == null) return null; + + final String sql = """ + SELECT user1_id, user2_id + FROM private_chat + WHERE chat_id = ? + """; + + try (Connection cn = getConnection(); + PreparedStatement ps = cn.prepareStatement(sql)) { + + ps.setObject(1, chatId); + try (ResultSet rs = ps.executeQuery()) { + if (!rs.next()) return null; + + UUID u1 = (UUID) rs.getObject("user1_id"); + UUID u2 = (UUID) rs.getObject("user2_id"); + + if (viewerId.equals(u1)) return u2; + if (viewerId.equals(u2)) return u1; + + // اگر viewer عضو این چت نیست + return null; + } + } catch (SQLException e) { + e.printStackTrace(); + return null; + } + } + public boolean unblockContact(UUID user_id, UUID contact_id) { String sql = "UPDATE contacts SET is_blocked = FALSE WHERE user_id = ? AND contact_id = ?"; try (Connection connection = getConnection()) { diff --git a/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java b/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java index 58c31d1..f72258a 100644 --- a/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java +++ b/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java @@ -2972,6 +2972,33 @@ public class ClientHandler implements Runnable { break; } + case "check_block_status_by_chat": { + try { + UUID viewerId = UUID.fromString(requestJson.getString("viewer_id")); + UUID chatId = UUID.fromString(requestJson.getString("chat_id")); + + UUID otherId = ContactDatabase.findOtherUserInPrivateChat(chatId, viewerId); + if (otherId == null) { + response = new ResponseModel("error", "Chat not found or not private."); + break; + } + boolean blockedByMe = ContactDatabase.isBlocked(viewerId, otherId); + boolean blockedMe = ContactDatabase.isBlocked(otherId, viewerId); + + org.json.JSONObject data = new org.json.JSONObject() + .put("other_id", otherId.toString()) + .put("blocked_by_me", blockedByMe) + .put("blocked_me", blockedMe); + + response = new ResponseModel("success", "ok", data); + } catch (Exception e) { + response = new ResponseModel("error", "Invalid parameters."); + } + break; + } + + + default: response = new ResponseModel("error", "Unknown action: " + action); diff --git a/src/main/java/org/to/telegramfinalproject/UI/ChatPageController.java b/src/main/java/org/to/telegramfinalproject/UI/ChatPageController.java index 51d517e..b4eabd5 100644 --- a/src/main/java/org/to/telegramfinalproject/UI/ChatPageController.java +++ b/src/main/java/org/to/telegramfinalproject/UI/ChatPageController.java @@ -112,6 +112,10 @@ public class ChatPageController { private static final DateTimeFormatter FMT_DATE_TIME = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); private static final String YESTERDAY_LABEL = "Yesterday"; + private boolean blockedByMeFlag = false; + private boolean blockedMeFlag = false; + + // ===== state ===== private String chatName; private final ThemeManager themeManager = ThemeManager.getInstance(); @@ -809,6 +813,7 @@ public void showChat(ChatEntry entry) { } AvatarFX.circleClip(userAvatar, 36); + // حالت اولیه (بدون انتظار هدر) if ("channel".equalsIgnoreCase(entry.getType())) { boolean canPostLocal = entry.isOwner() || entry.isAdmin() @@ -824,10 +829,56 @@ public void showChat(ChatEntry entry) { // حالا هدر بیاد، دوباره نهایی‌اش می‌کنیم fetchAndRenderHeader(entry); + } + private void requestBlockStatusByChat(ChatEntry entry) { + if (entry == null || !"private".equalsIgnoreCase(entry.getType())) return; + + String viewerId = Session.getUserUUID(); // internal_uuid کاربر فعلی + if (viewerId == null || viewerId.isBlank()) return; + + JSONObject req = new JSONObject() + .put("action", "check_block_status_by_chat") + .put("viewer_id", viewerId) + .put("chat_id", entry.getId().toString()); + + new Thread(() -> { + JSONObject res = ActionHandler.sendWithResponse(req); + if (res == null || !"success".equalsIgnoreCase(res.optString("status"))) return; + + JSONObject data = res.optJSONObject("data"); + boolean blockedByMe = data != null && data.optBoolean("blocked_by_me", false); + boolean blockedMe = data != null && data.optBoolean("blocked_me", false); + + Platform.runLater(() -> applyBlockUi(blockedByMe, blockedMe)); + }).start(); + } + + private void applyBlockUi(boolean blockedByMe, boolean blockedMe) { + this.blockedByMeFlag = blockedByMe; + this.blockedMeFlag = blockedMe; + + if (blockedByMe) { + // من طرف مقابل را بلاک کرده‌ام → فقط دکمه UNBLOCK نمایش بده + if (readOnlyLabel != null) readOnlyLabel.setText(""); + applyMode(ChatViewMode.BLOCKED); + return; + } + + if (blockedMe) { + // طرف مقابل من را بلاک کرده → متن read-only مخصوص + if (readOnlyLabel != null) readOnlyLabel.setText("YOU ARE BLOCKED"); + applyMode(ChatViewMode.READ_ONLY); + return; + } + + // هیچ‌کس بلاک نکرده + applyMode(ChatViewMode.NORMAL); + } + public void showChat(ChatEntry entry, ChatViewMode mode) { this.currentChat = entry; @@ -1798,7 +1849,7 @@ private void addBubble( if (online) return "online"; LocalDateTime ts = parseWhen(lastSeenIso); - if (ts == null) return "Last seen recently"; + if (ts == null) return "last seen recently"; LocalDate today = LocalDate.now(); LocalDate d = ts.toLocalDate(); @@ -1811,7 +1862,7 @@ private void addBubble( if (days > 30) { return "Last seen long time ago"; } - return "Last seen recently"; + return "last seen recently"; } private void setDefaultHeaderAvatarByType(String type){ @@ -2537,4 +2588,6 @@ private void addBubble( + + } diff --git a/src/main/java/org/to/telegramfinalproject/UI/MainController.java b/src/main/java/org/to/telegramfinalproject/UI/MainController.java index a1189f5..0c135cb 100644 --- a/src/main/java/org/to/telegramfinalproject/UI/MainController.java +++ b/src/main/java/org/to/telegramfinalproject/UI/MainController.java @@ -38,6 +38,9 @@ public class MainController { @FXML private ScrollPane globalSearchScroll; @FXML private VBox globalSearchResultsContainer; + private boolean blockedByMeFlag = false; + private boolean blockedMeFlag = false; + @@ -1154,4 +1157,5 @@ public class MainController { + } \ No newline at end of file