hanayo/vendor/github.com/osuripple/cheesegull/dbmirror/discover.go
2019-02-23 13:29:15 +00:00

83 lines
1.7 KiB
Go

package dbmirror
import (
"database/sql"
"log"
"time"
"github.com/osuripple/cheesegull/models"
osuapi "github.com/thehowl/go-osuapi"
)
// Discover discovers new beatmaps in the osu! database and adds them.
func Discover(c *osuapi.Client, db *sql.DB) error {
id, err := models.BiggestSetID(db)
if err != nil {
return err
}
log.Println("[D] Starting discovery with ID", id)
// failedAttempts is the number of consecutive failed attempts at fetching a
// beatmap (by 'failed', in this case we mean exclusively when a request to
// get_beatmaps returns no beatmaps)
failedAttempts := 0
for failedAttempts < 4096 {
id++
if id%64 == 0 {
log.Println("[D]", id)
}
var (
err error
bms []osuapi.Beatmap
)
for i := 0; i < 5; i++ {
bms, err = c.GetBeatmaps(osuapi.GetBeatmapsOpts{
BeatmapSetID: id,
})
if err == nil {
break
}
if i >= 5 {
return err
}
}
if err != nil {
return err
}
if len(bms) == 0 {
failedAttempts++
continue
}
failedAttempts = 0
set := setFromOsuAPIBeatmap(bms[0])
set.ChildrenBeatmaps = createChildrenBeatmaps(bms)
set.HasVideo, err = hasVideo(bms[0].BeatmapSetID)
if err != nil {
return err
}
err = models.CreateSet(db, set)
if err != nil {
return err
}
}
return nil
}
// DiscoverEvery runs Discover and waits for it to finish. If Discover returns
// an error, then it will wait errorWait before running Discover again. If
// Discover doesn't return any error, then it will wait successWait before
// running Discover again.
func DiscoverEvery(c *osuapi.Client, db *sql.DB, successWait, errorWait time.Duration) {
for {
err := Discover(c, db)
if err == nil {
time.Sleep(successWait)
} else {
logError(err)
time.Sleep(errorWait)
}
}
}