feature: switch dealsbot to sqlite kv and remove defunct ubisoft api
This commit is contained in:
parent
759aae3b54
commit
50cd000ee5
4 changed files with 35 additions and 293 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue