Files
Telegram-Final-Project/src/main/java/org/to/telegramfinalproject/Client/TelegramClient.java
T
2025-08-27 23:22:07 +03:30

274 lines
8.8 KiB
Java

//package org.to.telegramfinalproject.Client;
//
//import org.json.JSONObject;
//
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.io.PrintWriter;
//import java.net.Socket;
//import java.util.Map;
//import java.util.Scanner;
//import java.util.UUID;
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.LinkedBlockingQueue;
//
//public class TelegramClient {
// private static final String SERVER_HOST = "localhost";
// private static final int SERVER_PORT = 8000;
// private static Socket socket;
// private BufferedReader in;
// private PrintWriter out;
// private final Scanner scanner;
// private ActionHandler handler;
// public static BlockingQueue<JSONObject> responseQueue = new LinkedBlockingQueue<>();
// public static UUID loggedInUserId = null;
// public static final Map<String, BlockingQueue<JSONObject>> pendingResponses = new ConcurrentHashMap<>();
//
//
// private static TelegramClient instance;
//
// public TelegramClient() {
// this.scanner = new Scanner(System.in);
// instance = this;
// }
//
// public static TelegramClient getInstance() {
// return instance;
// }
//
// public void start() {
// try {
// socket = new Socket(SERVER_HOST, SERVER_PORT);
// in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// out = new PrintWriter(socket.getOutputStream(), true);
// System.out.println("✅ Connected to Telegram Server");
// handler = new ActionHandler(out, in, scanner);
//
// Thread listenerThread = new Thread(new IncomingMessageListener(in));
// listenerThread.setDaemon(true);
// listenerThread.start();
//
// showMainMenu();
//
// } catch (IOException e) {
// System.err.println("❌ Error connecting to server: " + e.getMessage());
// }
// }
//
// private void showMainMenu() throws IOException {
// while (true) {
// System.out.println("Main Menu:");
// System.out.println("1. Register");
// System.out.println("2. Login");
// System.out.println("3. Exit");
// System.out.print("Choose an option: ");
// String choice = scanner.nextLine();
//
// switch (choice) {
// case "1" -> handler.register();
// case "2" -> {
// handler.loginHandler();
// if (Session.currentUser != null) {
// System.out.println("✅ Login successful.");
// new Thread(new ActionHandler.ChatStateMonitor(out)).start();
//// new Thread(new ActionHandler.CurrentChatMenuRefresher(this.handler)).start();
//
//
// UUID internalId = UUID.fromString(Session.currentUser.getString("internal_uuid"));
// loggedInUserId = internalId;
//
// handler.userMenu(internalId);
// } else {
// System.out.println("❌ Login failed.");
// }
// }
// case "3" -> {
// System.out.println("Exiting...");
// return;
// }
// default -> System.out.println("Invalid choice.");
// }
// }
// }
//
// public static void send(JSONObject req) {
// try {
// responseQueue.clear(); // optional: clear old responses
// getInstance().out.println(req.toString());
// System.out.println("📤 [SEND] " + req.toString(2));
//
// } catch (Exception e) {
// System.err.println("❌ Error sending request: " + e.getMessage());
// }
// }
//
//
//
//
// public static Socket getSocket() {
// return socket;
// }
//
// public static void main(String[] args) {
// new TelegramClient().start();
// }
//
// public PrintWriter getOut() {
// return out;
// }
//
//
//}
package org.to.telegramfinalproject.Client;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Scanner;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
public class TelegramClient {
private static final String SERVER_HOST = "localhost";
private static final int SERVER_PORT = 8000;
private static TelegramClient instance;
private static Socket socket;
private BufferedReader in;
private PrintWriter out;
private final Scanner scanner;
private ActionHandler handler;
public static final BlockingQueue<JSONObject> responseQueue = new LinkedBlockingQueue<>();
public static final Map<String, BlockingQueue<JSONObject>> pendingResponses = new ConcurrentHashMap<>();
public static UUID loggedInUserId = null;
private volatile boolean listenerStarted = false;
public TelegramClient() {
this.scanner = new Scanner(System.in);
instance = this;
}
public static synchronized TelegramClient getInstance() {
if (instance == null) instance = new TelegramClient();
return instance;
}
public void startConsole() {
try {
connectIfNeeded();
initHandlerIfNeeded();
startListenerOnce();
showMainMenu();
} catch (IOException e) {
System.err.println("❌ Error connecting to server: " + e.getMessage());
}
}
public void start() { startConsole(); }
//UI only
public static synchronized TelegramClient getOrInitForUI() throws IOException {
TelegramClient cli = getInstance();
cli.connectIfNeeded();
cli.initHandlerIfNeeded();
cli.startListenerOnce();
return cli;
}
private synchronized void connectIfNeeded() throws IOException {
if (socket != null && socket.isConnected() && !socket.isClosed()) return;
socket = new Socket(SERVER_HOST, SERVER_PORT);
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("✅ Connected to Telegram Server");
}
private synchronized void initHandlerIfNeeded() {
if (handler == null) {
handler = new ActionHandler(out, in, scanner);
}
}
private void startListenerOnce() {
if (listenerStarted) return;
listenerStarted = true;
Thread listenerThread = new Thread(new IncomingMessageListener(in), "socket-listener");
listenerThread.setDaemon(true);
listenerThread.start();
}
//console
private void showMainMenu() throws IOException {
while (true) {
System.out.println("Main Menu:");
System.out.println("1. Register");
System.out.println("2. Login");
System.out.println("3. Exit");
System.out.print("Choose an option: ");
String choice = scanner.nextLine();
switch (choice) {
case "1" -> handler.register();
case "2" -> {
handler.loginHandler();
if (Session.currentUser != null) {
System.out.println("✅ Login successful.");
new Thread(new ActionHandler.ChatStateMonitor(out)).start();
UUID internalId = UUID.fromString(Session.currentUser.getString("internal_uuid"));
loggedInUserId = internalId;
handler.userMenu(internalId);
} else {
System.out.println("❌ Login failed.");
}
}
case "3" -> {
System.out.println("Exiting...");
return;
}
default -> System.out.println("Invalid choice.");
}
}
}
public static void send(JSONObject req) {
try {
responseQueue.clear();
getInstance().out.println(req.toString());
System.out.println("📤 [SEND] " + req.toString(2));
} catch (Exception e) {
System.err.println("❌ Error sending request: " + e.getMessage());
}
}
public BufferedReader getIn() { return in; }
public PrintWriter getOut() { return out; }
public ActionHandler getHandler() { return handler; }
public static Socket getSocket() { return socket; }
public static void main(String[] args) {
new TelegramClient().startConsole();
}
}