package com.cardshifter.server.model; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import com.cardshifter.api.ClientIO; import com.cardshifter.api.IdObject; import com.cardshifter.api.both.ChatMessage; import com.cardshifter.api.outgoing.ServerErrorMessage; public class ChatArea implements IdObject { private static final Logger logger = LogManager.getLogger(ChatArea.class); // By using an id here, it could be used in a database table with Hibernate. It also allows multiple chats per user private final String name; private final Set<ClientIO> clients; private final int id; public ChatArea(int id, String name) { this.id = id; this.name = name; this.clients = Collections.synchronizedSet(new HashSet<>()); } public void broadcast(ChatMessage message) { logger.info(this + " broadcast: " + message); clients.forEach(cl -> cl.sendToClient(message)); } public void broadcast(String from, String message) { broadcast(new ChatMessage(id, from, message)); } public void add(ClientIO client) { clients.add(client); broadcast(new ChatMessage(id, "Server Chat " + id, client.getName() + " has joined the chat")); } public boolean remove(ClientIO client) { return clients.remove(client); } @Override public String toString() { return "ChatArea:" + id + name; } public void incomingMessage(ChatMessage message, ClientIO client) { if (!clients.contains(client)) { client.sendToClient(new ServerErrorMessage("You are not inside chat " + id)); } else { this.broadcast(new ChatMessage(id, client.getName(), message.getMessage())); } } @Override public int getId() { return id; } public Set<ClientIO> getUsers() { return Collections.unmodifiableSet(this.clients); } }