KraSocketClient/src/main/java/earth/krakatao/SocketClient.java

112 lines
4.0 KiB
Java

package earth.krakatao;
import earth.krakatao.events.KraSocketClientEventInitiater;
import earth.krakatao.protocol.KraSocketClientProtocol;
import earth.krakatao.protocol.KraSocketClientProtocolMessage;
import earth.krakatao.protocol.KraSocketClientProtocolStatus;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import lombok.Getter;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
public class SocketClient extends WebSocketClient {
private final KraSocketClientEventInitiater kraSocketClientEventInitiater;
@Getter
private final KraSocketClientProtocol kraProtocol;
@Getter
private final List<Long> webSocketAckTimeouts;
private Timer timer;
public SocketClient(URI serverUri, KraSocketClientEventInitiater kraSocketClientEventInitiater,
KraSocketClientProtocol kraProtocol, List<Long> webSocketAckTimeouts) {
super(serverUri);
this.kraSocketClientEventInitiater = kraSocketClientEventInitiater;
this.kraProtocol = kraProtocol;
this.webSocketAckTimeouts = webSocketAckTimeouts;
}
public void SendMessage(KraSocketClientProtocolMessage kraProtocolMessage) {
if (isOpen()) {
if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus()) {
this.kraProtocol.getSendQueueMessages()
.put(kraProtocolMessage.getCmdID(), kraProtocolMessage);
}
send(this.kraProtocol.EncodeMessage(kraProtocolMessage));
}
}
public void Reconnect() {
KraSocketClient.getLogger().info("Reconnecting...");
reconnect();
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
this.kraSocketClientEventInitiater.callOnOpen(serverHandshake);
KraSocketClient.getLogger().info("connection opened");
TimerTask timerTask = new KraSocketClientMessageTimerTask(this);
this.timer = new Timer(true);
this.timer.scheduleAtFixedRate(timerTask, 0, 3 * 1000);
}
@Override
public void onMessage(String s) {
}
@Override
public void onMessage(ByteBuffer byteBuffer) {
KraSocketClientProtocolMessage kraProtocolMessage = new KraSocketClientProtocol().DecodeMessage(
byteBuffer.array());
if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.ERROR_NO_PERMS.getStatus()
|| kraProtocolMessage.getStatus()
== KraSocketClientProtocolStatus.ERROR_TRY_AGAIN.getStatus()
|| kraProtocolMessage.getStatus()
== KraSocketClientProtocolStatus.ERROR_ARG_LEN_TOO_BIG.getStatus()) {
KraSocketClient.getLogger().warning("error! status: " + kraProtocolMessage.getStatus());
return;
}
// response to the user that this message cmdID is already in the queue
if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus()
&& this.kraProtocol.getSendQueueMessages().containsKey(kraProtocolMessage.getCmdID())) {
// TODO: uuid
kraProtocolMessage = new KraSocketClientProtocolMessage(
KraSocketClientProtocolStatus.MESSAGE_ALREADY_IN_QUEUE.getStatus(),
kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus()
? kraProtocolMessage.getStatus() : 0, 0,
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", (short) kraProtocolMessage.getCmdNumber(), "", null);
KraSocketClient.getLogger()
.info("response MESSAGE_ALREADY_IN_QUEUE " + kraProtocolMessage.getCmdID());
this.SendMessage(kraProtocolMessage);
return;
}
this.kraSocketClientEventInitiater.callOnMessage(kraProtocolMessage);
}
@Override
public void onClose(int code, String reason, boolean remote) {
this.kraSocketClientEventInitiater.callOnClose(code, reason, remote);
KraSocketClient.logger.warning(
"connection closed. Code: " + code + " reason: " + reason + " remote: " + remote);
this.timer.cancel();
}
@Override
public void onError(Exception e) {
KraSocketClient.getLogger().warning("Err: " + e);
}
}