diff --git a/achievement.go b/achievement.go index 67ddead..a39e84f 100644 --- a/achievement.go +++ b/achievement.go @@ -48,8 +48,8 @@ func (s *Scraper) buildAchievementCollector(aai *AllAchievementInfo, output chan NamedEntity: &models.NamedEntity{}, } - achievement := s.dataProvider.Achievement(name) - if achievement != nil { + achievement, err := s.dataProvider.Achievement(name) + if err == nil { nextAchievement.NamedEntity = achievement } diff --git a/character.go b/character.go index ac8f272..8c6280e 100644 --- a/character.go +++ b/character.go @@ -51,16 +51,19 @@ func (s *Scraper) buildCharacterCollector( gcName := values[0] gcRank := gcrank.Parse(values[1]) - gc := s.dataProvider.GrandCompany(gcName) - - charData.GrandCompanyInfo = &GrandCompanyInfo{GrandCompany: gc, RankID: gcRank} + gc, err := s.dataProvider.GrandCompany(gcName) + if err == nil { + charData.GrandCompanyInfo = &GrandCompanyInfo{GrandCompany: gc, RankID: gcRank} + } }) charData.GuardianDeity = &IconedNamedEntity{} c.OnHTML(charSelectors.GuardianDeity.Name.Selector, func(e *colly.HTMLElement) { name := charSelectors.GuardianDeity.Name.Parse(e)[0] - d := s.dataProvider.Deity(name) - charData.GuardianDeity.NamedEntity = d + d, err := s.dataProvider.Deity(name) + if err == nil { + charData.GuardianDeity.NamedEntity = d + } }) c.OnHTML(charSelectors.GuardianDeity.Icon.Selector, func(e *colly.HTMLElement) { charData.GuardianDeity.Icon = charSelectors.GuardianDeity.Icon.Parse(e)[0] @@ -88,11 +91,15 @@ func (s *Scraper) buildCharacterCollector( // Miqo'te fix raceName := strings.ReplaceAll(values[0], "'", "'") - r := s.dataProvider.Race(raceName) - charData.Race = r + r, err := s.dataProvider.Race(raceName) + if err == nil { + charData.Race = r + } - t := s.dataProvider.Tribe(values[1]) - charData.Tribe = t + t, err := s.dataProvider.Tribe(values[1]) + if err == nil { + charData.Tribe = t + } charData.Gender = gender.Parse(values[2]) }) @@ -106,8 +113,7 @@ func (s *Scraper) buildCharacterCollector( c.OnHTML(charSelectors.Title.Selector, func(e *colly.HTMLElement) { titleText := charSelectors.Title.Parse(e)[0] - t := s.dataProvider.Title(titleText) - + t, _ := s.dataProvider.Title(titleText) if t != nil { charData.Title = &Title{ TitleInternal: t, @@ -137,9 +143,10 @@ func (s *Scraper) buildCharacterCollector( charData.Town = &IconedNamedEntity{} c.OnHTML(charSelectors.Town.Name.Selector, func(e *colly.HTMLElement) { name := charSelectors.Town.Name.Parse(e)[0] - t := s.dataProvider.Town(name) - - charData.Town.NamedEntity = t + t, err := s.dataProvider.Town(name) + if err == nil { + charData.Town.NamedEntity = t + } }) c.OnHTML(charSelectors.Town.Icon.Selector, func(e *colly.HTMLElement) { charData.Town.Icon = charSelectors.Town.Icon.Parse(e)[0] @@ -253,8 +260,8 @@ func (s *Scraper) buildCharacterCollector( }) c.OnHTML(currSelector.Stain.Selector, func(e *colly.HTMLElement) { name := currSelector.Stain.Parse(e)[0] - item := s.dataProvider.Item(name) - if item != nil { + item, err := s.dataProvider.Item(name) + if err == nil { currRef.Dye = item.ID } }) @@ -266,8 +273,8 @@ func (s *Scraper) buildCharacterCollector( name = name[0 : len(name)-3] } - item := s.dataProvider.Item(name) - if item != nil { + item, err := s.dataProvider.Item(name) + if err == nil { currRef.NamedEntity = item } }) @@ -282,8 +289,8 @@ func (s *Scraper) buildCharacterCollector( for _, materiaSelector := range materiaSelectors { materiaCallback := func(e *colly.HTMLElement) { name := materiaSelector.ParseInnerHTML(e)[0] - item := s.dataProvider.Item(name) - if item != nil { + item, err := s.dataProvider.Item(name) + if err == nil { currRef.Materia = append(currRef.Materia, item.ID) } } @@ -292,8 +299,8 @@ func (s *Scraper) buildCharacterCollector( c.OnHTML(currSelector.MirageName.Selector, func(e *colly.HTMLElement) { name := currSelector.MirageName.Parse(e)[0] - item := s.dataProvider.Item(name) - if item != nil { + item, err := s.dataProvider.Item(name) + if err == nil { currRef.Mirage = item.ID } }) @@ -301,8 +308,8 @@ func (s *Scraper) buildCharacterCollector( c.OnHTML(partSelectors.SoulCrystal.Name.Selector, func(e *colly.HTMLElement) { name := partSelectors.SoulCrystal.Name.Parse(e)[0] - item := s.dataProvider.Item(name) - if item != nil { + item, err := s.dataProvider.Item(name) + if err == nil { partRefs.SoulCrystal.NamedEntity = item } }) diff --git a/classjob.go b/classjob.go index d0670c0..799edbf 100644 --- a/classjob.go +++ b/classjob.go @@ -94,18 +94,24 @@ func (s *Scraper) buildClassJobCollector(charData *Character) *colly.Collector { curCj.IsSpecialized = strings.Contains(e.Attr("class"), "meister") - jobInfo := s.dataProvider.ClassJob(names[0]) - curCj.JobID = uint8(jobInfo.ID) + jobInfo, err := s.dataProvider.ClassJob(names[0]) + if err == nil { + curCj.JobID = uint8(jobInfo.ID) + } if len(names) > 1 { - classInfo := s.dataProvider.ClassJob(names[1]) - curCj.ClassID = uint8(classInfo.ID) + classInfo, err := s.dataProvider.ClassJob(names[1]) + if err == nil { + curCj.ClassID = uint8(classInfo.ID) + } } else { curCj.ClassID = uint8(curCj.JobID) } - cjInfo := s.dataProvider.ClassJob(curCj.UnlockedState.Name) - curCj.UnlockedState.ID = uint8(cjInfo.ID) + cjInfo, err := s.dataProvider.ClassJob(curCj.UnlockedState.Name) + if err == nil { + curCj.UnlockedState.ID = uint8(cjInfo.ID) + } }) charData.ClassJobs = append(charData.ClassJobs, &curCj) diff --git a/freecompany.go b/freecompany.go index f0b5b7d..204e05d 100644 --- a/freecompany.go +++ b/freecompany.go @@ -181,8 +181,10 @@ func (s *Scraper) buildFreeCompanyCollector(fc *FreeCompany) *colly.Collector { rep := &FreeCompanyReputation{} c.OnHTML(curRep.Name.Selector, func(e *colly.HTMLElement) { gcName := curRep.Name.Parse(e)[0] - gc := s.dataProvider.GrandCompany(gcName) - rep.GrandCompany = gc + gc, err := s.dataProvider.GrandCompany(gcName) + if err == nil { + rep.GrandCompany = gc + } }) c.OnHTML(curRep.Progress.Selector, func(e *colly.HTMLElement) { progressStr := curRep.Progress.Parse(e)[0] @@ -193,8 +195,10 @@ func (s *Scraper) buildFreeCompanyCollector(fc *FreeCompany) *colly.Collector { }) c.OnHTML(curRep.Rank.Selector, func(e *colly.HTMLElement) { repName := curRep.Rank.Parse(e)[0] - r := s.dataProvider.Reputation(repName) - rep.Rank = r + r, err := s.dataProvider.Reputation(repName) + if err == nil { + rep.Rank = r + } }) fc.Reputation = append(fc.Reputation, rep) diff --git a/go.sum b/go.sum index a7255c7..4ab9cc0 100644 --- a/go.sum +++ b/go.sum @@ -57,6 +57,7 @@ github.com/karashiiro/bingode v1.0.1 h1:zWZYkSDf4FYgncNZDyJIueQ5stE6EDbNogXJKJ9v github.com/karashiiro/bingode v1.0.1/go.mod h1:lzVTRMIEwNzxD46MOfDskypTi+zBu9QGrklE4cG+tLo= github.com/karashiiro/bingode v1.0.2 h1:0Ml10cqICBMWlwPSNf7YlTw6C0CpxDmeAf3BydrVlLc= github.com/karashiiro/bingode v1.0.2/go.mod h1:KvajV1nOhqF6CZyJZzPk3m7Pmt+4loFSdjLrEc/cBXY= +github.com/karashiiro/bingode v1.1.0 h1:EF3XULVRYyF/BhmnzpvUknYnTukibHtILwV7CY0XnVY= github.com/karashiiro/bingode v1.1.0/go.mod h1:KvajV1nOhqF6CZyJZzPk3m7Pmt+4loFSdjLrEc/cBXY= github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= diff --git a/mimo.go b/mimo.go index 146f713..30202b3 100644 --- a/mimo.go +++ b/mimo.go @@ -18,7 +18,7 @@ func (s *Scraper) buildMinionCollector(output chan *Minion) *colly.Collector { name := minionSelectors.Minions.Name.ParseThroughChildren(e)[0] icon := minionSelectors.Minions.Icon.ParseThroughChildren(e)[0] - m := s.dataProvider.Minion(name) + m, _ := s.dataProvider.Minion(name) if m == nil { output <- &Minion{ IconedNamedEntity: &IconedNamedEntity{ @@ -60,7 +60,7 @@ func (s *Scraper) buildMountCollector(output chan *Mount) *colly.Collector { name := mountSelectors.Mounts.Name.ParseThroughChildren(e)[0] icon := mountSelectors.Mounts.Icon.ParseThroughChildren(e)[0] - m := s.dataProvider.Mount(name) + m, _ := s.dataProvider.Mount(name) if m == nil { output <- &Mount{ IconedNamedEntity: &IconedNamedEntity{ diff --git a/provider/data-provider.go b/provider/data-provider.go index 19a1269..9fb7e1e 100644 --- a/provider/data-provider.go +++ b/provider/data-provider.go @@ -5,16 +5,16 @@ import "github.com/xivapi/godestone/v2/provider/models" // DataProvider represents a service implementation responsible for // converting our scraped data into a useful form. type DataProvider interface { - Achievement(name string) *models.NamedEntity - ClassJob(name string) *models.NamedEntity - Deity(name string) *models.NamedEntity - GrandCompany(name string) *models.NamedEntity - Item(name string) *models.NamedEntity - Minion(name string) *models.NamedEntity - Mount(name string) *models.NamedEntity - Race(name string) *models.GenderedEntity - Reputation(name string) *models.NamedEntity - Title(name string) *models.TitleInternal - Town(name string) *models.NamedEntity - Tribe(name string) *models.GenderedEntity + Achievement(name string) (*models.NamedEntity, error) + ClassJob(name string) (*models.NamedEntity, error) + Deity(name string) (*models.NamedEntity, error) + GrandCompany(name string) (*models.NamedEntity, error) + Item(name string) (*models.NamedEntity, error) + Minion(name string) (*models.NamedEntity, error) + Mount(name string) (*models.NamedEntity, error) + Race(name string) (*models.GenderedEntity, error) + Reputation(name string) (*models.NamedEntity, error) + Title(name string) (*models.TitleInternal, error) + Town(name string) (*models.NamedEntity, error) + Tribe(name string) (*models.GenderedEntity, error) } diff --git a/search-options.go b/search-options.go index a7c74a2..6b35737 100644 --- a/search-options.go +++ b/search-options.go @@ -57,18 +57,24 @@ func (s *CharacterOptions) BuildURI( if s.Tribe != "" || s.Race != "" { raceTribe := "" if s.Tribe != "" { - t := scraper.dataProvider.Tribe(s.Tribe) - raceTribe = fmt.Sprintf("tribe_%d", t.ID) + t, err := scraper.dataProvider.Tribe(s.Tribe) + if err == nil { + raceTribe = fmt.Sprintf("tribe_%d", t.ID) + } } else if s.Race != "" { - r := scraper.dataProvider.Race(s.Race) - raceTribe = fmt.Sprintf("race_%d", r.ID) + r, err := scraper.dataProvider.Race(s.Race) + if err == nil { + raceTribe = fmt.Sprintf("race_%d", r.ID) + } } uriFormat += fmt.Sprintf("&race_tribe=%s", raceTribe) } if s.GrandCompany != "" { - gc := scraper.dataProvider.GrandCompany(s.GrandCompany) - uriFormat += fmt.Sprintf("&gcid=%d", gc.ID) + gc, err := scraper.dataProvider.GrandCompany(s.GrandCompany) + if err == nil { + uriFormat += fmt.Sprintf("&gcid=%d", gc.ID) + } } builtURI := fmt.Sprintf(uriFormat, lang, name, worldDC, "", s.Order) diff --git a/search.go b/search.go index 852bc2c..feb2185 100644 --- a/search.go +++ b/search.go @@ -183,8 +183,10 @@ func (s *Scraper) buildFreeCompanySearchCollector( } gcName := entrySelectors.GrandCompany.ParseThroughChildren(e)[0] - gc := s.dataProvider.GrandCompany(gcName) - nextFC.GrandCompany = gc + gc, err := s.dataProvider.GrandCompany(gcName) + if err == nil { + nextFC.GrandCompany = gc + } server := entrySelectors.Server.ParseThroughChildren(e) nextFC.World = server[0]