github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/release/winbuild/winbuild.go (about)

     1  package winbuild
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"net/url"
    10  )
    11  
    12  const (
    13  	buildNumAPIUrl = "https://keybase.io/_/api/1.0/pkg/build_number.json"
    14  )
    15  
    16  type buildNumberResponse struct {
    17  	Status struct {
    18  		Code int    `json:"code"`
    19  		Name string `json:"name"`
    20  	} `json:"status"`
    21  	BuildNumber int `json:"build_number"`
    22  }
    23  
    24  func GetNextBuildNumber(keybaseToken string, version string, botID string, platform string) error {
    25  
    26  	form := url.Values{}
    27  	form.Set("version", version)
    28  	form.Add("bot_id", botID)
    29  	form.Add("platform", platform)
    30  	req, err := http.NewRequest("POST", buildNumAPIUrl, bytes.NewBufferString(form.Encode()))
    31  	if err != nil {
    32  		return fmt.Errorf("newrequest failed, %v", err)
    33  	}
    34  	req.Header.Add("X-keybase-admin-token", keybaseToken)
    35  	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    36  	client := &http.Client{}
    37  	resp, err := client.Do(req)
    38  	if err != nil {
    39  		return fmt.Errorf("request failed, %v", err)
    40  	}
    41  	defer resp.Body.Close()
    42  
    43  	body, err := io.ReadAll(resp.Body)
    44  	if err != nil {
    45  		return fmt.Errorf("body err, %v", err)
    46  	}
    47  
    48  	var reply buildNumberResponse
    49  	if err := json.Unmarshal(body, &reply); err != nil {
    50  		return fmt.Errorf("json reply err, %v", err)
    51  	}
    52  
    53  	if reply.Status.Code != 0 {
    54  		return fmt.Errorf("Server returned failure, %s", body)
    55  	}
    56  
    57  	fmt.Printf("%d\n", reply.BuildNumber)
    58  	return nil
    59  }