feature: switch domaincheckbot to sqlite kv
This commit is contained in:
parent
50cd000ee5
commit
773318a079
3 changed files with 48 additions and 133 deletions
|
@ -2,23 +2,27 @@ 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/domaincheckbot/config"
|
||||
"grow.rievo.dev/discordBots/cmd/domaincheckbot/dns"
|
||||
"grow.rievo.dev/discordBots/cmd/domaincheckbot/repository"
|
||||
"grow.rievo.dev/discordBots/pkg/db"
|
||||
"log/slog"
|
||||
"os"
|
||||
"os/signal"
|
||||
"reflect"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -39,11 +43,22 @@ func main() {
|
|||
client := webhook.New(webhookID, webhookToken)
|
||||
defer client.Close(context.TODO())
|
||||
|
||||
repo := repository.InitDb()
|
||||
defer repo.Close()
|
||||
ctx := context.Background()
|
||||
con, err := sql.Open("sqlite", "file:db/domain.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() {
|
||||
|
@ -51,20 +66,11 @@ func main() {
|
|||
select {
|
||||
case <-ticker.C:
|
||||
for _, d := range config.Domains {
|
||||
go checkDomain(0, d, repo, client)
|
||||
}
|
||||
|
||||
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")
|
||||
go checkDomain(0, d, query, client)
|
||||
}
|
||||
|
||||
case <-quit:
|
||||
ticker.Stop()
|
||||
tickerGC.Stop()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -77,9 +83,13 @@ func main() {
|
|||
<-s
|
||||
}
|
||||
|
||||
func checkDomain(counter int, d string, repo *repository.DomainRepository, client webhook.Client) {
|
||||
func checkDomain(counter int, d string, query *db.Queries, client webhook.Client) {
|
||||
domain := dns.CheckDomain(d)
|
||||
retrievedDomain, _ := repo.GetValue(d)
|
||||
retrievedDomainJson, dbErr := query.GetItem(context.TODO(), d)
|
||||
retrievedDomain := dns.Domain{}
|
||||
if err := json.Unmarshal(retrievedDomainJson.Data, &retrievedDomain); !errors.Is(dbErr, sql.ErrNoRows) && err != nil {
|
||||
logger.Error("failed unmarshalling deal", slog.Any("error", err))
|
||||
}
|
||||
if reflect.DeepEqual(domain, retrievedDomain) {
|
||||
logger.Debug("domain did not change", slog.String("domain", d))
|
||||
return
|
||||
|
@ -88,14 +98,23 @@ func checkDomain(counter int, d string, repo *repository.DomainRepository, clien
|
|||
counter += 1
|
||||
if counter >= 2 {
|
||||
go sendWebhook(client, domain, retrievedDomain)
|
||||
repo.SetValue(domain)
|
||||
|
||||
domainJson, _ := json.Marshal(domain)
|
||||
err := query.CreateItem(context.TODO(), db.CreateItemParams{
|
||||
ID: domain.Name,
|
||||
Data: domainJson,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
logger.Error("failed saving domain", slog.Any("error", err))
|
||||
}
|
||||
return
|
||||
}
|
||||
time.Sleep(1 * time.Minute)
|
||||
checkDomain(counter, d, repo, client)
|
||||
checkDomain(counter, d, query, client)
|
||||
}
|
||||
|
||||
func sendWebhook(client webhook.Client, domain repository.Domain, oldDomain repository.Domain) {
|
||||
func sendWebhook(client webhook.Client, domain dns.Domain, oldDomain dns.Domain) {
|
||||
var status string
|
||||
|
||||
status = fmt.Sprintf("```md\n# %v", domain.Name)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue