Merge branch 'develop' into SendMessage
# Conflicts: # src/main/java/org/to/telegramfinalproject/Client/ActionHandler.java # src/main/java/org/to/telegramfinalproject/Database/MessageDatabase.java # src/main/java/org/to/telegramfinalproject/Models/ContactEntry.java # src/main/java/org/to/telegramfinalproject/Models/Message.java
This commit is contained in:
@@ -3,6 +3,7 @@ package org.to.telegramfinalproject.Client;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
import org.to.telegramfinalproject.Database.PrivateChatDatabase;
|
||||
import org.to.telegramfinalproject.Database.ContactDatabase;
|
||||
import org.to.telegramfinalproject.Models.ChatEntry;
|
||||
import org.to.telegramfinalproject.Models.ContactEntry;
|
||||
import org.to.telegramfinalproject.Models.SearchRequestModel;
|
||||
@@ -501,6 +502,10 @@ public class ActionHandler {
|
||||
entry.setOtherUserId(UUID.fromString(chat.getString("other_user_id")));
|
||||
}
|
||||
|
||||
if (chat.has("is_saved_messages")) {
|
||||
entry.setSavedMessages(chat.getBoolean("is_saved_messages"));
|
||||
}
|
||||
|
||||
chatList.add(entry);
|
||||
|
||||
}
|
||||
@@ -558,7 +563,10 @@ public class ActionHandler {
|
||||
c.getString("contact_displayId"),
|
||||
c.getString("profile_name"),
|
||||
c.optString("image_url", ""),
|
||||
c.optBoolean("is_blocked", false)
|
||||
c.optBoolean("is_blocked", false),
|
||||
c.isNull("last_seen")
|
||||
? null
|
||||
: LocalDateTime.parse(c.getString("last_seen"))
|
||||
);
|
||||
Session.contactEntries.add(entry);
|
||||
}
|
||||
@@ -839,7 +847,8 @@ public class ActionHandler {
|
||||
System.out.println("3. Create Channel");
|
||||
System.out.println("4. Create group");
|
||||
System.out.println("5. View contacts");
|
||||
System.out.println("6. Logout");
|
||||
System.out.println("6. Show sidebar menu");
|
||||
System.out.println("7. Logout");
|
||||
System.out.print("Choose an option: ");
|
||||
String choice = scanner.nextLine();
|
||||
|
||||
@@ -853,7 +862,8 @@ public class ActionHandler {
|
||||
case "3" -> createChannel();
|
||||
case "4" -> createGroup();
|
||||
case "5" -> showContactList();
|
||||
case "6" -> {
|
||||
case "6" -> showSidebarMenu();
|
||||
case "7" -> {
|
||||
logout();
|
||||
return;
|
||||
}
|
||||
@@ -862,119 +872,10 @@ public class ActionHandler {
|
||||
}
|
||||
}
|
||||
|
||||
public void showContactList() {
|
||||
List<ContactEntry> contacts = Session.contactEntries;
|
||||
if (contacts.isEmpty()) {
|
||||
System.out.println("📭 You have no contacts.");
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("👥 Your Contacts:");
|
||||
for (int i = 0; i < contacts.size(); i++) {
|
||||
System.out.println((i + 1) + ". " + contacts.get(i));
|
||||
}
|
||||
|
||||
System.out.print("Select a contact (0 to go back): ");
|
||||
int choice = scanner.nextInt();
|
||||
scanner.nextLine();
|
||||
|
||||
if (choice == 0) return;
|
||||
if (choice < 1 || choice > contacts.size()) {
|
||||
System.out.println("❌ Invalid choice.");
|
||||
return;
|
||||
}
|
||||
|
||||
ContactEntry selected = contacts.get(choice - 1);
|
||||
System.out.println("\n📇 What do you want to do with " + selected.getProfileName() + "?");
|
||||
System.out.println("1. View Profile");
|
||||
System.out.println("2. Send Message");
|
||||
System.out.print("Enter your choice: ");
|
||||
int action = scanner.nextInt();
|
||||
scanner.nextLine();
|
||||
|
||||
switch (action) {
|
||||
case 1 -> viewProfile(selected.getContactId());
|
||||
case 2 -> startPrivateChat(selected);
|
||||
default -> System.out.println("❌ Invalid option.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// public void showContactList() {
|
||||
// System.out.println("1. View All Contacts");
|
||||
// System.out.println("2. Search Contacts");
|
||||
// System.out.println("Choose an option: (0 to go back)");
|
||||
// int option = scanner.nextInt();
|
||||
// scanner.nextLine();
|
||||
//
|
||||
// // Handle invalid input
|
||||
// while (option < 0 || option > 2) {
|
||||
// System.out.println("Invalid choice. Try again: ");
|
||||
// option = scanner.nextInt();
|
||||
// scanner.nextLine();
|
||||
// }
|
||||
//
|
||||
// List<ContactEntry> contacts;
|
||||
//
|
||||
// if (option == 0) {
|
||||
// return;
|
||||
// }
|
||||
// else if (option == 1) {
|
||||
// contacts = Session.contactEntries;
|
||||
//
|
||||
// } else if (option == 2) {
|
||||
// contacts = new ArrayList<>();
|
||||
//
|
||||
// System.out.print("Enter name or user ID to search: ");
|
||||
// String searchTerm = scanner.nextLine();
|
||||
//
|
||||
// // Handle invalid input
|
||||
// while (searchTerm.isEmpty()) {
|
||||
// System.out.print("Search key can not be empty. Try again: ");
|
||||
// searchTerm = scanner.nextLine();
|
||||
// }
|
||||
//
|
||||
// // Send a request to server
|
||||
// JSONObject request = new JSONObject();
|
||||
// request.put("action", "search_contacts");
|
||||
// request.put("user_id", Session.getUserUUID());
|
||||
// request.put("search_term", searchTerm);
|
||||
//
|
||||
// JSONObject response = ActionHandler.sendWithResponse(request);
|
||||
//
|
||||
// if (!response.optString("status", "fail").equals("success")) {
|
||||
// System.out.println("Failed to search contacts: " + response.optString("message", "Unknown error"));
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// JSONObject data = response.getJSONObject("data");
|
||||
// JSONArray contactsJson = data.getJSONArray("contacts");
|
||||
//
|
||||
// for (int i = 0; i < contactsJson.length(); i++) {
|
||||
// JSONObject contact = contactsJson.getJSONObject(i);
|
||||
//
|
||||
// UUID contactId = UUID.fromString(contact.getString("contact_id"));
|
||||
// String userId = contact.getString("user_id");
|
||||
// String profileName = contact.getString("profile_name");
|
||||
// String imageUrl = contact.optString("image_url", "");
|
||||
// boolean isBlocked = contact.getBoolean("is_blocked");
|
||||
// String lastSeenString = contact.getString("last_seen");
|
||||
// LocalDateTime lastSeen = null;
|
||||
// if (lastSeenString != null) {
|
||||
// lastSeen = LocalDateTime.parse(lastSeenString);
|
||||
// }
|
||||
//
|
||||
// contacts.add(new ContactEntry(contactId, userId, profileName, imageUrl, isBlocked));
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
// System.out.println("❌ Invalid choice.");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// List<ContactEntry> contacts = Session.contactEntries;
|
||||
// if (contacts.isEmpty()) {
|
||||
// System.out.println("📭 No contacts found.");
|
||||
// System.out.println("📭 You have no contacts.");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
@@ -997,35 +898,144 @@ public class ActionHandler {
|
||||
// System.out.println("\n📇 What do you want to do with " + selected.getProfileName() + "?");
|
||||
// System.out.println("1. View Profile");
|
||||
// System.out.println("2. Send Message");
|
||||
// System.out.println("3. Remove Contact");
|
||||
// System.out.print("Enter your choice: ");
|
||||
// int action = scanner.nextInt();
|
||||
// scanner.nextLine();
|
||||
//
|
||||
// switch (action) {
|
||||
// case 1 -> viewProfile(selected.getContactId());
|
||||
// case 2 -> startPrivateChat(selected);
|
||||
// case 3 -> {
|
||||
// // Send a request to server
|
||||
// JSONObject request = new JSONObject();
|
||||
// request.put("action", "remove_contact");
|
||||
// request.put("user_id", Session.getUserUUID()); // Current user
|
||||
// request.put("contact_id", selected.getContactId().toString()); // Contact to remove
|
||||
//
|
||||
// JSONObject response = ActionHandler.sendWithResponse(request);
|
||||
//
|
||||
// if ("success".equals(response.optString("status"))) {
|
||||
// System.out.println("✅ Contact removed successfully.");
|
||||
// Session.contactEntries.remove(selected); // Remove from local session list
|
||||
// } else {
|
||||
// System.out.println("❌ Failed to remove contact: " +
|
||||
// response.optString("message", "Unknown error"));
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// default -> System.out.println("❌ Invalid option.");
|
||||
// }
|
||||
// }
|
||||
|
||||
public void showContactList() {
|
||||
System.out.println("1. View All Contacts");
|
||||
System.out.println("2. Search Contacts");
|
||||
System.out.println("Choose an option: (0 to go back)");
|
||||
int option = scanner.nextInt();
|
||||
scanner.nextLine();
|
||||
|
||||
// Handle invalid input
|
||||
while (option < 0 || option > 2) {
|
||||
System.out.println("Invalid choice. Try again: ");
|
||||
option = scanner.nextInt();
|
||||
scanner.nextLine();
|
||||
}
|
||||
|
||||
List<ContactEntry> contacts;
|
||||
|
||||
if (option == 0) {
|
||||
return;
|
||||
}
|
||||
else if (option == 1) {
|
||||
contacts = Session.contactEntries;
|
||||
|
||||
} else if (option == 2) {
|
||||
contacts = new ArrayList<>();
|
||||
|
||||
System.out.print("Enter name or user ID to search: ");
|
||||
String searchTerm = scanner.nextLine();
|
||||
|
||||
// Handle invalid input
|
||||
while (searchTerm.isEmpty()) {
|
||||
System.out.print("Search key can not be empty. Try again: ");
|
||||
searchTerm = scanner.nextLine();
|
||||
}
|
||||
|
||||
// Send a request to server
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "search_contacts");
|
||||
request.put("user_id", Session.getUserUUID());
|
||||
request.put("search_term", searchTerm);
|
||||
|
||||
JSONObject response = ActionHandler.sendWithResponse(request);
|
||||
|
||||
if (!response.optString("status", "fail").equals("success")) {
|
||||
System.out.println("Failed to search contacts: " + response.optString("message", "Unknown error"));
|
||||
return;
|
||||
}
|
||||
|
||||
JSONObject data = response.getJSONObject("data");
|
||||
JSONArray contactsJson = data.getJSONArray("contacts");
|
||||
|
||||
for (int i = 0; i < contactsJson.length(); i++) {
|
||||
JSONObject contact = contactsJson.getJSONObject(i);
|
||||
|
||||
UUID contactId = UUID.fromString(contact.getString("contact_id"));
|
||||
String userId = contact.getString("user_id");
|
||||
String contact_displayId = contact.getString("contact_display_id");
|
||||
String profileName = contact.getString("profile_name");
|
||||
String imageUrl = contact.optString("image_url", "");
|
||||
boolean isBlocked = contact.getBoolean("is_blocked");
|
||||
String lastSeenString = contact.getString("last_seen");
|
||||
LocalDateTime lastSeen = null;
|
||||
if (lastSeenString != null) {
|
||||
lastSeen = LocalDateTime.parse(lastSeenString);
|
||||
}
|
||||
|
||||
contacts.add(new ContactEntry(contactId, userId, contact_displayId, profileName, imageUrl, isBlocked, lastSeen));
|
||||
}
|
||||
|
||||
} else {
|
||||
System.out.println("❌ Invalid choice.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (contacts.isEmpty()) {
|
||||
System.out.println("📭 No contacts found.");
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("👥 Your Contacts:");
|
||||
for (int i = 0; i < contacts.size(); i++) {
|
||||
System.out.println((i + 1) + ". " + contacts.get(i));
|
||||
}
|
||||
|
||||
System.out.print("Select a contact (0 to go back): ");
|
||||
int choice = scanner.nextInt();
|
||||
scanner.nextLine();
|
||||
|
||||
if (choice == 0) return;
|
||||
if (choice < 1 || choice > contacts.size()) {
|
||||
System.out.println("❌ Invalid choice.");
|
||||
return;
|
||||
}
|
||||
|
||||
ContactEntry selected = contacts.get(choice - 1);
|
||||
System.out.println("\n📇 What do you want to do with " + selected.getProfileName() + "?");
|
||||
System.out.println("1. View Profile");
|
||||
System.out.println("2. Send Message");
|
||||
System.out.println("3. Remove Contact");
|
||||
System.out.print("Enter your choice: ");
|
||||
int action = scanner.nextInt();
|
||||
scanner.nextLine();
|
||||
|
||||
switch (action) {
|
||||
case 1 -> viewProfile(selected.getContactId());
|
||||
case 2 -> startPrivateChat(selected);
|
||||
case 3 -> {
|
||||
// Send a request to server
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "remove_contact");
|
||||
request.put("user_id", Session.getUserUUID()); // Current user
|
||||
request.put("contact_id", selected.getContactId().toString()); // Contact to remove
|
||||
|
||||
JSONObject response = ActionHandler.sendWithResponse(request);
|
||||
|
||||
if ("success".equals(response.optString("status"))) {
|
||||
System.out.println("✅ Contact removed successfully.");
|
||||
Session.contactEntries.remove(selected); // Remove from local session list
|
||||
} else {
|
||||
System.out.println("❌ Failed to remove contact: " +
|
||||
response.optString("message", "Unknown error"));
|
||||
}
|
||||
}
|
||||
|
||||
default -> System.out.println("❌ Invalid option.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void viewProfile(UUID targetId) {
|
||||
JSONObject req = new JSONObject();
|
||||
@@ -1129,13 +1139,35 @@ public class ActionHandler {
|
||||
System.out.println("\nYour Chats:");
|
||||
System.out.println("0. 📦 Archived Chats");
|
||||
|
||||
// Track index dynamically
|
||||
int index = 1;
|
||||
|
||||
// Check if Saved Messages exists in the list
|
||||
int savedMessagesIndex = -1;
|
||||
for (int i = 0; i < Session.activeChats.size(); i++) {
|
||||
ChatEntry entry = Session.activeChats.get(i);
|
||||
|
||||
if (entry.isSavedMessages()) {
|
||||
savedMessagesIndex = index;
|
||||
System.out.println(index + ". 📦 Saved Messages Chat");
|
||||
index++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Print the rest of the chats
|
||||
for (int i = 0; i < Session.activeChats.size(); i++) {
|
||||
ChatEntry entry = Session.activeChats.get(i);
|
||||
if (entry.isSavedMessages()) {
|
||||
continue; // Already printed above
|
||||
}
|
||||
|
||||
String time = (entry.getLastMessageTime() == null)
|
||||
? "No messages yet"
|
||||
: entry.getLastMessageTime().toString();
|
||||
System.out.println((i + 1) + ". [" + entry.getType() + "] " +
|
||||
System.out.println(index + ". [" + entry.getType() + "] " +
|
||||
entry.getName() + " - Last: " + time);
|
||||
index++;
|
||||
}
|
||||
|
||||
System.out.print("Select a chat by number: ");
|
||||
@@ -1146,14 +1178,33 @@ public class ActionHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
int index = choice - 1;
|
||||
if (choice == savedMessagesIndex) {
|
||||
new SidebarHandler(scanner, this).getSavedMessagesData(Session.getUserUUID());
|
||||
return;
|
||||
}
|
||||
|
||||
if (index < 0 || index >= Session.activeChats.size()) {
|
||||
// Adjust for Saved Messages if it was in the list
|
||||
int baseIndex = (savedMessagesIndex != -1 && choice > savedMessagesIndex) ? 1 : 0;
|
||||
int chatIndex = choice - 1 - baseIndex;
|
||||
|
||||
if (chatIndex < 0 || chatIndex >= Session.activeChats.size()) {
|
||||
System.out.println("Invalid selection.");
|
||||
return;
|
||||
}
|
||||
|
||||
ChatEntry selected = Session.activeChats.get(index);
|
||||
// Find the actual index of the chat, skipping the saved_messages entry
|
||||
int actualIndex = 0;
|
||||
for (int i = 0; i < Session.activeChats.size(); i++) {
|
||||
if (Session.activeChats.get(i).getType().equalsIgnoreCase("saved_messages")) {
|
||||
continue; // Skip saved_messages
|
||||
}
|
||||
if (actualIndex == chatIndex) {
|
||||
break;
|
||||
}
|
||||
actualIndex++;
|
||||
}
|
||||
|
||||
ChatEntry selected = Session.activeChats.get(actualIndex);
|
||||
openChat(selected);
|
||||
}
|
||||
|
||||
@@ -3414,8 +3465,6 @@ public class ActionHandler {
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
public void sendMessage(UUID chatId, String receiverType) {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
|
||||
@@ -3880,6 +3929,52 @@ public class ActionHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private void showSidebarMenu() {
|
||||
System.out.println("\n--- Sidebar Menu ---");
|
||||
System.out.println("1. View Profile");
|
||||
System.out.println("2. New Group");
|
||||
System.out.println("3. New Channel");
|
||||
System.out.println("4. View Contacts");
|
||||
System.out.println("5. Saved messages");
|
||||
System.out.println("6. Settings");
|
||||
System.out.println("7. Telegram features");
|
||||
System.out.println("8. Telegram Q&A");
|
||||
System.out.println("0. Back");
|
||||
System.out.println("Choose your action: (0 to 8)");
|
||||
|
||||
// Handle invalid input
|
||||
int action;
|
||||
while (true) {
|
||||
if (scanner.hasNextInt()) {
|
||||
action = scanner.nextInt();
|
||||
scanner.nextLine(); // Clear newline
|
||||
|
||||
if (action >= 0 && action <= 8) {
|
||||
break;
|
||||
}
|
||||
System.out.println("Invalid input. Please enter a number between 0 and 8.");
|
||||
} else {
|
||||
scanner.nextLine();
|
||||
System.out.println("Invalid input. Try again.");
|
||||
}
|
||||
}
|
||||
|
||||
SidebarHandler sidebarHandler = new SidebarHandler(scanner, this);
|
||||
switch (action) {
|
||||
case 0 -> {
|
||||
return;
|
||||
}
|
||||
case 1 -> sidebarHandler.handleSidebarAction(SidebarAction.MY_PROFILE);
|
||||
case 2 -> sidebarHandler.handleSidebarAction(SidebarAction.NEW_GROUP);
|
||||
case 3 -> sidebarHandler.handleSidebarAction(SidebarAction.NEW_CHANNEL);
|
||||
case 4 -> sidebarHandler.handleSidebarAction(SidebarAction.CONTACTS);
|
||||
case 5 -> sidebarHandler.handleSidebarAction(SidebarAction.SAVED_MESSAGES);
|
||||
case 6 -> sidebarHandler.handleSidebarAction(SidebarAction.SETTINGS);
|
||||
case 7 -> sidebarHandler.handleSidebarAction(SidebarAction.FEATURES);
|
||||
case 8 -> sidebarHandler.handleSidebarAction(SidebarAction.Q_AND_A);
|
||||
default -> System.out.println("Invalid action.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.to.telegramfinalproject.Client;
|
||||
|
||||
public enum SidebarAction {
|
||||
MY_PROFILE,
|
||||
NEW_GROUP,
|
||||
NEW_CHANNEL,
|
||||
CONTACTS,
|
||||
SAVED_MESSAGES,
|
||||
SETTINGS,
|
||||
FEATURES,
|
||||
Q_AND_A
|
||||
}
|
||||
@@ -0,0 +1,465 @@
|
||||
package org.to.telegramfinalproject.Client;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.to.telegramfinalproject.Models.ChatEntry;
|
||||
import org.to.telegramfinalproject.Models.Message;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
|
||||
import static org.to.telegramfinalproject.Client.ActionHandler.sendWithResponse;
|
||||
|
||||
public class SidebarHandler {
|
||||
private final Scanner scanner;
|
||||
private final ActionHandler actionHandler;
|
||||
private final String userUUID;
|
||||
|
||||
public SidebarHandler(Scanner scanner, ActionHandler actionHandler) {
|
||||
this.scanner = scanner;
|
||||
this.actionHandler = actionHandler;
|
||||
this.userUUID = Session.getUserUUID();
|
||||
|
||||
}
|
||||
|
||||
public void handleSidebarAction(SidebarAction action) {
|
||||
switch (action) {
|
||||
case MY_PROFILE:
|
||||
openUserProfile();
|
||||
break;
|
||||
case NEW_GROUP:
|
||||
createNewGroup();
|
||||
break;
|
||||
case NEW_CHANNEL:
|
||||
createNewChannel();
|
||||
break;
|
||||
case CONTACTS:
|
||||
showContacts();
|
||||
break;
|
||||
case SAVED_MESSAGES:
|
||||
getSavedMessagesData(userUUID);
|
||||
break;
|
||||
case SETTINGS:
|
||||
openSettings();
|
||||
break;
|
||||
case FEATURES:
|
||||
showTelegramFeatures();
|
||||
break;
|
||||
case Q_AND_A:
|
||||
showTelegramQA();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void openUserProfile() {
|
||||
// Step 1: Request profile info from the server
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "get_user_profile");
|
||||
|
||||
JSONObject response = sendWithResponse(request);
|
||||
if (response == null || !response.optString("status", "fail").equals("success")) {
|
||||
System.out.println("Failed to load profile information.");
|
||||
return;
|
||||
}
|
||||
|
||||
JSONObject profile;
|
||||
try {
|
||||
profile = response.getJSONObject("data");
|
||||
} catch (JSONException e) {
|
||||
System.out.println("Received malformed profile data from server.");
|
||||
return;
|
||||
}
|
||||
|
||||
String profileName = profile.optString("profile_name", "NOT-AVAILABLE");
|
||||
String userId = profile.optString("user_id", "NOT-AVAILABLE");
|
||||
String status = profile.optString("status", "NOT-AVAILABLE");
|
||||
String bio = profile.optString("bio", "NOT-AVAILABLE");
|
||||
String profilePictureUrl = profile.optString("profile_picture_url", "NOT-AVAILABLE");
|
||||
|
||||
// Step 2: Show profile info
|
||||
System.out.println("===== My Profile =====");
|
||||
System.out.println("Profile Picture URL : " + profilePictureUrl);
|
||||
System.out.println("Profile Name : " + profileName);
|
||||
System.out.println("User ID : @" + userId);
|
||||
System.out.println("Status : " + status);
|
||||
System.out.println("Bio : " + bio);
|
||||
System.out.println("======================");
|
||||
|
||||
// Step 3: Ask if user wants to edit anything
|
||||
System.out.println("Do you want to edit any of these? (yes/no)");
|
||||
while (true) {
|
||||
String choice = scanner.nextLine().trim().toLowerCase();
|
||||
if (choice.equals("no")) return;
|
||||
if (!choice.equals("yes")) {
|
||||
System.out.println("Invalid input. Please enter 'yes' or 'no'.");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Step 4: Show editable fields
|
||||
System.out.println("Which field do you want to edit?");
|
||||
System.out.println("1. Profile Name");
|
||||
System.out.println("2. User ID");
|
||||
System.out.println("3. Bio");
|
||||
System.out.println("4. Profile Picture URL");
|
||||
System.out.println("0. Cancel");
|
||||
|
||||
String option = scanner.nextLine().trim();
|
||||
switch (option) {
|
||||
case "1" -> editProfileName();
|
||||
case "2" -> editUserId();
|
||||
case "3" -> editBio();
|
||||
case "4" -> editProfilePictureUrl();
|
||||
case "0" -> { return; }
|
||||
default -> System.out.println("Invalid choice. Try again.");
|
||||
}
|
||||
|
||||
// Re-fetch and re-display profile after editing
|
||||
openUserProfile();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void editProfileName() {
|
||||
System.out.println("Enter your new profile name:");
|
||||
String newProfileName = scanner.nextLine().trim();
|
||||
|
||||
// Step 1: Validate input
|
||||
while (newProfileName.trim().isEmpty()) {
|
||||
System.out.println("Profile name cannot be empty. Enter another name.");
|
||||
newProfileName = scanner.nextLine().trim();
|
||||
}
|
||||
|
||||
// Step 2: Create request
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "edit_profile_name");
|
||||
request.put("new_profile_name", newProfileName);
|
||||
|
||||
// Step 3: Send request and receive response
|
||||
JSONObject response = sendWithResponse(request);
|
||||
|
||||
// Step 4: Handle response
|
||||
if (response == null || !response.optString("status", "fail").equals("success")) {
|
||||
System.out.println("Failed to update profile name.");
|
||||
} else {
|
||||
System.out.println("Profile name updated successfully!");
|
||||
}
|
||||
}
|
||||
|
||||
private void editUserId() {
|
||||
while (true) {
|
||||
System.out.println("Enter your new user ID: ");
|
||||
String newUserId = scanner.nextLine().trim();
|
||||
|
||||
if (newUserId.isEmpty()) {
|
||||
System.out.println("User ID cannot be empty.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (newUserId.contains(" ")) {
|
||||
System.out.println("User ID cannot contain spaces.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!newUserId.matches("^[a-zA-Z0-9_]+$")) {
|
||||
System.out.println("User ID can only contain letters, digits, and underscores.");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Send to server
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "edit_user_id");
|
||||
request.put("new_user_id", newUserId);
|
||||
JSONObject response = sendWithResponse(request);
|
||||
|
||||
if (response.getString("status").equals("success")) {
|
||||
System.out.println("User ID updated successfully.");
|
||||
break;
|
||||
} else {
|
||||
// Server-side error message (e.g., ID already exists)
|
||||
System.out.println(response.getString("message"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void editBio() {
|
||||
System.out.println("Enter your new bio:");
|
||||
String newBio = scanner.nextLine().trim();
|
||||
|
||||
// Limit the bio length
|
||||
if (newBio.length() > 70) {
|
||||
System.out.println("Bio cannot be more than 70 characters.");
|
||||
return;
|
||||
}
|
||||
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "edit_bio");
|
||||
request.put("new_bio", newBio);
|
||||
|
||||
JSONObject response = sendWithResponse(request);
|
||||
|
||||
if (response.getString("status").equals("success")) {
|
||||
System.out.println("Bio updated successfully.");
|
||||
} else {
|
||||
System.out.println(response.getString("message"));
|
||||
}
|
||||
}
|
||||
|
||||
private void editProfilePictureUrl() {
|
||||
while (true) {
|
||||
System.out.println("Enter new profile picture URL (or leave empty to remove):");
|
||||
String newImageUrl = scanner.nextLine().trim();
|
||||
|
||||
// URL validation
|
||||
if (newImageUrl.contains(" ")) {
|
||||
System.out.println("URL cannot contain spaces.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!newImageUrl.isEmpty() && !newImageUrl.matches("^(http|https)://.*$")) {
|
||||
System.out.println("Invalid URL format. Please enter a valid HTTP/HTTPS link.");
|
||||
continue;
|
||||
}
|
||||
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "edit_profile_picture");
|
||||
request.put("new_image_url", newImageUrl);
|
||||
JSONObject response = sendWithResponse(request);
|
||||
|
||||
if (response.getString("status").equals("success")) {
|
||||
System.out.println("Bio updated successfully.");
|
||||
} else {
|
||||
System.out.println(response.getString("message"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void createNewGroup() {
|
||||
actionHandler.createGroup();
|
||||
}
|
||||
|
||||
private void createNewChannel() {
|
||||
actionHandler.createChannel();
|
||||
}
|
||||
|
||||
private void showContacts() {
|
||||
actionHandler.showContactList();
|
||||
}
|
||||
|
||||
public void getSavedMessagesData(String userId) {
|
||||
try {
|
||||
// Step 1: Create the request
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "get_saved_messages");
|
||||
request.put("user_id", userId);
|
||||
|
||||
// Step 2: Send request and wait for response
|
||||
JSONObject response = ActionHandler.sendWithResponse(request);
|
||||
|
||||
// Step 3: Check the response
|
||||
if (!response.optString("status", "fail").equals("success")) {
|
||||
System.out.println("Failed to open Saved Messages chat: " + response.optString("message", "Unknown error"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 4: Extract "data" object
|
||||
JSONObject data = response.getJSONObject("data");
|
||||
UUID chatId = UUID.fromString(data.getString("chat_id"));
|
||||
JSONArray messagesArray = data.getJSONArray("messages");
|
||||
|
||||
// Step 5: Parse messages
|
||||
List<Message> messages = new ArrayList<>();
|
||||
if (!messagesArray.isEmpty()) {
|
||||
for (int i = 0; i < messagesArray.length(); i++) {
|
||||
JSONObject msgJson = messagesArray.getJSONObject(i);
|
||||
|
||||
// Safely extract optional UUIDs
|
||||
UUID replyToId = null;
|
||||
String replyToIdStr = msgJson.optString("reply_to_id", null);
|
||||
if (replyToIdStr != null && !replyToIdStr.equals("null")) {
|
||||
replyToId = UUID.fromString(replyToIdStr);
|
||||
}
|
||||
|
||||
UUID originalMessageId = null;
|
||||
String originalMessageIdStr = msgJson.optString("original_message_id", null);
|
||||
if (originalMessageIdStr != null && !originalMessageIdStr.equals("null")) {
|
||||
originalMessageId = UUID.fromString(originalMessageIdStr);
|
||||
}
|
||||
|
||||
UUID forwardedBy = null;
|
||||
String forwardedByStr = msgJson.optString("forwarded_by", null);
|
||||
if (forwardedByStr != null && !forwardedByStr.equals("null")) {
|
||||
forwardedBy = UUID.fromString(forwardedByStr);
|
||||
}
|
||||
|
||||
UUID forwardedFrom = null;
|
||||
String forwardedFromStr = msgJson.optString("forwarded_from", null);
|
||||
if (forwardedFromStr != null && !forwardedFromStr.equals("null")) {
|
||||
forwardedFrom = UUID.fromString(forwardedFromStr);
|
||||
}
|
||||
|
||||
Message msg = new Message(
|
||||
UUID.fromString(msgJson.getString("message_id")),
|
||||
UUID.fromString(msgJson.getString("sender_id")),
|
||||
msgJson.getString("receiver_type"),
|
||||
UUID.fromString(msgJson.getString("receiver_id")),
|
||||
msgJson.getString("content"),
|
||||
msgJson.getString("message_type"),
|
||||
LocalDateTime.parse(msgJson.getString("send_at").replace(" ", "T")),
|
||||
msgJson.getString("status"),
|
||||
replyToId,
|
||||
msgJson.getBoolean("is_edited"),
|
||||
originalMessageId,
|
||||
forwardedBy,
|
||||
forwardedFrom,
|
||||
msgJson.getBoolean("is_deleted_globally"),
|
||||
LocalDateTime.parse(msgJson.getString("edited_at").replace(" ", "T"))
|
||||
);
|
||||
|
||||
messages.add(msg);
|
||||
}
|
||||
}
|
||||
|
||||
// Step 6: Add to active chats if not already present
|
||||
boolean alreadyExists = Session.activeChats.stream()
|
||||
.anyMatch(entry -> entry.getId().equals(chatId));
|
||||
if (!alreadyExists) {
|
||||
ChatEntry savedEntry = new ChatEntry(
|
||||
chatId,
|
||||
"Saved-Messages",
|
||||
"Saved Messages",
|
||||
"📌", // or use a URL string if you have an icon for saved messages
|
||||
"private",
|
||||
messages.isEmpty() ? null : messages.get(messages.size() - 1).getSend_at()
|
||||
);
|
||||
savedEntry.setSavedMessages(true);
|
||||
Session.activeChats.add(savedEntry);
|
||||
}
|
||||
|
||||
// Step 7: Show chat
|
||||
showSavedMessages(chatId, messages);
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("An error occurred while retrieving Saved Messages.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void showSavedMessages(UUID chatId, List<Message> messages) {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
|
||||
System.out.println("==== Saved Messages ====");
|
||||
|
||||
// Show previous messages
|
||||
if (messages.isEmpty()) {
|
||||
System.out.println("No messages yet.");
|
||||
} else {
|
||||
for (Message msg : messages) {
|
||||
System.out.println("[" + msg.getSend_at() + "] " + msg.getContent());
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("\n(Type your message below, or type 0 to exit)");
|
||||
|
||||
while (true) {
|
||||
System.out.print("You: ");
|
||||
String content = scanner.nextLine().trim();
|
||||
|
||||
if (content.equals("0")) {
|
||||
System.out.println("Exiting Saved Messages.");
|
||||
break;
|
||||
}
|
||||
|
||||
System.out.print("Enter message type (TEXT / IMAGE / VIDEO / FILE / AUDIO): ");
|
||||
String messageType = scanner.nextLine().toUpperCase();
|
||||
Set<String> allowedTypes = Set.of("TEXT", "IMAGE", "VIDEO", "FILE");
|
||||
while (!allowedTypes.contains(messageType)) {
|
||||
System.out.print("Invalid type. Try again (TEXT / IMAGE / VIDEO / FILE / AUDIO): ");
|
||||
messageType = scanner.nextLine().toUpperCase();
|
||||
}
|
||||
|
||||
// Attaching Files
|
||||
JSONArray attachmentsArray = new JSONArray();
|
||||
System.out.print("Do you want to attach files? (yes/no): ");
|
||||
if (scanner.nextLine().equalsIgnoreCase("yes")) {
|
||||
while (true) {
|
||||
System.out.print("File URL: ");
|
||||
String fileUrl = scanner.nextLine();
|
||||
|
||||
// URL validation
|
||||
if (fileUrl.isEmpty()) {
|
||||
System.out.print("URL can not be empty. Try again.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fileUrl.contains(" ")) {
|
||||
System.out.println("URL cannot contain spaces. Try again.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!fileUrl.isEmpty() && !fileUrl.matches("^(http|https)://.*$")) {
|
||||
System.out.println("Invalid URL format. Please enter a valid HTTP/HTTPS link.");
|
||||
continue;
|
||||
}
|
||||
|
||||
System.out.print("File Type (IMAGE / VIDEO / FILE / AUDIO): ");
|
||||
String fileType = scanner.nextLine().toUpperCase();
|
||||
|
||||
Set<String> allowedFileTypes = Set.of("TEXT", "IMAGE", "VIDEO", "FILE");
|
||||
while (!allowedFileTypes.contains(fileType)) {
|
||||
System.out.print("Invalid type. Try again (IMAGE / VIDEO / FILE / AUDIO): ");
|
||||
fileType = scanner.nextLine().toUpperCase();
|
||||
}
|
||||
|
||||
JSONObject fileJson = new JSONObject();
|
||||
fileJson.put("file_url", fileUrl);
|
||||
fileJson.put("file_type", fileType);
|
||||
attachmentsArray.put(fileJson);
|
||||
|
||||
System.out.print("Add another file? (yes/no): ");
|
||||
if (!scanner.nextLine().equalsIgnoreCase("yes")) break;
|
||||
}
|
||||
}
|
||||
|
||||
// Prepare the request JSON
|
||||
JSONObject request = new JSONObject();
|
||||
request.put("action", "send_saved_messages");
|
||||
request.put("message_id", UUID.randomUUID().toString());
|
||||
request.put("sender_id", userUUID);
|
||||
request.put("receiver_type", "private");
|
||||
request.put("receiver_id", userUUID); // saved messages = to yourself
|
||||
request.put("content", content);
|
||||
request.put("message_type", "TEXT");
|
||||
request.put("status", "READ");
|
||||
request.put("reply_to_id", JSONObject.NULL);
|
||||
request.put("is_edited", false);
|
||||
request.put("original_message_id", JSONObject.NULL);
|
||||
request.put("forwarded_by", JSONObject.NULL);
|
||||
request.put("forwarded_from", JSONObject.NULL);
|
||||
request.put("is_deleted_globally", JSONObject.NULL);
|
||||
request.put("edited_at", JSONObject.NULL);
|
||||
|
||||
// Send the message and wait for response
|
||||
JSONObject response = ActionHandler.sendWithResponse(request);
|
||||
|
||||
if (!response.optString("status", "fail").equals("success")) {
|
||||
System.out.println("Failed to send message: " + response.optString("message", "Unknown error"));
|
||||
} else {
|
||||
System.out.println("Message sent.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void openSettings() {
|
||||
System.out.println("⚙️ Opening settings...");
|
||||
}
|
||||
|
||||
private void showTelegramFeatures() {
|
||||
System.out.println("🌟 Showing Telegram features...");
|
||||
}
|
||||
|
||||
private void showTelegramQA() {
|
||||
System.out.println("❓ Showing Q&A...");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user