219 lines
6.5 KiB
Go
219 lines
6.5 KiB
Go
|
|
package excservice
|
||
|
|
|
||
|
|
import (
|
||
|
|
"go-admin/pkg/utility"
|
||
|
|
|
||
|
|
"github.com/bytedance/sonic"
|
||
|
|
log "github.com/go-admin-team/go-admin-core/logger"
|
||
|
|
)
|
||
|
|
|
||
|
|
/*
|
||
|
|
Bitget用户订单订阅处理
|
||
|
|
- @msg 消息内容
|
||
|
|
- @listenType 订阅类型 0-现货 1-合约
|
||
|
|
*/
|
||
|
|
func ReceiveBitgetListen(msg []byte, listenType int, apiKey string) (reconnect bool, err error) {
|
||
|
|
var dataMap map[string]interface{}
|
||
|
|
err = sonic.Unmarshal(msg, &dataMap)
|
||
|
|
|
||
|
|
if err != nil {
|
||
|
|
log.Error("接收Bitget ws 反序列化失败:", err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查是否是操作响应
|
||
|
|
if op, exists := dataMap["op"]; exists {
|
||
|
|
switch op {
|
||
|
|
case "login":
|
||
|
|
return handleBitgetLogin(dataMap, apiKey)
|
||
|
|
case "subscribe":
|
||
|
|
return handleBitgetSubscribe(dataMap, apiKey)
|
||
|
|
case "unsubscribe":
|
||
|
|
return handleBitgetUnsubscribe(dataMap, apiKey)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查是否是数据推送
|
||
|
|
if arg, exists := dataMap["arg"]; exists {
|
||
|
|
return handleBitgetDataPush(dataMap, arg, listenType, apiKey)
|
||
|
|
}
|
||
|
|
|
||
|
|
log.Info("未知Bitget事件 内容:", string(msg))
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetLogin 处理登录响应
|
||
|
|
func handleBitgetLogin(dataMap map[string]interface{}, apiKey string) (bool, error) {
|
||
|
|
if code, exists := dataMap["code"]; exists {
|
||
|
|
if code == "0" || code == 0 {
|
||
|
|
log.Info("Bitget WebSocket登录成功 key:%s", apiKey)
|
||
|
|
} else {
|
||
|
|
log.Error("Bitget WebSocket登录失败 key:%s code:%v", apiKey, code)
|
||
|
|
return true, nil // 需要重连
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetSubscribe 处理订阅响应
|
||
|
|
func handleBitgetSubscribe(dataMap map[string]interface{}, apiKey string) (bool, error) {
|
||
|
|
if code, exists := dataMap["code"]; exists {
|
||
|
|
if code == "0" || code == 0 {
|
||
|
|
log.Info("Bitget WebSocket订阅成功 key:%s", apiKey)
|
||
|
|
} else {
|
||
|
|
log.Error("Bitget WebSocket订阅失败 key:%s code:%v", apiKey, code)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetUnsubscribe 处理取消订阅响应
|
||
|
|
func handleBitgetUnsubscribe(dataMap map[string]interface{}, apiKey string) (bool, error) {
|
||
|
|
if code, exists := dataMap["code"]; exists {
|
||
|
|
if code == "0" || code == 0 {
|
||
|
|
log.Info("Bitget WebSocket取消订阅成功 key:%s", apiKey)
|
||
|
|
} else {
|
||
|
|
log.Error("Bitget WebSocket取消订阅失败 key:%s code:%v", apiKey, code)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetDataPush 处理数据推送
|
||
|
|
func handleBitgetDataPush(dataMap map[string]interface{}, arg interface{}, listenType int, apiKey string) (bool, error) {
|
||
|
|
argMap, ok := arg.(map[string]interface{})
|
||
|
|
if !ok {
|
||
|
|
log.Error("Bitget数据推送参数格式错误 key:%s", apiKey)
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
channel, exists := argMap["channel"]
|
||
|
|
if !exists {
|
||
|
|
log.Error("Bitget数据推送缺少channel参数 key:%s", apiKey)
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
switch channel {
|
||
|
|
case "account":
|
||
|
|
return handleBitgetAccount(dataMap, listenType, apiKey)
|
||
|
|
case "orders":
|
||
|
|
return handleBitgetOrders(dataMap, listenType, apiKey)
|
||
|
|
case "positions":
|
||
|
|
return handleBitgetPositions(dataMap, listenType, apiKey)
|
||
|
|
case "balance":
|
||
|
|
return handleBitgetBalance(dataMap, listenType, apiKey)
|
||
|
|
default:
|
||
|
|
log.Info("收到Bitget未处理的频道数据 channel:%v key:%s", channel, apiKey)
|
||
|
|
}
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetAccount 处理账户更新
|
||
|
|
func handleBitgetAccount(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
|
||
|
|
log.Info("收到Bitget账户更新 listenType:%d key:%s", listenType, apiKey)
|
||
|
|
|
||
|
|
data, exists := dataMap["data"]
|
||
|
|
if !exists {
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// 这里可以根据需要实现具体的账户更新处理逻辑
|
||
|
|
// 类似于binanceservice.ChangeSpotOrder或binanceservice.ChangeFutureOrder
|
||
|
|
|
||
|
|
utility.SafeGo(func() {
|
||
|
|
handleBitgetAccountUpdate(data, listenType, apiKey)
|
||
|
|
})
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetOrders 处理订单更新
|
||
|
|
func handleBitgetOrders(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
|
||
|
|
log.Info("收到Bitget订单更新 listenType:%d key:%s", listenType, apiKey)
|
||
|
|
|
||
|
|
data, exists := dataMap["data"]
|
||
|
|
if !exists {
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
utility.SafeGo(func() {
|
||
|
|
handleBitgetOrderUpdate(data, listenType, apiKey)
|
||
|
|
})
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetPositions 处理持仓更新
|
||
|
|
func handleBitgetPositions(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
|
||
|
|
log.Info("收到Bitget持仓更新 listenType:%d key:%s", listenType, apiKey)
|
||
|
|
|
||
|
|
data, exists := dataMap["data"]
|
||
|
|
if !exists {
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
utility.SafeGo(func() {
|
||
|
|
handleBitgetPositionUpdate(data, listenType, apiKey)
|
||
|
|
})
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetBalance 处理余额更新
|
||
|
|
func handleBitgetBalance(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
|
||
|
|
log.Info("收到Bitget余额更新 listenType:%d key:%s", listenType, apiKey)
|
||
|
|
|
||
|
|
data, exists := dataMap["data"]
|
||
|
|
if !exists {
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
utility.SafeGo(func() {
|
||
|
|
handleBitgetBalanceUpdate(data, listenType, apiKey)
|
||
|
|
})
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// 具体的处理函数,可以根据业务需求实现
|
||
|
|
|
||
|
|
// handleBitgetAccountUpdate 处理账户更新的具体逻辑
|
||
|
|
func handleBitgetAccountUpdate(data interface{}, listenType int, apiKey string) {
|
||
|
|
// TODO: 实现具体的账户更新处理逻辑
|
||
|
|
log.Info("处理Bitget账户更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetOrderUpdate 处理订单更新的具体逻辑
|
||
|
|
func handleBitgetOrderUpdate(data interface{}, listenType int, apiKey string) {
|
||
|
|
// TODO: 实现具体的订单更新处理逻辑
|
||
|
|
log.Info("处理Bitget订单更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
|
||
|
|
|
||
|
|
// 这里可以参考binanceservice中的订单处理逻辑
|
||
|
|
// 例如:更新数据库中的订单状态、触发回调等
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetPositionUpdate 处理持仓更新的具体逻辑
|
||
|
|
func handleBitgetPositionUpdate(data interface{}, listenType int, apiKey string) {
|
||
|
|
// TODO: 实现具体的持仓更新处理逻辑
|
||
|
|
log.Info("处理Bitget持仓更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleBitgetBalanceUpdate 处理余额更新的具体逻辑
|
||
|
|
func handleBitgetBalanceUpdate(data interface{}, listenType int, apiKey string) {
|
||
|
|
// TODO: 实现具体的余额更新处理逻辑
|
||
|
|
log.Info("处理Bitget余额更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
|
||
|
|
}
|
||
|
|
|
||
|
|
// getBitgetWsTypeName 获取WebSocket类型名称
|
||
|
|
func getBitgetWsTypeName(listenType int) string {
|
||
|
|
switch listenType {
|
||
|
|
case 0:
|
||
|
|
return "现货"
|
||
|
|
case 1:
|
||
|
|
return "合约"
|
||
|
|
default:
|
||
|
|
return "未知"
|
||
|
|
}
|
||
|
|
}
|