112 lines
4.0 KiB
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);
|
|
}
|
|
}
|