package envoy.client.data; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Objects; import envoy.client.net.WriteProxy; import envoy.data.*; import envoy.data.Message.MessageStatus; import envoy.event.MessageStatusChange; /** * Represents a chat between two {@link User}s * as a list of {@link Message} objects. *

* Project: envoy-client
* File: Chat.java
* Created: 19 Oct 2019
* * @author Maximilian Käfer * @author Leon Hofmeister * @author Kai S. K. Engelbart * @since Envoy Client v0.1-alpha */ public final class Chat implements Serializable { private final Contact recipient; private final List messages = new ArrayList<>(); private static final long serialVersionUID = 1L; /** * Provides the list of messages that the recipient receives.

* Saves the Messages in the corresponding chat at that Point. * * @param recipient the user who receives the messages * @since Envoy Client v0.1-alpha */ public Chat(Contact recipient) { this.recipient = recipient; } @Override public String toString() { return String.format("Chat[recipient=%s,messages=%d]", recipient, messages.size()); } /** * Generates a hash code based on the recipient. * * @since Envoy Client v0.1-beta */ @Override public int hashCode() { return Objects.hash(recipient); } /** * Tests equality to another object based on the recipient. * * @since Envoy Client v0.1-beta */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Chat)) return false; Chat other = (Chat) obj; return Objects.equals(recipient, other.recipient); } /** * Sets the status of all chat messages received from the recipient to * {@code READ} starting from the bottom and stopping once a read message is * found. * * @param writeProxy the write proxy instance used to notify the server about * the message status changes * @throws IOException if a {@link MessageStatusChange} could not be * delivered to the server * @since Envoy Client v0.3-alpha */ public void read(WriteProxy writeProxy) throws IOException { for (int i = messages.size() - 1; i >= 0; --i) { final Message m = messages.get(i); if (m.getSenderID() == recipient.getID()) if (m.getStatus() == MessageStatus.READ) break; else { m.setStatus(MessageStatus.READ); writeProxy.writeMessageStatusChange(new MessageStatusChange(m)); } } } /** * @return {@code true} if the newest message received in the chat doesn't have * the status {@code READ} * @since Envoy Client v0.3-alpha */ public boolean isUnread() { return !messages.isEmpty() && messages.get(messages.size() - 1).getStatus() != MessageStatus.READ; } /** * @return all messages in the current chat * @since Envoy Client v0.1-beta */ public List getMessages() { return messages; } /** * @return the recipient of a message * @since Envoy Client v0.1-alpha */ public Contact getRecipient() { return recipient; } /** * @return whether this {@link Chat} points at a {@link User} * @since Envoy Client v0.1-beta */ public boolean isUserChat() { return recipient instanceof User; } /** * @return whether this {@link Chat} points at a {@link Group} * @since Envoy Client v0.1-beta */ public boolean isGroupChat() { return recipient instanceof Group; } }