remove sentry and move to slog
This commit is contained in:
parent
a20bc22ab1
commit
5d2b8f39d9
18 changed files with 134 additions and 232 deletions
|
@ -4,7 +4,7 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
@ -15,15 +15,17 @@ type EpicStruct struct {
|
|||
idPrefix string
|
||||
headers map[string]string
|
||||
deals DealsMap
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewEpicApi() EpicStruct {
|
||||
func NewEpicApi(logger *slog.Logger) EpicStruct {
|
||||
epic := EpicStruct{
|
||||
url: "https://store-site-backend-static-ipv4.ak.epicgames.com/freeGamesPromotions",
|
||||
baseUrl: "https://store.epicgames.com/p/",
|
||||
idPrefix: "epic-",
|
||||
headers: make(map[string]string),
|
||||
deals: make(map[string]Deal),
|
||||
logger: logger,
|
||||
}
|
||||
epic.headers["Accept-Language"] = "en"
|
||||
epic.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
|
||||
|
@ -113,7 +115,7 @@ func (e EpicStruct) Load() error {
|
|||
productSlug = element.OfferMappings[0].PageSlug
|
||||
}
|
||||
if productSlug == "" {
|
||||
log.Printf("ERROR: product slug not found for: %v", element.Title)
|
||||
e.logger.Error("product slug not found", slog.String("title", element.Title))
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ package api
|
|||
import (
|
||||
"fmt"
|
||||
"golang.org/x/net/html"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"regexp"
|
||||
)
|
||||
|
@ -13,15 +14,17 @@ type GogStruct struct {
|
|||
idPrefix string
|
||||
headers map[string]string
|
||||
deals DealsMap
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewGogApi() GogStruct {
|
||||
func NewGogApi(logger *slog.Logger) GogStruct {
|
||||
gog := GogStruct{
|
||||
url: "https://www.gog.com/en/games?priceRange=0,0&discounted=true",
|
||||
baseUrl: "https://www.gog.com/game/",
|
||||
idPrefix: "gog-",
|
||||
headers: make(map[string]string),
|
||||
deals: make(map[string]Deal),
|
||||
logger: logger,
|
||||
}
|
||||
gog.headers["Accept-Language"] = "en"
|
||||
gog.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
|
||||
|
|
|
@ -3,6 +3,7 @@ package api
|
|||
import (
|
||||
"fmt"
|
||||
"golang.org/x/net/html"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"regexp"
|
||||
)
|
||||
|
@ -13,15 +14,17 @@ type GogFrontStruct struct {
|
|||
idPrefix string
|
||||
headers map[string]string
|
||||
deals DealsMap
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewGogFrontApi() GogFrontStruct {
|
||||
func NewGogFrontApi(logger *slog.Logger) GogFrontStruct {
|
||||
gog := GogFrontStruct{
|
||||
url: "https://www.gog.com/",
|
||||
baseUrl: "https://www.gog.com/game/",
|
||||
idPrefix: "gog-",
|
||||
headers: make(map[string]string),
|
||||
deals: make(map[string]Deal),
|
||||
logger: logger,
|
||||
}
|
||||
gog.headers["Accept-Language"] = "en"
|
||||
gog.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"golang.org/x/net/html"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"regexp"
|
||||
)
|
||||
|
@ -14,15 +15,17 @@ type HumbleBundleStruct struct {
|
|||
idPrefix string
|
||||
headers map[string]string
|
||||
deals DealsMap
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewHumbleBundleApi() HumbleBundleStruct {
|
||||
func NewHumbleBundleApi(logger *slog.Logger) HumbleBundleStruct {
|
||||
humbleBundle := HumbleBundleStruct{
|
||||
url: "https://www.humblebundle.com/",
|
||||
baseUrl: "https://www.humblebundle.com/store/",
|
||||
idPrefix: "humblebundle-",
|
||||
headers: make(map[string]string),
|
||||
deals: make(map[string]Deal),
|
||||
logger: logger,
|
||||
}
|
||||
humbleBundle.headers["Accept-Language"] = "en"
|
||||
humbleBundle.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"fmt"
|
||||
"golang.org/x/net/html"
|
||||
"io"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"regexp"
|
||||
)
|
||||
|
@ -16,9 +17,10 @@ type SteamStruct struct {
|
|||
idPrefix string
|
||||
headers map[string]string
|
||||
deals DealsMap
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewSteamApi() SteamStruct {
|
||||
func NewSteamApi(logger *slog.Logger) SteamStruct {
|
||||
steam := SteamStruct{
|
||||
url: "https://store.steampowered.com/search/results?force_infinite=1&maxprice=free&specials=1",
|
||||
baseUrl: "https://store.steampowered.com/app/",
|
||||
|
@ -26,6 +28,7 @@ func NewSteamApi() SteamStruct {
|
|||
idPrefix: "steam-",
|
||||
headers: make(map[string]string),
|
||||
deals: make(map[string]Deal),
|
||||
logger: logger,
|
||||
}
|
||||
steam.headers["Accept-Language"] = "en"
|
||||
steam.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"regexp"
|
||||
)
|
||||
|
@ -14,14 +15,16 @@ type UbisoftStruct struct {
|
|||
idPrefix string
|
||||
headers map[string]string
|
||||
deals DealsMap
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewUbsioftApi() UbisoftStruct {
|
||||
func NewUbsioftApi(logger *slog.Logger) UbisoftStruct {
|
||||
ubisoft := UbisoftStruct{
|
||||
url: "https://free.ubisoft.com/configuration.js",
|
||||
idPrefix: "ubisoft-",
|
||||
headers: make(map[string]string),
|
||||
deals: make(map[string]Deal),
|
||||
logger: logger,
|
||||
}
|
||||
ubisoft.headers["referer"] = "https://free.ubisoft.com/"
|
||||
ubisoft.headers["origin"] = "https://free.ubisoft.com"
|
||||
|
|
|
@ -10,10 +10,9 @@ import (
|
|||
"github.com/disgoorg/disgo/rest"
|
||||
"github.com/disgoorg/disgo/webhook"
|
||||
"github.com/disgoorg/snowflake/v2"
|
||||
"github.com/getsentry/sentry-go"
|
||||
"grow.rievo.dev/discordBots/cmd/dealsbot/api"
|
||||
"grow.rievo.dev/discordBots/cmd/dealsbot/repository"
|
||||
"log"
|
||||
"log/slog"
|
||||
"os"
|
||||
"os/signal"
|
||||
"reflect"
|
||||
|
@ -26,7 +25,8 @@ var (
|
|||
webhookToken = os.Getenv("webhook_token")
|
||||
)
|
||||
|
||||
// sentry
|
||||
var logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
|
||||
|
||||
var release string
|
||||
|
||||
func main() {
|
||||
|
@ -40,28 +40,12 @@ func main() {
|
|||
// - origin
|
||||
// - check ubisoft works
|
||||
|
||||
err := sentry.Init(sentry.ClientOptions{
|
||||
// Either set your DSN here or set the SENTRY_DSN environment variable.
|
||||
//Dsn: "",
|
||||
// Set TracesSampleRate to 1.0 to capture 100%
|
||||
// of transactions for performance monitoring.
|
||||
// We recommend adjusting this value in production,
|
||||
TracesSampleRate: 1.0,
|
||||
Release: release,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("sentry.Init: %s", err)
|
||||
}
|
||||
// Flush buffered events before the program terminates.
|
||||
defer sentry.Flush(2 * time.Second)
|
||||
|
||||
log.Printf("INFO: starting dealsbot...")
|
||||
log.Printf("INFO: disgo version: %v", disgo.Version)
|
||||
logger.Info("starting dealsbot...", slog.String("disgo version", disgo.Version))
|
||||
|
||||
client := webhook.New(webhookID, webhookToken)
|
||||
defer client.Close(context.TODO())
|
||||
|
||||
repo := repository.InitDb()
|
||||
repo := repository.InitDb(logger)
|
||||
defer repo.Close()
|
||||
|
||||
ticker := time.NewTicker(10 * time.Minute)
|
||||
|
@ -73,12 +57,17 @@ func main() {
|
|||
select {
|
||||
case <-ticker.C:
|
||||
var apis []api.Api
|
||||
apis = append(apis, api.NewUbsioftApi(), api.NewEpicApi(), api.NewSteamApi(), api.NewGogFrontApi(), api.NewGogApi(), api.NewHumbleBundleApi())
|
||||
apis = append(apis,
|
||||
api.NewUbsioftApi(logger),
|
||||
api.NewEpicApi(logger),
|
||||
api.NewSteamApi(logger),
|
||||
api.NewGogFrontApi(logger),
|
||||
api.NewGogApi(logger),
|
||||
api.NewHumbleBundleApi(logger))
|
||||
for _, a := range apis {
|
||||
err := a.Load()
|
||||
if err != nil {
|
||||
sentry.CaptureException(fmt.Errorf("ERROR: loading from api: %w", err))
|
||||
log.Printf("ERROR: %v", err)
|
||||
logger.Error("failed loading api", slog.Any("error", err))
|
||||
}
|
||||
}
|
||||
var deals []api.Deal
|
||||
|
@ -91,15 +80,15 @@ func main() {
|
|||
retrievedDeal, _ := repo.GetValue(deal.Id)
|
||||
|
||||
if deal.Id == retrievedDeal.Id {
|
||||
log.Printf("DEBUG: %v is already published", deal.Id)
|
||||
logger.Debug("deal is already published", slog.String("deal", deal.Id))
|
||||
} else if reflect.DeepEqual(deal, retrievedDeal) {
|
||||
log.Printf("ERROR: %v is published but not equal", deal.Id)
|
||||
logger.Error("deal is published but not equal", slog.String("deal", deal.Id))
|
||||
} else {
|
||||
log.Printf("INFO: %v is new and will be published", deal.Id)
|
||||
logger.Info("deal is new and will be published", slog.String("deal", deal.Id))
|
||||
go sendWebhook(client, deal)
|
||||
err := repo.SetValue(deal)
|
||||
if err != nil {
|
||||
log.Printf("ERROR: %v", err)
|
||||
logger.Error("failed saving deal", slog.Any("error", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -107,9 +96,9 @@ func main() {
|
|||
case <-tickerGC.C:
|
||||
err := repo.RunGC()
|
||||
if err != nil && !errors.Is(err, badger.ErrNoRewrite) {
|
||||
log.Printf("ERROR: GC: %v", err)
|
||||
logger.Error("GC failed", slog.Any("error", err))
|
||||
} else {
|
||||
log.Printf("DEBUG: GC successful")
|
||||
logger.Debug("GC successful")
|
||||
}
|
||||
case <-quit:
|
||||
ticker.Stop()
|
||||
|
@ -119,11 +108,7 @@ func main() {
|
|||
}
|
||||
}()
|
||||
|
||||
log.Printf("INFO: dealsbot (%v) is now running. Press CTRL-C to exit.", release)
|
||||
sentry.ConfigureScope(func(scope *sentry.Scope) {
|
||||
scope.SetLevel(sentry.LevelDebug)
|
||||
sentry.CaptureMessage("DEBUG: dealsbot started")
|
||||
})
|
||||
logger.Info("dealsbot is now running. Press CTRL-C to exit.", slog.String("version", release))
|
||||
|
||||
s := make(chan os.Signal, 1)
|
||||
signal.Notify(s, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
|
||||
|
@ -139,6 +124,6 @@ func sendWebhook(client webhook.Client, deal api.Deal) {
|
|||
SetContent(status).Build(),
|
||||
rest.WithDelay(2*time.Second),
|
||||
); err != nil {
|
||||
log.Printf("ERROR: sending message %v", err.Error())
|
||||
logger.Error("sending message failed", slog.Any("error", err))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import (
|
|||
"encoding/json"
|
||||
"github.com/dgraph-io/badger/v4"
|
||||
"grow.rievo.dev/discordBots/cmd/dealsbot/api"
|
||||
"log"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type Repository interface {
|
||||
|
@ -16,17 +16,18 @@ type Repository interface {
|
|||
}
|
||||
|
||||
type DealRepository struct {
|
||||
db *badger.DB
|
||||
db *badger.DB
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func InitDb() *DealRepository {
|
||||
func InitDb(logger *slog.Logger) *DealRepository {
|
||||
opts := badger.DefaultOptions("./db")
|
||||
opts.Logger = nil
|
||||
db, err := badger.Open(opts)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
logger.Error("error opening DB", slog.Any("error", err))
|
||||
}
|
||||
return &DealRepository{db}
|
||||
return &DealRepository{db, logger}
|
||||
}
|
||||
|
||||
func (d *DealRepository) Close() error {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue