83 lines
1.7 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|