Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/main/java/ru/geekbrains/pocket/messenger/client/Main.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ru.geekbrains.pocket.messenger.client;

import javafx.application.HostServices;
import ru.geekbrains.pocket.messenger.client.view.RootLayoutController;
import ru.geekbrains.pocket.messenger.client.view.Tray;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
Expand All @@ -18,10 +20,12 @@ public class Main extends Application {

public static Stage primaryStage;
private static BorderPane rootLayout;
private static HostServices hostServices;
private static final Logger mainLogger = LogManager.getLogger(Main.class);

@Override
public void start(Stage stage) {
hostServices = getHostServices();
primaryStage = stage;
primaryStage.setTitle("Pocket desktop ru.geekbrains.pocket.messenger.client");
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/client/images/icon.png")));
Expand Down Expand Up @@ -49,6 +53,9 @@ public static void initRootLayout() {
loader.setLocation(Main.class.getResource("/client/fxml/RootLayout.fxml"));
rootLayout = loader.load();

RootLayoutController rlc = loader.getController();
rlc.getController().setHostServices(hostServices);

Scene scene = new Scene(rootLayout);

Cursor cursor = Cursor.cursor("HAND");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ru.geekbrains.pocket.messenger.client.controller;


import javafx.application.HostServices;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.messaging.simp.stomp.StompSession;
Expand All @@ -13,7 +14,9 @@
import ru.geekbrains.pocket.messenger.database.entity.Message;
import ru.geekbrains.pocket.messenger.database.entity.User;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ClientController {
static final Logger controllerLogger = LogManager.getLogger(ClientController.class);
Expand All @@ -27,6 +30,7 @@ public class ClientController {
List<String> contactList;
List<CFXListElement> contactListOfCards;
List<Message> conversation;
Set<String> isChatUpdated;

DataBaseService dbService;

Expand All @@ -35,6 +39,16 @@ public class ClientController {
GroupController groupService;
MessageController messageService;

private HostServices hostServices;

public HostServices getHostServices() {
return hostServices;
}

public void setHostServices(HostServices hostServices) {
this.hostServices = hostServices;
}

public void setChatViewController(ChatViewController chatViewController) {
this.chatViewController = chatViewController;
}
Expand All @@ -44,6 +58,7 @@ private ClientController() {
myUser = null;
conn = null;
dbService = new DataBaseService();
isChatUpdated = new HashSet<>();
authService = new AuthController(this);
contactService = new ContactController(this);
groupService = new GroupController(this);
Expand Down Expand Up @@ -210,4 +225,12 @@ public void resetWaitForConfirm() {
public void saveToDBAndShowMessage(String s) {
messageService.saveToDBAndShowMessage(s);
}

public void loadPreviousPageOfMessages() {
messageService.loadPreviousPageOfMessages();
}

public void clearIsChatUpdatedSet() {
isChatUpdated.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,17 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.messaging.simp.stomp.StompSession;
import ru.geekbrains.pocket.messenger.client.model.ServerResponse;
import ru.geekbrains.pocket.messenger.client.model.formatMsgWithServer.MessageFromServer;
import ru.geekbrains.pocket.messenger.client.model.formatMsgWithServer.MessageListFromServer;
import ru.geekbrains.pocket.messenger.client.model.formatMsgWithServer.MessageToServer;
import ru.geekbrains.pocket.messenger.client.utils.Converter;
import ru.geekbrains.pocket.messenger.client.utils.HTTPSRequest;
import ru.geekbrains.pocket.messenger.client.utils.Sound;
import ru.geekbrains.pocket.messenger.database.entity.Message;
import ru.geekbrains.pocket.messenger.database.entity.User;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static ru.geekbrains.pocket.messenger.client.controller.ClientController.token;
Expand All @@ -32,13 +31,14 @@
public class MessageController {

static final Logger controllerLogger = LogManager.getLogger(MessageController.class);

ClientController clientCtrllr;
public static final int PAGE_SIZE = 50;

ClientController cc;
private StompSession session;
private MessageToServer waitForConfirm;

MessageController(ClientController cc) {
clientCtrllr = cc;
this.cc = cc;
}

public StompSession getSession() {
Expand All @@ -54,33 +54,38 @@ public void resetWaitForConfirm() {
}

void loadChat() {
clientCtrllr.conversation = clientCtrllr.dbService.getChat(clientCtrllr.myUser, clientCtrllr.receiver);
getChatWithUser();
clientCtrllr.chatViewController.clearMessageWebView();
for (Message message : clientCtrllr.conversation) {
clientCtrllr.chatViewController.showMessage(message, false);
if (!cc.isChatUpdated.contains(cc.receiver.getId())) {
cc.conversation = cc.dbService.getChat(cc.myUser, cc.receiver);
getChatWithUser();
}
cc.conversation = cc.dbService.getChat(cc.myUser, cc.receiver, 0);
Collections.reverse(cc.conversation);
cc.chatViewController.clearMessageWebView();
for (Message message : cc.conversation) {
cc.chatViewController.showMessage(message, false);
}
cc.chatViewController.addJSBridgeToWebView();
}

void receiveMessage(MessageFromServer mfs) {
synchronized void receiveMessage(MessageFromServer mfs) {
//todo: доделать логику на получение уведомлений о прочтении отправленного сообщения!?
//todo: доработать логику получения сообщения из группы
//Проверяем, что осообщение пришло не от клиента в списке
if (!clientCtrllr.contactList.contains(mfs.getSender())) {
User newCont = clientCtrllr.contactService.getFromServerUserById(mfs.getSender());
if (!cc.contactList.contains(mfs.getSender())) {
User newCont = cc.contactService.getFromServerUserById(mfs.getSender());
if (newCont != null)
clientCtrllr.contactService.addContact(newCont);
cc.contactService.addContact(newCont);
else
controllerLogger.error("Получено сообщение от пользователя, данных которого " +
"нет на сервере. Сообщение:\n" + mfs);
}
Message mess = mfs.toMessageWithoutUsers();
mess.setSender(clientCtrllr.dbService.getUserById(mfs.getSender()));
mess.setReceiver(clientCtrllr.dbService.getUserById(mfs.getRecipient()));
clientCtrllr.dbService.addMessage(mess);
mess.setSender(cc.dbService.getUserById(mfs.getSender()));
mess.setReceiver(cc.dbService.getUserById(mfs.getRecipient()));
cc.dbService.addMessage(mess);
//Проверяем что у нас чат именно с этим пользователем, иначе сообщение не выводится
if (clientCtrllr.receiver != null && clientCtrllr.receiver.getId().equals(mfs.getSender())) {
clientCtrllr.chatViewController.showMessage(mess, true);
if (cc.receiver != null && cc.receiver.getId().equals(mfs.getSender())) {
cc.chatViewController.showMessage(mess, true);
} else {
//todo: превью и счётчик непрочитанных для контакта / группы, от которых пришло сообщение
}
Expand All @@ -90,42 +95,47 @@ void receiveMessage(MessageFromServer mfs) {
}

void sendMessage(String message) {
if (clientCtrllr.receiver == null) {
if (cc.receiver == null) {
showAlert("Выберите контакт для отправки сообщения", Alert.AlertType.ERROR);
return;
}

MessageToServer mts = new MessageToServer(message, null, clientCtrllr.receiver.getId(), null);
MessageToServer mts = new MessageToServer(message, null, cc.receiver.getId(), null);
session.send("/v1/send", mts);
waitForConfirm = mts;
}

public void saveToDBAndShowMessage(String messageId) {
Message mess = new Message();
mess.setId(messageId);
mess.setReceiver(clientCtrllr.receiver);
mess.setSender(clientCtrllr.myUser);
mess.setReceiver(cc.receiver);
mess.setSender(cc.myUser);
mess.setText(waitForConfirm.getText());
mess.setTime(new Timestamp(System.currentTimeMillis()));

clientCtrllr.dbService.addMessage(mess);
cc.dbService.addMessage(mess);

clientCtrllr.chatViewController.showMessage(mess, false);
cc.chatViewController.showMessage(mess, false);
}

void clearMessagesWithUser(User contact) {
if (!clientCtrllr.dbService.getChat(clientCtrllr.myUser, contact).isEmpty())
clientCtrllr.dbService.deleteChat(clientCtrllr.myUser, contact);
if (!cc.dbService.getChat(cc.myUser, contact).isEmpty())
cc.dbService.deleteChat(cc.myUser, contact);
}

private void getChatWithUser() {
try {
int pageOfMessages = 0;
while (true) {
ServerResponse response = HTTPSRequest.getUserMessages(token, clientCtrllr.receiver.getId(), pageOfMessages++);
if (response.getResponseCode() != 200) break;
MessageListFromServer mlfs = Converter.toJavaObject(response.getResponseJson(), MessageListFromServer.class);
if (mlfs.getData().length == 0) break;
String receiverId = cc.receiver.getId();
int responseCode = HTTPSRequest.sendRequest("/user/" + receiverId +
"/messages?offset=" + pageOfMessages++, "GET", null, token);
if (responseCode != 200) break;
MessageListFromServer mlfs = HTTPSRequest.getResponse(MessageListFromServer.class);
if (mlfs.getData().length == 0) {
cc.isChatUpdated.add(receiverId);
break;
}
synchronizeMessageListFromServ(mlfs.getData());
}
} catch (Exception e) {
Expand All @@ -135,17 +145,31 @@ private void getChatWithUser() {

private void synchronizeMessageListFromServ(MessageFromServer[] messages) {
List<String> messageListFromDbId = new ArrayList<>();
for (Message message : clientCtrllr.conversation) {
for (Message message : cc.conversation) {
messageListFromDbId.add(message.getId());
}
for (MessageFromServer entry : messages) {
Message mess = entry.toMessageWithoutUsers();
if (!messageListFromDbId.contains(mess.getId())) {
mess.setSender(clientCtrllr.dbService.getUserById(entry.getSender()));
mess.setReceiver(clientCtrllr.dbService.getUserById(entry.getRecipient()));
clientCtrllr.dbService.addMessage(mess);
mess.setSender(cc.dbService.getUserById(entry.getSender()));
mess.setReceiver(cc.dbService.getUserById(entry.getRecipient()));
cc.dbService.addMessage(mess);
cc.conversation.add(mess);
}
}
}

synchronized void loadPreviousPageOfMessages() {
int currentPageNumber = (cc.chatViewController.getIdMsg() - 1) / PAGE_SIZE;
cc.conversation = cc.dbService.getChat(cc.myUser, cc.receiver, ++currentPageNumber);
if (cc.conversation.size() == 0) {
cc.chatViewController.setTopOfConversation(true);
} else {
cc.chatViewController.removeDateOnTop();
for (Message message : cc.conversation) {
cc.chatViewController.showMessageOnTop(message);
}
cc.chatViewController.showDateOnTop();
}
clientCtrllr.conversation = clientCtrllr.dbService.getChat(clientCtrllr.myUser, clientCtrllr.receiver);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public ChatStompSessionHandler(ClientController clientCtrllr) {
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
clientCtrllr.setMessageSession(session);
sessionLogger.info("websocket connection established");
clientCtrllr.clearIsChatUpdatedSet();

session.subscribe("/user/queue/new", new StompFrameHandler() {

Expand Down
Loading