85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
|
package pancakeswapnft
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"github.com/pkg/errors"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type Profile struct {
|
||
|
Address string `json:"address"`
|
||
|
Username string `json:"username"`
|
||
|
Leaderboard struct {
|
||
|
Global string `json:"global"`
|
||
|
Team string `json:"team"`
|
||
|
Volume int `json:"volume"`
|
||
|
NextRank string `json:"next_rank"`
|
||
|
} `json:"leaderboard"`
|
||
|
LeaderboardFantoken struct {
|
||
|
Global string `json:"global"`
|
||
|
Team string `json:"team"`
|
||
|
Volume int `json:"volume"`
|
||
|
NextRank string `json:"next_rank"`
|
||
|
} `json:"leaderboard_fantoken"`
|
||
|
CreatedAt time.Time `json:"created_at"`
|
||
|
UpdatedAt time.Time `json:"updated_at"`
|
||
|
}
|
||
|
|
||
|
func getUsernameFromAddress(address string) (string, error) {
|
||
|
resp, err := http.Get(fmt.Sprintf("https://profile.pancakeswap.com/api/users/%s", address))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
defer func(Body io.ReadCloser) {
|
||
|
_ = Body.Close()
|
||
|
}(resp.Body)
|
||
|
|
||
|
raw, err := io.ReadAll(resp.Body)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
if resp.StatusCode != http.StatusOK {
|
||
|
return "", errors.Errorf("non 200 http status : %d / raw : %s", resp.StatusCode, raw)
|
||
|
}
|
||
|
var profile Profile
|
||
|
err = json.NewDecoder(bytes.NewReader(raw)).Decode(&profile)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return profile.Username, nil
|
||
|
}
|
||
|
|
||
|
type ProfileService struct {
|
||
|
cache map[string]string
|
||
|
lock *sync.Mutex
|
||
|
}
|
||
|
|
||
|
func NewProfileService() *ProfileService {
|
||
|
return &ProfileService{
|
||
|
cache: make(map[string]string),
|
||
|
lock: &sync.Mutex{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *ProfileService) GetUsername(address string) (string, error) {
|
||
|
s.lock.Lock()
|
||
|
defer s.lock.Unlock()
|
||
|
if name, ok := s.cache[address]; ok {
|
||
|
return name, nil
|
||
|
}
|
||
|
|
||
|
name, err := getUsernameFromAddress(address)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
s.cache[address] = name
|
||
|
|
||
|
return name, nil
|
||
|
}
|