Parcourir la source

[dev]defi的networks,price,mutilPrice工具实现

Zhangzhenhua il y a 2 semaines
Parent
commit
00abf4f063

+ 17 - 7
internal/library/birdeye/common.go

@@ -2,20 +2,30 @@ package birdeye
 
 import (
 	"birdcall/internal/consts"
+	"io"
 	"net/http"
 	"os"
 )
 
-type CommonRes struct {
-	Success bool        `json:"success" dc:"是否成功"`
-	Data    interface{} `json:"data"    dc:"数据"`
-}
-
-func MakeHeader(req *http.Request, chainName string) *http.Request {
+func MakeHeader(req *http.Request, chain_name ...string) *http.Request {
 	apiKey := os.Getenv(consts.BIRD_EYE_API_KEY)
 
 	req.Header.Add(consts.ACCEPT, consts.APPLICATION_JSON)
-	req.Header.Add(consts.X_CHAIN, chainName)
 	req.Header.Add(consts.X_API_KEY, apiKey)
+	if len(chain_name) > 0 {
+		req.Header.Add(consts.X_CHAIN, chain_name[0])
+	}
 	return req
 }
+
+//	 sendRequest
+//		@param req
+func SendRequest(req *http.Request) ([]byte, error) {
+	apiRes, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return nil, err
+	}
+
+	body, _ := io.ReadAll(apiRes.Body)
+	return body, nil
+}

+ 71 - 48
internal/library/birdeye/defi/defi.go

@@ -1,7 +1,8 @@
 package defi
 
 import (
-	"io"
+	"bytes"
+	"encoding/json"
 	"net/http"
 	"net/url"
 	"os"
@@ -10,50 +11,52 @@ import (
 
 	"birdcall/internal/consts"
 	"birdcall/internal/library/birdeye"
-	"encoding/json"
+	"birdcall/internal/model/birdeye/defi"
 )
 
-type Defi struct {
-	Address          []string ` json:"address" dc:"代币地址"`
-	Chain            string   ` json:"chain" dc:"链名"`
-	CheckLiquidity   float64  ` json:"check_liquidity" dc:"流动性验证"`
-	IncludeLiquidity bool     ` json:"include_liquidity" dc:"是否返回流动数据" `
-}
+type Defi struct{}
 
-func (d *Defi) Support() (*birdeye.CommonRes, error) {
+// 获取当前支持的网络
+// @return *birdeye.CommonRes
+// @return error
+func (d *Defi) Support() (*defi.NetWorkRes, error) {
 	//构建基本请求连接
 	baseURL := os.Getenv(consts.DEFI_URL)
 	fullURL := baseURL + consts.NET_WORKS
 
-	apiReq, err := http.NewRequest("GET", fullURL, nil)
+	apiReq, err := http.NewRequest(consts.GET, fullURL, nil)
 	if err != nil {
 		return nil, err
 	}
-	//构建请求头
-	apiReq = birdeye.MakeHeader(apiReq, d.Chain)
-
-	apiRes, err := http.DefaultClient.Do(apiReq)
+	//构建并发送请求
+	apiReq = birdeye.MakeHeader(apiReq)
+	body, err := birdeye.SendRequest(apiReq)
 	if err != nil {
 		return nil, err
 	}
 
-	//处理结果
-	body, _ := io.ReadAll(apiRes.Body)
-	var commonRes *birdeye.CommonRes
-	err = json.Unmarshal(body, &commonRes)
+	//处理返回数据
+	var res *defi.NetWorkRes
+	err = json.Unmarshal([]byte(body), &res)
 	if err != nil {
 		return nil, err
 	}
-	return commonRes, nil
+	return res, nil
 }
 
-func (d *Defi) Price() (*birdeye.CommonRes, error) {
+//	 Price 获取token的价格
+//		@param check_liquidity
+//		@param include_liquidity
+//		@param address
+//		@return *birdeye.CommonRes
+//		@return error
+func (d *Defi) Price(chain_name string, check_liquidity float64, include_liquidity bool, address string) (*defi.PriceRes, error) {
 	//构建基本请求连接
 	baseURL := os.Getenv(consts.DEFI_URL)
 	params := url.Values{}
-	params.Add(consts.CheckLiquidity, strconv.FormatFloat(d.CheckLiquidity, 'f', 2, 64))
-	params.Add(consts.IncludeLiquidity, strconv.FormatBool(d.IncludeLiquidity))
-	params.Add(consts.ADDRESS, d.Address[0])
+	params.Add(consts.CheckLiquidity, strconv.FormatFloat(check_liquidity, 'f', 2, 64))
+	params.Add(consts.IncludeLiquidity, strconv.FormatBool(include_liquidity))
+	params.Add(consts.ADDRESS, address)
 	fullURL := baseURL + consts.PRICE + consts.QUESTION_MARK + params.Encode()
 
 	apiReq, err := http.NewRequest(consts.GET, fullURL, nil)
@@ -62,54 +65,74 @@ func (d *Defi) Price() (*birdeye.CommonRes, error) {
 	}
 
 	//构建请求头
-	apiReq = birdeye.MakeHeader(apiReq, d.Chain)
+	apiReq = birdeye.MakeHeader(apiReq, chain_name)
 
-	//发送请求
-	apiRes, err := http.DefaultClient.Do(apiReq)
+	body, err := birdeye.SendRequest(apiReq)
 	if err != nil {
 		return nil, err
 	}
-
-	//处理结果
-	body, _ := io.ReadAll(apiRes.Body)
-	var commonRes *birdeye.CommonRes
-	err = json.Unmarshal(body, &commonRes)
+	//处理返回数据
+	var res *defi.PriceRes
+	err = json.Unmarshal([]byte(body), &res)
 	if err != nil {
 		return nil, err
 	}
-	return commonRes, nil
+	return res, nil
 }
 
-func (d *Defi) MultiplePrice() (*birdeye.CommonRes, error) {
+// dc:一次获取多个token的价格
+// @return *birdeye.CommonRes
+// @return error
+func (d *Defi) MultiplePrice(chain_name string, check_liquidity float64, include_liquidity bool, address []string, method string) (*defi.MultiplePriceRes, error) {
 	//构建基本请求连接
 	baseURL := os.Getenv(consts.DEFI_URL)
 	params := url.Values{}
-	params.Add(consts.CheckLiquidity, strconv.FormatFloat(d.CheckLiquidity, 'f', 2, 64))
-	params.Add(consts.IncludeLiquidity, strconv.FormatBool(d.IncludeLiquidity))
-	addresses := strings.Join(d.Address, consts.COMMAS)
-	params.Add(consts.LIST_ADDRESS, addresses)
+	params.Add(consts.CheckLiquidity, strconv.FormatFloat(check_liquidity, 'f', 2, 64))
+	params.Add(consts.IncludeLiquidity, strconv.FormatBool(include_liquidity))
+
+	var ApiReq *http.Request
+	var payload *bytes.Buffer = nil
+
+	//判断请求类型
+	if method == consts.GET {
+		addresses := strings.Join(address, consts.COMMAS)
+		params.Add(consts.LIST_ADDRESS, addresses)
+	} else if method == consts.POST {
+		data, err := json.Marshal(address)
+		if err != nil {
+			return nil, err
+		}
+		payload = bytes.NewBuffer(data)
+	}
+
 	fullURL := baseURL + consts.MULTIPLE_PRICE + consts.QUESTION_MARK + params.Encode()
 
-	apiReq, err := http.NewRequest(consts.GET, fullURL, nil)
-	if err != nil {
-		return nil, err
+	if method == consts.GET {
+		apiReq, err := http.NewRequest(method, fullURL, nil)
+		if err != nil {
+			return nil, err
+		}
+		ApiReq = apiReq
+	} else if method == consts.POST {
+		apiReq, err := http.NewRequest(method, fullURL, payload)
+		if err != nil {
+			return nil, err
+		}
+		ApiReq = apiReq
 	}
 
 	//构建请求头
-	apiReq = birdeye.MakeHeader(apiReq, d.Chain)
+	ApiReq = birdeye.MakeHeader(ApiReq, chain_name)
 
 	//发送请求
-	apiRes, err := http.DefaultClient.Do(apiReq)
+	body, err := birdeye.SendRequest(ApiReq)
 	if err != nil {
 		return nil, err
 	}
-
-	//处理结果
-	body, _ := io.ReadAll(apiRes.Body)
-	var commonRes *birdeye.CommonRes
-	err = json.Unmarshal(body, &commonRes)
+	var res *defi.MultiplePriceRes
+	err = json.Unmarshal([]byte(body), &res)
 	if err != nil {
 		return nil, err
 	}
-	return commonRes, nil
+	return res, nil
 }

+ 5 - 9
internal/logic/chain/chain.go

@@ -2,6 +2,7 @@ package chain
 
 import (
 	v1 "birdcall/api/chain/v1"
+	"birdcall/internal/consts"
 	"birdcall/internal/library/birdeye/defi"
 	"birdcall/internal/service"
 	"context"
@@ -15,8 +16,10 @@ func init() {
 	service.RegisterChain(&sChain{})
 }
 
+var dm defi.Defi
+
 func (s *sChain) NetWork(ctx context.Context, req *v1.NetWorkReq) (*v1.CommonRes, error) {
-	dm := new(defi.Defi)
+
 	birdRes, err := dm.Support()
 	if err != nil {
 		return nil, err
@@ -31,17 +34,10 @@ func (s *sChain) NetWork(ctx context.Context, req *v1.NetWorkReq) (*v1.CommonRes
 }
 
 func (s *sChain) TokenPrice(ctx context.Context, req *v1.TokenPriceReq) (*v1.CommonRes, error) {
-	dm := new(defi.Defi)
-	dm.Address = req.Address
-	dm.Chain = req.ChainName
-	dm.CheckLiquidity = 100
-	dm.IncludeLiquidity = true
-
-	birdRes, err := dm.Price()
+	birdRes, err := dm.MultiplePrice(req.ChainName, 100, true, req.Address, consts.GET)
 	if err != nil {
 		return nil, err
 	}
-
 	var res *v1.CommonRes
 	err = gconv.Struct(birdRes, &res)
 	if err != nil {

+ 24 - 0
internal/model/birdeye/defi/defi.go

@@ -0,0 +1,24 @@
+package defi
+
+type NetWorkRes struct {
+	Success bool     `json:"success" dc:"是否成功"`
+	Data    []string `json:"data"`
+}
+
+type PriceRes struct {
+	Success bool  `json:"success" dc:"是否成功"`
+	Data    Price `json:"data"`
+}
+
+type MultiplePriceRes struct {
+	Success bool             `json:"success" dc:"是否成功"`
+	Prices  map[string]Price `json:"prices"`
+}
+
+type Price struct {
+	Success         bool    `json:"success" dc:"是否成功"`
+	Value           float64 `json:"value"`
+	UpdateUnixTime  uint32  `json:"updateUnixTime"`
+	UpdateHumanTime string  `json:"updateHumanTime"`
+	PriceChange24h  float64 `json:"priceChange24h"`
+}