github.com/hungdoo/bot@v0.0.0-20240325145135-dd1f386f7b81/src/packages/bybitapi/client.go (about)

     1  package bybitapi
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"time"
     9  )
    10  
    11  type IdoResponse struct {
    12  	Success bool   `json:"success"`
    13  	Mesage  string `json:"ret_msg"`
    14  	Result  struct {
    15  		ProjectList []Project `json:"projectList"`
    16  	} `json:"result"`
    17  }
    18  
    19  type Project struct {
    20  	Name                  string   `json:"name"`
    21  	RegistrationEndTime   UnixTime `json:"registrationEndTime"`
    22  	RegistrationStartTime UnixTime `json:"registrationStartTime"`
    23  	StartTime             UnixTime `json:"startTime"`
    24  	EndTime               UnixTime `json:"endTime"`
    25  	SnapshotStartTime     UnixTime `json:"snapshotStartTime"`
    26  	SnapshotEndTime       UnixTime `json:"snapshotEndTime"`
    27  }
    28  
    29  var IDO_URL = "https://api2.bybit.com/spot/api/web3/ido/v1/project/list"
    30  
    31  func FetchProjects(url string) ([]Project, error) {
    32  	resp, err := http.Get(url)
    33  	if err != nil {
    34  		return nil, fmt.Errorf("failed to make request: %w", err)
    35  	}
    36  	defer resp.Body.Close()
    37  
    38  	bodyBytes, err := io.ReadAll(resp.Body)
    39  	if err != nil {
    40  		return nil, fmt.Errorf("failed to read response body: %w", err)
    41  	}
    42  
    43  	var res IdoResponse
    44  	err = json.Unmarshal(bodyBytes, &res)
    45  	if err != nil {
    46  		return nil, fmt.Errorf("failed to unmarshal JSON: %w", err)
    47  	}
    48  
    49  	if !res.Success {
    50  		return nil, fmt.Errorf("fetch failed: %s", res.Mesage)
    51  	}
    52  
    53  	return res.Result.ProjectList, nil
    54  }
    55  
    56  func GetUpcomingProjects(url string, since time.Time) ([]Project, error) {
    57  	projects, err := FetchProjects(url)
    58  	if err != nil {
    59  		return nil, fmt.Errorf("failed to FetchProjects: %w", err)
    60  	}
    61  
    62  	var upcomings []Project
    63  	for _, j := range projects {
    64  		if since.Before(j.RegistrationEndTime.Time) {
    65  			upcomings = append(upcomings, j)
    66  		}
    67  	}
    68  	return upcomings, nil
    69  }
    70  
    71  func GetLatestProject(url string) (*Project, error) {
    72  	projects, err := FetchProjects(url)
    73  	if err != nil {
    74  		return nil, fmt.Errorf("failed to FetchProjects: %w", err)
    75  	}
    76  
    77  	var latestIdx = int(0)
    78  	for i := 1; i < len(projects); i++ {
    79  		if projects[i].RegistrationEndTime.Time.After(projects[latestIdx].RegistrationEndTime.Time) {
    80  			latestIdx = i
    81  		}
    82  	}
    83  	return &projects[latestIdx], nil
    84  }