feature: switch dealsbot to sqlite kv and remove defunct ubisoft api

This commit is contained in:
Seraphim Strub 2024-07-12 13:51:16 +00:00
parent 759aae3b54
commit 50cd000ee5
4 changed files with 35 additions and 293 deletions

View file

@ -2,16 +2,18 @@ package main
import (
"context"
"database/sql"
"encoding/json"
"errors"
"fmt"
"github.com/dgraph-io/badger/v4"
"github.com/disgoorg/disgo"
"github.com/disgoorg/disgo/discord"
"github.com/disgoorg/disgo/rest"
"github.com/disgoorg/disgo/webhook"
"github.com/disgoorg/snowflake/v2"
"grow.rievo.dev/discordBots"
"grow.rievo.dev/discordBots/cmd/dealsbot/api"
"grow.rievo.dev/discordBots/cmd/dealsbot/repository"
"grow.rievo.dev/discordBots/pkg/db"
"log/slog"
"os"
"os/signal"
@ -19,6 +21,8 @@ import (
"strings"
"syscall"
"time"
_ "modernc.org/sqlite"
)
var (
@ -39,18 +43,30 @@ func main() {
// - https://github.com/TheLovinator1/discord-free-game-notifier
// - https://gg.deals/news/free-gog-games/
// - origin
// - check ubisoft works
// - need new ubisoft api if it even exists
// - add more supported types for steam (bundles,software,dlc)
logger.Info("starting dealsbot...", slog.String("disgo version", disgo.Version))
client := webhook.New(webhookID, webhookToken)
defer client.Close(context.TODO())
repo := repository.InitDb(logger)
defer repo.Close()
ctx := context.Background()
con, err := sql.Open("sqlite", "file:db/deals.db?cache=shared")
if err != nil {
logger.Error("error opening db", slog.Any("error", err))
panic(err)
}
defer con.Close()
ticker := time.NewTicker(10 * time.Minute)
tickerGC := time.NewTicker(15 * time.Minute)
// create tables
if _, err := con.ExecContext(ctx, discordBots.Schema); err != nil {
logger.Error("error creating db schema", slog.Any("error", err))
panic(err)
}
query := db.New(con)
ticker := time.NewTicker(1 * time.Minute)
quit := make(chan struct{})
go func() {
@ -59,7 +75,6 @@ func main() {
case <-ticker.C:
var apis []api.Api
apis = append(apis,
api.NewUbsioftApi(logger),
api.NewEpicApi(logger),
api.NewSteamApi(logger),
api.NewGogFrontApi(logger),
@ -79,7 +94,11 @@ func main() {
}
for _, deal := range deals {
retrievedDeal, _ := repo.GetValue(deal.Id)
retrievedDealJson, dbErr := query.GetItem(ctx, deal.Id)
retrievedDeal := api.Deal{}
if err := json.Unmarshal(retrievedDealJson.Data, &retrievedDeal); !errors.Is(dbErr, sql.ErrNoRows) && err != nil {
logger.Error("failed unmarshalling deal", slog.Any("error", err))
}
if deal.Id == retrievedDeal.Id {
logger.Debug("deal is already published", slog.String("deal", deal.Id))
@ -88,23 +107,20 @@ func main() {
} else {
logger.Info("deal is new and will be published", slog.String("deal", deal.Id))
go sendWebhook(client, deal)
err := repo.SetValue(deal)
dealJson, _ := json.Marshal(deal)
err = query.CreateItem(ctx, db.CreateItemParams{
ID: deal.Id,
Data: dealJson,
})
if err != nil {
logger.Error("failed saving deal", slog.Any("error", err))
}
}
}
case <-tickerGC.C:
err := repo.RunGC()
if err != nil && !errors.Is(err, badger.ErrNoRewrite) {
logger.Error("GC failed", slog.Any("error", err))
} else {
logger.Debug("GC successful")
}
case <-quit:
ticker.Stop()
tickerGC.Stop()
return
}
}