block/unblock fixed
This commit is contained in:
@@ -1140,6 +1140,21 @@ public class ActionHandler {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
JSONObject reqTarget = new JSONObject();
|
||||
reqTarget.put("action", "get_private_chat_target");
|
||||
reqTarget.put("chat_id", chat.getId());
|
||||
|
||||
JSONObject resTarget = sendWithResponse(reqTarget);
|
||||
if (resTarget == null || !resTarget.getString("status").equals("success")) {
|
||||
System.out.println("❌ Failed to fetch target user for private chat.");
|
||||
return false;
|
||||
}
|
||||
|
||||
String otherUserId = resTarget.getJSONObject("data").getString("target_id");
|
||||
chat.setOtherUserId(UUID.fromString(otherUserId));
|
||||
|
||||
|
||||
JSONObject req = new JSONObject();
|
||||
req.put("action", "view_profile");
|
||||
req.put("target_id", chat.getOtherUserId()); // internal UUID
|
||||
@@ -1173,7 +1188,7 @@ public class ActionHandler {
|
||||
String input = scanner.nextLine();
|
||||
switch (input) {
|
||||
case "1" -> sendMessage(chat.getId(), "private");
|
||||
case "2" -> toggleBlock(chat.getId());
|
||||
case "2" -> toggleBlock(chat.getOtherUserId());
|
||||
case "3" -> {
|
||||
deleteChat(chat.getId(), false);
|
||||
return false;
|
||||
@@ -2013,6 +2028,8 @@ public class ActionHandler {
|
||||
|
||||
|
||||
private void toggleBlock(UUID userId) {
|
||||
|
||||
|
||||
JSONObject req = new JSONObject();
|
||||
req.put("action", "toggle_block");
|
||||
req.put("user_id", Session.getUserUUID());
|
||||
@@ -3142,7 +3159,7 @@ public class ActionHandler {
|
||||
|
||||
|
||||
|
||||
public void sendMessage(UUID receiverId, String receiverType) {
|
||||
public void sendMessage(UUID chatId, String receiverType) {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
|
||||
System.out.print("Enter your message: ");
|
||||
@@ -3163,11 +3180,11 @@ public class ActionHandler {
|
||||
System.out.print("File URL: ");
|
||||
String fileUrl = scanner.nextLine();
|
||||
System.out.print("File Type (IMAGE / VIDEO / FILE): ");
|
||||
String fileType = scanner.nextLine();
|
||||
String fileType = scanner.nextLine().toUpperCase();
|
||||
|
||||
JSONObject fileJson = new JSONObject();
|
||||
fileJson.put("file_url", fileUrl);
|
||||
fileJson.put("file_type", fileType.toUpperCase());
|
||||
fileJson.put("file_type", fileType);
|
||||
attachmentsArray.put(fileJson);
|
||||
|
||||
System.out.print("Add another file? (yes/no): ");
|
||||
@@ -3175,27 +3192,11 @@ public class ActionHandler {
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------ GET receiver_id if private ------------------------
|
||||
UUID actualReceiverId = receiverId;
|
||||
if (receiverType.equals("private")) {
|
||||
JSONObject req = new JSONObject();
|
||||
req.put("action", "get_or_create_private_chat");
|
||||
req.put("user1", Session.currentPrivateChatUserId.toString());
|
||||
req.put("user2", receiverId.toString());
|
||||
|
||||
JSONObject chatResponse = sendWithResponse(req);
|
||||
if (chatResponse == null || !chatResponse.getString("status").equals("success")) {
|
||||
System.out.println("❌ Failed to fetch private chat ID.");
|
||||
return;
|
||||
}
|
||||
actualReceiverId = UUID.fromString(chatResponse.getJSONObject("data").getString("chat_id"));
|
||||
}
|
||||
|
||||
// ------------------------ SEND MESSAGE ------------------------
|
||||
// 🔹 فقط ارسال پیام با chat_id و receiver_type
|
||||
JSONObject messageJson = new JSONObject();
|
||||
messageJson.put("action", "send_message");
|
||||
messageJson.put("receiver_type", receiverType);
|
||||
messageJson.put("receiver_id", actualReceiverId.toString());
|
||||
messageJson.put("receiver_id", chatId.toString());
|
||||
messageJson.put("content", content);
|
||||
messageJson.put("message_type", messageType);
|
||||
|
||||
@@ -3216,6 +3217,7 @@ public class ActionHandler {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -258,25 +258,18 @@ public class MessageDatabase {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<Message> privateChatHistory(UUID user1, UUID user2) {
|
||||
public static List<Message> privateChatHistory(UUID chatId) {
|
||||
List<Message> result = new ArrayList<>();
|
||||
String sql = """
|
||||
SELECT * FROM messages
|
||||
WHERE receiver_type = 'private'
|
||||
AND (
|
||||
(sender_id = ? AND receiver_id = ?)
|
||||
OR (sender_id = ? AND receiver_id = ?)
|
||||
)
|
||||
AND receiver_id = ?
|
||||
ORDER BY send_at
|
||||
""";
|
||||
|
||||
try (Connection conn = ConnectionDb.connect();
|
||||
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||
stmt.setObject(1, user1);
|
||||
stmt.setObject(2, user2);
|
||||
stmt.setObject(3, user2);
|
||||
stmt.setObject(4, user1);
|
||||
|
||||
stmt.setObject(1, chatId);
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
while (rs.next()) {
|
||||
result.add(extractMessage(rs));
|
||||
@@ -289,6 +282,7 @@ public class MessageDatabase {
|
||||
|
||||
|
||||
|
||||
|
||||
public static List<Message> groupChatHistory(UUID groupId) {
|
||||
List<Message> result = new ArrayList<>();
|
||||
String sql = """
|
||||
|
||||
@@ -164,13 +164,12 @@ public class ClientHandler implements Runnable {
|
||||
User otherUser = userDatabase.findByInternalUUID(otherId);
|
||||
if (otherUser == null) continue;
|
||||
|
||||
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTimeBetween(
|
||||
currentUser.getInternal_uuid(), otherId, "private"
|
||||
);
|
||||
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTime(chat.getChat_id(), "private");
|
||||
|
||||
|
||||
ChatEntry entry = new ChatEntry(
|
||||
chat.getChat_id(), // 🔹 real private chat_id
|
||||
otherUser.getUser_id(), // نمایش عمومی طرف مقابل
|
||||
chat.getChat_id(),
|
||||
otherUser.getUser_id(),
|
||||
otherUser.getProfile_name(),
|
||||
otherUser.getImage_url(),
|
||||
"private",
|
||||
@@ -690,13 +689,12 @@ public class ClientHandler implements Runnable {
|
||||
User otherUser = userDatabase.findByInternalUUID(otherId);
|
||||
if (otherUser == null) continue;
|
||||
|
||||
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTimeBetween(
|
||||
currentUser.getInternal_uuid(), otherId, "private"
|
||||
);
|
||||
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTime(chat.getChat_id(), "private");
|
||||
|
||||
|
||||
ChatEntry entry = new ChatEntry(
|
||||
chat.getChat_id(), // 🔹 real private chat_id
|
||||
otherUser.getUser_id(), // نمایش عمومی طرف مقابل
|
||||
chat.getChat_id(),
|
||||
otherUser.getUser_id(),
|
||||
otherUser.getProfile_name(),
|
||||
otherUser.getImage_url(),
|
||||
"private",
|
||||
@@ -1260,16 +1258,17 @@ public class ClientHandler implements Runnable {
|
||||
|
||||
switch (receiverType) {
|
||||
case "private" -> {
|
||||
List<UUID> members = PrivateChatDatabase.getMembers(UUID.fromString(receiverId));
|
||||
if (members.size() != 2) {
|
||||
response = new ResponseModel("error", "Invalid private chat.");
|
||||
UUID chatId = UUID.fromString(receiverId);
|
||||
List<UUID> members = PrivateChatDatabase.getMembers(chatId);
|
||||
if (!members.contains(currentUser.getInternal_uuid())) {
|
||||
response = new ResponseModel("error", "You're not a member of this private chat.");
|
||||
break;
|
||||
}
|
||||
|
||||
UUID otherUserId = members.get(0).equals(currentUser.getInternal_uuid()) ? members.get(1) : members.get(0);
|
||||
messages = MessageDatabase.privateChatHistory(currentUser.getInternal_uuid(), otherUserId);
|
||||
messages = MessageDatabase.privateChatHistory(chatId);
|
||||
}
|
||||
|
||||
|
||||
case "group" -> {
|
||||
Group group = GroupDatabase.findByInternalUUID(UUID.fromString(receiverId));
|
||||
if (group == null) {
|
||||
@@ -2083,6 +2082,8 @@ public class ClientHandler implements Runnable {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private ResponseModel handleSendMessage(JSONObject json) {
|
||||
try {
|
||||
if (currentUser == null)
|
||||
@@ -2093,12 +2094,8 @@ public class ClientHandler implements Runnable {
|
||||
String receiverType = json.getString("receiver_type");
|
||||
UUID receiverId;
|
||||
|
||||
if (receiverType.equals("private")) {
|
||||
UUID receiverUserId = UUID.fromString(json.getString("receiver_user_id"));
|
||||
receiverId = PrivateChatDatabase.getOrCreateChat(senderId, receiverUserId);
|
||||
} else {
|
||||
receiverId = UUID.fromString(json.getString("receiver_id")); // group یا channel
|
||||
}
|
||||
receiverId = UUID.fromString(json.getString("receiver_id"));
|
||||
|
||||
String content = json.optString("content", "");
|
||||
String messageType = json.optString("message_type", "TEXT");
|
||||
|
||||
@@ -2123,15 +2120,13 @@ public class ClientHandler implements Runnable {
|
||||
return new ResponseModel("error", "Message inserted but failed to attach files.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Send real-time message
|
||||
Message msg = new Message(messageId, senderId, receiverId, receiverType, content, messageType, LocalDateTime.now());
|
||||
List<UUID> receivers = getReceiversForChat(receiverId, receiverType);
|
||||
receivers.remove(senderId);
|
||||
|
||||
RealTimeEventDispatcher.sendNewMessage(msg, receivers);
|
||||
|
||||
|
||||
// Update chat list (last_message_time)
|
||||
JSONObject chatUpdate = new JSONObject();
|
||||
chatUpdate.put("chat_id", receiverId.toString());
|
||||
chatUpdate.put("chat_type", receiverType);
|
||||
@@ -2145,7 +2140,6 @@ public class ClientHandler implements Runnable {
|
||||
RealTimeEventDispatcher.sendToUser(receiver, chatPayload);
|
||||
}
|
||||
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("message_id", messageId.toString());
|
||||
return new ResponseModel("success", "Message sent successfully.", data);
|
||||
@@ -2156,6 +2150,7 @@ public class ClientHandler implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private List<UUID> getReceiversForChat(UUID receiverId, String receiverType) {
|
||||
switch (receiverType) {
|
||||
case "private":
|
||||
|
||||
Reference in New Issue
Block a user