All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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