109 lines
1.8 KiB
Go
109 lines
1.8 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)
|
||
|
|
||
|
return
|
||
|
}
|