Files
exchange_go/services/excservice/bitget_receive.go
2025-10-14 19:58:59 +08:00

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 "未知"
}
}