github.com/wtfutil/wtf@v0.43.0/modules/steam/client.go (about)

     1  package steam
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  )
     9  
    10  type Steam struct {
    11  	client  *http.Client
    12  	baseUrl string
    13  }
    14  
    15  type ClientOpts struct {
    16  	key     string
    17  	baseUrl string
    18  }
    19  
    20  func NewClient(opts *ClientOpts) *Steam {
    21  	baseUrl := opts.baseUrl
    22  
    23  	if opts.baseUrl == "" {
    24  		baseUrl = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key="
    25  	}
    26  
    27  	baseUrl += opts.key + "&steamids="
    28  
    29  	return &Steam{
    30  		client:  &http.Client{},
    31  		baseUrl: baseUrl,
    32  	}
    33  }
    34  
    35  type Player struct {
    36  	Personaname   string `json:"personaname"`
    37  	ProfileUrl    string `json:"profileurl"`
    38  	Personastate  int    `json:"personastate"`
    39  	Gameextrainfo string `json:"gameextrainfo"`
    40  }
    41  
    42  type SteamResponse struct {
    43  	Response struct {
    44  		Players []Player `json:"players"`
    45  	} `json:"response"`
    46  }
    47  
    48  func (s *Steam) Status(steamID string) (*Player, error) {
    49  	resp, err := s.fetch(steamID)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	var response SteamResponse
    55  
    56  	if err := json.Unmarshal(resp, &response); err != nil {
    57  		return nil, err
    58  	}
    59  
    60  	return &response.Response.Players[0], nil
    61  }
    62  
    63  func (s *Steam) fetch(id string) ([]byte, error) {
    64  	resp, err := http.Get(s.baseUrl + id)
    65  
    66  	if err != nil || resp.StatusCode != 200 {
    67  		return nil, fmt.Errorf("error fetching %s steam status: %v, status: %d", id, err, resp.StatusCode)
    68  	}
    69  
    70  	defer resp.Body.Close()
    71  	return io.ReadAll(resp.Body)
    72  }