package com.cardshifter.api;
import com.cardshifter.api.messages.Message;
import com.cardshifter.api.outgoing.ServerErrorMessage;
public abstract class ClientIO implements IdObject {
private String name = "";
private final ClientServerInterface server;
private final LogInterface logger;
private int id;
private boolean disconnected;
public ClientIO(ClientServerInterface server) {
this.server = server;
this.id = server.newClientId();
this.logger = server.getLogger();
}
/**
* Send a message to this client
*
* @param message Message to send
* @throws IllegalArgumentException If message is not serializable
*/
public final void sendToClient(Message message) {
logger.info("Send to " + this.getName() + ": " + message);
if (this.disconnected) {
return;
}
this.onSendToClient(message);
}
protected abstract void onSendToClient(Message data);
public abstract String getRemoteAddress();
public String getName() {
return name;
}
public void sentToServer(String message) {
logger.info("Incoming message from " + this.name + ": " + message);
server.handleMessage(this, message);
}
public void sentToServer(Message message) {
try {
server.performIncoming(message, this);
}
catch (RuntimeException ex) {
logger.error("Error performing incoming message from " + this, ex);
sendToClient(new ServerErrorMessage(ex.toString()));
}
}
/**
* Inform the server that this client has disconnected
*/
protected final void disconnected() {
this.disconnected = true;
server.onDisconnected(this);
}
/**
* Disconnect this client
*/
public abstract void close();
public boolean isLoggedIn() {
return name.length() > 0;
}
public String getStatus() {
return isLoggedIn() ? "online" : "offline";
}
public void setName(String name) {
this.name = name;
}
@Override
public int getId() {
return id;
}
void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return getId() + ": " + getName() + " @ " + getRemoteAddress();
}
}