Manage block list
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user