112 lines
1.9 KiB
Go
112 lines
1.9 KiB
Go
package background
|
|
|
|
import (
|
|
"git.trj.tw/golang/mtgbot/models"
|
|
"git.trj.tw/golang/mtgbot/modules/apiact"
|
|
"git.trj.tw/golang/mtgbot/modules/pool"
|
|
"git.trj.tw/golang/utils"
|
|
)
|
|
|
|
func runMTGPriceJob() {
|
|
api, err := apiact.NewTCGApi("v1.19.0")
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = api.GetToken()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
numSets, err := models.CountSets(models.ListSetsOpts{})
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
sets, err := models.ListSets(models.ListSetsOpts{
|
|
Limit: numSets,
|
|
})
|
|
if err != nil {
|
|
return
|
|
}
|
|
_ = sets
|
|
|
|
pool := pool.NewPool(5)
|
|
|
|
for _, set := range sets {
|
|
pool.Add()
|
|
go getPriceFromAPI(pool, api, set.TCGPlayerID)
|
|
}
|
|
|
|
pool.Wait()
|
|
}
|
|
|
|
func getPriceFromAPI(pool *pool.Pool, api *apiact.TCGPlayer, groupid int) {
|
|
defer pool.Done()
|
|
|
|
prices, err := api.ListGroupProductPrice(groupid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
ids := make([]int, 0, len(prices))
|
|
|
|
type cPrice struct {
|
|
CardID string
|
|
PriceN float32
|
|
PriceF float32
|
|
}
|
|
|
|
cardMap := make(map[int]cPrice)
|
|
|
|
for _, v := range prices {
|
|
if utils.SliceIndex(len(ids), func(idx int) bool { return ids[idx] == v.ProductID }) == -1 {
|
|
ids = append(ids, v.ProductID)
|
|
}
|
|
|
|
s, ok := cardMap[v.ProductID]
|
|
if !ok {
|
|
s = cPrice{}
|
|
}
|
|
if v.SubTypeName == "Normal" {
|
|
s.PriceN = v.MidPrice
|
|
} else {
|
|
s.PriceF = v.MidPrice
|
|
}
|
|
|
|
cardMap[v.ProductID] = s
|
|
}
|
|
|
|
cards, err := models.GetCardByTCGPlayerIDs(ids)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range cards {
|
|
if s, ok := cardMap[v.TCGPlayerID]; ok {
|
|
s.CardID = v.ID
|
|
cardMap[v.TCGPlayerID] = s
|
|
}
|
|
}
|
|
|
|
insOpts := models.InsertCardPriceOpts{}
|
|
|
|
insOpts.Data = make([]models.CardPrice, 0, len(cardMap))
|
|
|
|
for _, v := range cardMap {
|
|
if len(v.CardID) > 0 {
|
|
insOpts.Data = append(insOpts.Data, models.CardPrice{
|
|
Card: v.CardID,
|
|
PriceN: v.PriceN,
|
|
PriceF: v.PriceF,
|
|
})
|
|
}
|
|
}
|
|
|
|
models.InsertCardPrice(insOpts)
|
|
|
|
cardMap = nil
|
|
prices = nil
|
|
|
|
return
|
|
}
|