stappabot/scryfall.go

108 lines
2.9 KiB
Go

package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
type CardSearchResults struct {
TotalCards int `json:"total_cards"`
HasMore bool `json:"has_more"`
Data []CardData `json:"data"`
NextPage string `json:"next_page"`
}
type CardImage struct {
Small string `json:"small"`
Normal string `json:"normal"`
Large string `json:"large"`
Png string `json:"png"`
ArtCrop string `json:"art_crop"`
BorderCrop string `json:"border_crop"`
}
type CardFaces struct {
ImageUris CardImage `json:"image_uris"`
}
type CardData struct {
ID string `json:"id"`
Name string `json:"name"`
URI string `json:"uri"`
ScryfallURI string `json:"scryfall_uri"`
Layout string `json:"layout"`
HighresImage bool `json:"highres_image"`
ImageUris CardImage `json:"image_uris"`
CardFaces []CardFaces `json:"card_faces"`
Eur string `json:"eur"`
EdhrecRank *int `json:"edhrec_rank"`
RelatedUris struct {
Gatherer string `json:"gatherer"`
TcgplayerDecks string `json:"tcgplayer_decks"`
Edhrec string `json:"edhrec"`
Mtgtop8 string `json:"mtgtop8"`
} `json:"related_uris"`
PurchaseUris struct {
Amazon string `json:"amazon"`
Ebay string `json:"ebay"`
Tcgplayer string `json:"tcgplayer"`
Cardmarket string `json:"cardmarket"`
Cardhoarder string `json:"cardhoarder"`
CardKingdom string `json:"card_kingdom"`
MtgoTraders string `json:"mtgo_traders"`
Coolstuffinc string `json:"coolstuffinc"`
} `json:"purchase_uris"`
}
var netClient = &http.Client{
Timeout: time.Second * 20,
}
func scryfallSearch(query string, offset int) (results CardSearchResults, err error) {
query = url.QueryEscape(query)
page := offset / 175
cardoffset := offset % 175
requrl := fmt.Sprintf("https://api.scryfall.com/cards/search?include_multilingual=true&order=name&page=%d&q=%s", page, query)
response, err := netClient.Get(requrl)
if err != nil {
return
}
defer response.Body.Close()
err = json.NewDecoder(response.Body).Decode(&results)
maxoffset := cardoffset + 50
if maxoffset > len(results.Data) {
maxoffset = len(results.Data)
}
results.Data = results.Data[cardoffset:maxoffset]
return
}
func scryfallGetCardByName(cardname string) (card CardData, err error) {
cardname = url.QueryEscape(cardname)
requrl := fmt.Sprintf("https://api.scryfall.com/cards/named?fuzzy=%s", cardname)
response, err := netClient.Get(requrl)
if err != nil {
return
}
defer response.Body.Close()
err = json.NewDecoder(response.Body).Decode(&card)
return
}
func scryfallGetCardByID(id string) (card CardData, err error) {
requrl := fmt.Sprintf("https://api.scryfall.com/cards/%s", id)
response, err := netClient.Get(requrl)
if err != nil {
return
}
defer response.Body.Close()
err = json.NewDecoder(response.Body).Decode(&card)
return
}