pcgamedb/crawler/game.go

172 lines
4.1 KiB
Go
Raw Permalink Normal View History

2024-09-24 06:17:11 -04:00
package crawler
import (
"errors"
"regexp"
"strings"
"time"
2024-11-20 06:09:04 -05:00
"pcgamedb/db"
"pcgamedb/model"
"pcgamedb/utils"
2024-11-15 02:02:45 -05:00
"go.uber.org/zap"
2024-09-24 06:17:11 -04:00
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
)
func GenerateGameInfo(platform string, id int) (*model.GameInfo, error) {
switch platform {
case "steam":
return GenerateSteamGameInfo(id)
case "igdb":
return GenerateIGDBGameInfo(id)
default:
return nil, errors.New("invalid ID type")
2024-09-24 06:17:11 -04:00
}
}
// OrganizeGameItem Organize game item and save game info to database
func OrganizeGameItem(game *model.GameItem) error {
hasOriganized, _ := db.HasGameItemOrganized(game.ID)
if hasOriganized {
return nil
}
item, err := OrganizeGameItemWithIGDB(game)
2024-09-24 06:17:11 -04:00
if err == nil {
if item.SteamID == 0 {
// get steam id from igdb
steamID, err := GetSteamIDByIGDBID(item.IGDBID)
2024-09-24 06:17:11 -04:00
if err == nil {
item.SteamID = steamID
}
}
err = db.SaveGameInfo(item)
if err != nil {
return err
}
return nil
2024-09-24 06:17:11 -04:00
}
return err
2024-09-24 06:17:11 -04:00
}
func AddGameInfoManually(gameID primitive.ObjectID, platform string, plateformID int) (*model.GameInfo, error) {
info, err := GenerateGameInfo(platform, plateformID)
if err != nil {
return nil, err
}
info.GameIDs = append(info.GameIDs, gameID)
info.GameIDs = utils.Unique(info.GameIDs)
return info, db.SaveGameInfo(info)
}
func OrganizeGameItemManually(gameID primitive.ObjectID, platform string, platformID int) (*model.GameInfo, error) {
2024-09-24 06:17:11 -04:00
info, err := db.GetGameInfoByPlatformID(platform, platformID)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
2024-09-24 06:17:11 -04:00
info, err = AddGameInfoManually(gameID, platform, platformID)
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
info.GameIDs = append(info.GameIDs, gameID)
info.GameIDs = utils.Unique(info.GameIDs)
err = db.SaveGameInfo(info)
if err != nil {
return nil, err
}
if platform == "igdb" {
steamID, err := GetSteamIDByIGDBID(platformID)
2024-09-24 06:17:11 -04:00
if err == nil {
info.SteamID = steamID
}
}
if platform == "steam" {
igdbID, err := GetIGDBIDBySteamAppID(platformID)
2024-09-24 06:17:11 -04:00
if err == nil {
info.IGDBID = igdbID
}
}
return info, nil
}
func FormatName(name string) string {
name = regexp.MustCompile(`(?i)[\w'-]+\s(Edition|Vision|Collection|Bundle|Pack|Deluxe)`).ReplaceAllString(name, " ")
name = regexp.MustCompile(`(?i)GOTY`).ReplaceAllString(name, "")
name = regexp.MustCompile(`(?i)nsw for pc`).ReplaceAllString(name, "")
name = regexp.MustCompile(`\([^)]+\)`).ReplaceAllString(name, "")
2024-09-24 06:17:11 -04:00
name = regexp.MustCompile(`\s+`).ReplaceAllString(name, " ")
name = strings.Replace(name, ": Remastered", "", -1)
name = strings.Replace(name, ": Remaster", "", -1)
name = strings.TrimSpace(name)
name = strings.Trim(name, ":")
return name
}
func SupplementPlatformIDToGameInfo(logger *zap.Logger) error {
2024-09-24 06:17:11 -04:00
infos, err := db.GetAllGameInfos()
if err != nil {
return err
}
for _, info := range infos {
changed := false
if info.IGDBID != 0 && info.SteamID == 0 {
steamID, err := GetSteamIDByIGDBID(info.IGDBID)
2024-09-24 06:17:11 -04:00
time.Sleep(time.Millisecond * 100)
if err != nil {
continue
}
info.SteamID = steamID
changed = true
}
if info.SteamID != 0 && info.IGDBID == 0 {
igdbID, err := GetIGDBIDBySteamAppID(info.SteamID)
2024-09-24 06:17:11 -04:00
time.Sleep(time.Millisecond * 100)
if err != nil {
continue
}
info.IGDBID = igdbID
changed = true
}
if changed {
logger.Info("supp", zap.String("name", info.Name), zap.Int("igdb", info.IGDBID), zap.Int("steam", info.SteamID))
2024-09-24 06:17:11 -04:00
_ = db.SaveGameInfo(info)
} else {
logger.Info("skip", zap.String("name", info.Name), zap.Int("igdb", info.IGDBID), zap.Int("steam", info.SteamID))
2024-09-24 06:17:11 -04:00
}
}
return nil
}
func UpdateGameInfo(num int) (chan *model.GameInfo, error) {
infos, err := db.GetOutdatedGameInfos(num)
if err != nil {
return nil, err
}
updateChan := make(chan *model.GameInfo)
go func() {
for _, info := range infos {
if info.IGDBID != 0 {
newInfo, err := GenerateIGDBGameInfo(info.IGDBID)
if err != nil {
continue
}
db.MergeGameInfo(info, newInfo)
err = db.SaveGameInfo(newInfo)
if err != nil {
continue
}
updateChan <- newInfo
}
}
}()
return updateChan, nil
}