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 }