
estonlabs.cxtl.exchanges.gateio.api.v4.domain.GateIOOutboundMessage Maven / Gradle / Ivy
package estonlabs.cxtl.exchanges.gateio.api.v4.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import estonlabs.cxtl.common.auth.Credentials;
import estonlabs.cxtl.common.stream.managed.OutboundMessage;
import estonlabs.cxtl.exchanges.a.specification.domain.AssetClass;
import estonlabs.cxtl.exchanges.gateio.api.v4.domain.enums.OBUpdateFrequency;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static estonlabs.cxtl.exchanges.gateio.api.v4.Utils.genSignWs;
import static estonlabs.cxtl.exchanges.gateio.api.v4.Utils.prefixByAssetClass;
@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class GateIOOutboundMessage implements OutboundMessage {
private static final String SUBSCRIBE_CMD = "subscribe";
private static final String UNSUBSCRIBE_CMD = "unsubscribe";
private static final String TICKER_CHANNEL = "book_ticker";
private static final String OB_DELTA_CHANNEL = "order_book_update";
private static final String USER_ORDERS_CHANNEL = "orders";
private static final String USER_TRADES_CHANNEL = "usertrades";
private static final String USER_BALANCES_CHANNEL = "balances";
private static final String PING_CHANNEL = "ping";
private static final String POSITION_CHANNEL = "positions";
private static final String ALL_SYMBOLS = "!all";
private long time;
private Integer id;
private String channel;
private Map auth;
private String event;
private List payload;
@JsonIgnore
private MessageType messageType;
public String queryString() {
return String.format("channel=%s&event=%s&time=%d", channel, event, time);
}
public static GateIOOutboundMessage subscribeTicker(long currentTimeSec, AssetClass assetClass, String symbol){
var payload = new ArrayList();
payload.add(symbol);
return new GateIOOutboundMessage()
.setTime(currentTimeSec)
.setEvent(SUBSCRIBE_CMD)
.setMessageType(MessageType.SUBSCRIPTION)
.setChannel(prefixByAssetClass(assetClass, TICKER_CHANNEL))
.setPayload(payload);
}
public static GateIOOutboundMessage unsubscribeTicker(long currentTimeSec, AssetClass assetClass, String symbol){
var payload = new ArrayList();
payload.add(symbol);
return new GateIOOutboundMessage()
.setTime(currentTimeSec)
.setEvent(UNSUBSCRIBE_CMD)
.setMessageType(MessageType.UNSUBSCRIBE)
.setChannel(prefixByAssetClass(assetClass, TICKER_CHANNEL))
.setPayload(payload);
}
public static GateIOOutboundMessage subscribeOrderbookUpdate(
long currentTimeSec,
AssetClass assetClass,
String symbol,
OBUpdateFrequency frequency
){
var payload = new ArrayList();
payload.add(symbol);
payload.add(frequency.getValue());
return new GateIOOutboundMessage()
.setTime(currentTimeSec)
.setEvent(SUBSCRIBE_CMD)
.setMessageType(MessageType.SUBSCRIPTION)
.setChannel(prefixByAssetClass(assetClass, OB_DELTA_CHANNEL))
.setPayload(payload);
}
public static GateIOOutboundMessage unsubscribeOrderbookUpdate(
long currentTimeSec,
AssetClass assetClass,
String symbol,
OBUpdateFrequency frequency
){
var payload = new ArrayList();
payload.add(symbol);
payload.add(frequency.getValue());
return new GateIOOutboundMessage()
.setTime(currentTimeSec)
.setEvent(UNSUBSCRIBE_CMD)
.setMessageType(MessageType.UNSUBSCRIBE)
.setChannel(prefixByAssetClass(assetClass, OB_DELTA_CHANNEL))
.setPayload(payload);
}
private static GateIOOutboundMessage subscribePrivateChannel(
long currentTimeSec,
AssetClass assetClass,
String channelName,
Credentials credentials,
String userId
){
return subscribePrivateChannel(currentTimeSec, assetClass, channelName, credentials, userId, true);
}
private static GateIOOutboundMessage subscribePrivateChannel(
long currentTimeSec,
AssetClass assetClass,
String channelName,
Credentials credentials,
String userId,
Boolean withSymbols
){
var payload = new ArrayList(2);
if (userId != null) {
payload.add(userId);
}
/*
If you want to subscribe to all orders updates in all symbols, use !all
*/
if (withSymbols) {
payload.add(ALL_SYMBOLS);
}
var msg = new GateIOOutboundMessage()
.setTime(currentTimeSec)
.setEvent(SUBSCRIBE_CMD)
.setMessageType(MessageType.SUBSCRIPTION)
.setChannel(prefixByAssetClass(assetClass, channelName))
.setPayload(payload);
var auth = genSignWs(msg.queryString(), credentials.getApiKey(), credentials.getSecretKey());
return msg.setAuth(auth);
}
public static GateIOOutboundMessage subscribeOrders(
long currentTimeSec,
AssetClass assetClass,
Credentials credentials,
String userId
){
return subscribePrivateChannel(currentTimeSec, assetClass, USER_ORDERS_CHANNEL, credentials, userId);
}
public static GateIOOutboundMessage subscribeUserTrades(
long currentTimeSec,
AssetClass assetClass,
Credentials credentials,
String userId
){
return subscribePrivateChannel(currentTimeSec, assetClass, USER_TRADES_CHANNEL, credentials, userId);
}
public static GateIOOutboundMessage subscribeBalances(
long currentTimeSec,
AssetClass assetClass,
Credentials credentials,
String userId
){
return subscribePrivateChannel(currentTimeSec, assetClass, USER_BALANCES_CHANNEL, credentials, userId, false);
}
public static GateIOOutboundMessage ping(
long currentTimeSec,
AssetClass assetClass
){
return new GateIOOutboundMessage()
.setTime(currentTimeSec)
.setEvent(SUBSCRIBE_CMD)
.setMessageType(MessageType.PING)
.setChannel(prefixByAssetClass(assetClass, PING_CHANNEL));
}
public static GateIOOutboundMessage subscribePositionUpdate(
long currentTimeSec,
AssetClass assetClass,
Credentials credentials,
String userId
){
if (assetClass != AssetClass.FUTURE && assetClass != AssetClass.PERP){
throw new IllegalArgumentException("Position updates ares supported by exchange only for delivery and perpetual futures");
}
return subscribePrivateChannel(currentTimeSec, assetClass, POSITION_CHANNEL, credentials, userId);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy