* Completely revised communication between client and server.
* Added synchronization functionality.
* Added Message State updates
* Added UserStatus updates
This commit is contained in:
Maxi
2019-11-04 23:10:53 +01:00
parent 239d2bb029
commit a0dc25ba61
5 changed files with 434 additions and 105 deletions

View File

@ -27,9 +27,9 @@ import envoy.client.Chat;
import envoy.client.Client;
import envoy.client.LocalDB;
import envoy.schema.Message;
import envoy.schema.Messages;
import envoy.schema.Sync;
import envoy.schema.User;
import envoy.schema.Users;
/**
* Project: <strong>envoy-client</strong><br>
@ -147,18 +147,17 @@ public class ChatWindow extends JFrame {
postButton.addActionListener((evt) -> {
if (!client.hasRecipient()) {
JOptionPane.showMessageDialog(this, "Please select a recipient!", "Cannot send message", JOptionPane.INFORMATION_MESSAGE);
return;
JOptionPane.showMessageDialog(this,
"Please select a recipient!",
"Cannot send message",
JOptionPane.INFORMATION_MESSAGE);
}
if (!messageEnterTextfield.getText().isEmpty()) try {
// Create and send message object
final Message message = client.createMessage(messageEnterTextfield.getText());
client.sendMessage(message);
// Append message object to chat
currentChat.appendMessage(message);
client.addWaitingMessageToLocalDB(message, currentChat);
messageList.setModel(currentChat.getModel());
// Clear text field
@ -200,16 +199,23 @@ public class ChatWindow extends JFrame {
final User user = selectedUserList.getSelectedValue();
client.setRecipient(user);
currentChat = localDB.getChats().stream().filter(chat -> chat.getRecipient().getID() == user.getID()).findFirst().get();
currentChat = localDB.getChats()
.stream()
.filter(chat -> chat.getRecipient().getID() == user.getID())
.findFirst()
.get();
client.setRecipient(user);
textPane.setText(currentChat.getRecipient().getName());
messageList.setModel(currentChat.getModel());
contentPane.revalidate();
}
});
userList.setSelectionForeground(new Color(255, 255, 255));
userList.setSelectionBackground(new Color(102, 0, 153));
userList.setForeground(new Color(255, 255, 255));
@ -227,6 +233,7 @@ public class ChatWindow extends JFrame {
contentPane.add(userList, gbc_userList);
contentPane.revalidate();
loadUsersAndChats();
startReceiverThread(5000);
@ -239,9 +246,9 @@ public class ChatWindow extends JFrame {
*/
private void loadUsersAndChats() {
new Thread(() -> {
Users users = client.getUsersListXml();
Sync users = client.getUsersListXml();
DefaultListModel<User> userListModel = new DefaultListModel<>();
users.getUser().forEach(user -> {
users.getUsers().forEach(user -> {
userListModel.addElement(user);
// Check if user exists in local DB
@ -253,18 +260,34 @@ public class ChatWindow extends JFrame {
}
/**
* Checks for new messages and adds them to the chat list.
* For detailed information see Javadoc of corresponding methods.
*
* @param timeout the amount of time that passes between two requests sent to
* the server
* @since Envoy v0.1-alpha
*/
private void startReceiverThread(int timeout) {
new Timer(timeout, (evt) -> {
Messages unreadMessages = client.getUnreadMessages(client.getSender().getID());
for (int i = 0; i < unreadMessages.getMessage().size(); i++)
for (int j = 0; j < localDB.getChats().size(); j++)
if (localDB.getChats().get(j).getRecipient().getID() == unreadMessages.getMessage().get(i).getMetaData().getSender())
localDB.getChats().get(j).appendMessage(unreadMessages.getMessage().get(i));
}).start();
if(currentChat != null) {
client.setMessagesToRead(currentChat);
}
client.sendSync(client.getSender().getID(), localDB);
client.addUnreadMessagesToLocalDB(localDB);
client.clearUnreadMessagesSync();
for (int i = 0; i < userList.getModel().getSize(); i++) {
for (int j = 0; j < localDB.getChats().size(); j++) {
if(userList.getModel().getElementAt(i).getID() == localDB.getChats().get(j).getRecipient().getID()) {
userList.getModel().getElementAt(i).setStatus(localDB.getChats().get(j).getRecipient().getStatus());
}
}
}
contentPane.revalidate();
contentPane.repaint();
userList.revalidate();
userList.repaint();
}).start();
}
}