From a87a2eee840c936babc936a1421db33341297701 Mon Sep 17 00:00:00 2001 From: P147x Date: Sat, 18 Jul 2020 23:41:23 +0000 Subject: [PATCH 01/39] feat(dockerize): add Dockerfile + K8s conf --- Dockerfile | 10 ++++++++++ deploy-staging.sh | 2 ++ deployments/k8s-staging.yaml | 24 ++++++++++++++++++++++++ go.mod | 8 ++++++++ go.sum | 8 ++++++++ remove-staging.sh | 2 ++ src/shibes.go | 8 ++++---- 7 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 Dockerfile create mode 100644 deploy-staging.sh create mode 100644 deployments/k8s-staging.yaml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 remove-staging.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..39491b9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:1.14.4 AS build +COPY . /go/src/github.com/P147x/shibesbot +WORKDIR /go/src/github.com/P147x/shibesbot +RUN CGO_ENABLED=0 GOOS=linux go build -o app ./src/ + +FROM alpine:latest +RUN apk --no-cache add ca-certificates +WORKDIR /root/ +COPY --from=build /go/src/github.com/P147x/shibesbot/app . +ENTRYPOINT ["./app"] diff --git a/deploy-staging.sh b/deploy-staging.sh new file mode 100644 index 0000000..8ab124b --- /dev/null +++ b/deploy-staging.sh @@ -0,0 +1,2 @@ +#!/bin/sh +kubectl apply -f deployments/k8s-staging.yaml diff --git a/deployments/k8s-staging.yaml b/deployments/k8s-staging.yaml new file mode 100644 index 0000000..b1be294 --- /dev/null +++ b/deployments/k8s-staging.yaml @@ -0,0 +1,24 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: shibesbot +spec: + replicas: 1 + selector: + matchLabels: + app: shibesbot + template: + metadata: + labels: + app: shibesbot + spec: + containers: + - name: shibesbot + image: codeinu/shibesbot:latest + env: + - name: SHIBESBOT_TOKEN + valueFrom: + secretKeyRef: + name: shibesbot-token + key: password + \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..38b82ed --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/P147x/shibesbot/app + +go 1.14 + +require ( + github.com/bwmarrin/discordgo v0.21.1 + github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9157122 --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/bwmarrin/discordgo v0.21.1 h1:UI2PWwzvn5IFuscYcDc6QB/duhs9MUIjQ4HclcIZisc= +github.com/bwmarrin/discordgo v0.21.1/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= +github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/remove-staging.sh b/remove-staging.sh new file mode 100644 index 0000000..b11a16b --- /dev/null +++ b/remove-staging.sh @@ -0,0 +1,2 @@ +#!/bin/sh +kubectl delete -f deployments/k8s-staging.yaml diff --git a/src/shibes.go b/src/shibes.go index f246a57..53e552d 100644 --- a/src/shibes.go +++ b/src/shibes.go @@ -1,7 +1,8 @@ package main import ( - "flag" + "os" + "fmt" ) var ( @@ -9,9 +10,8 @@ var ( ) func init() { - - flag.StringVar(&Token, "t", "", "Bot Token") - flag.Parse() + Token = os.Getenv("SHIBESBOT_TOKEN") + fmt.Print("Received token: ", Token) } func main() { From 145561600fedebe6d30c5c29179bbfd73b657dab Mon Sep 17 00:00:00 2001 From: P147x Date: Sun, 19 Jul 2020 11:22:49 +0000 Subject: [PATCH 02/39] feat(dockerization): update dockerfile --- Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 39491b9..3897458 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,9 @@ FROM golang:1.14.4 AS build -COPY . /go/src/github.com/P147x/shibesbot -WORKDIR /go/src/github.com/P147x/shibesbot +WORKDIR $GOPATH/src/github.com/P147x/shibesbot +COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o app ./src/ -FROM alpine:latest -RUN apk --no-cache add ca-certificates +FROM scratch WORKDIR /root/ COPY --from=build /go/src/github.com/P147x/shibesbot/app . ENTRYPOINT ["./app"] From d24490e221cf03282f488bacaa29d7fcbaa9c2b1 Mon Sep 17 00:00:00 2001 From: P147x Date: Sun, 19 Jul 2020 19:26:56 +0000 Subject: [PATCH 03/39] fix(dev): fixed dockerfile issues + base structure --- Dockerfile | 4 ++-- src/discord.go => discord.go | 13 ++++++++----- src/dogequests.go => dogequests.go | 16 ++++++++++++++-- src/shibes.go => main.go | 0 4 files changed, 24 insertions(+), 9 deletions(-) rename src/discord.go => discord.go (82%) rename src/dogequests.go => dogequests.go (92%) rename src/shibes.go => main.go (100%) diff --git a/Dockerfile b/Dockerfile index 3897458..480cbc0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ FROM golang:1.14.4 AS build WORKDIR $GOPATH/src/github.com/P147x/shibesbot COPY . . -RUN CGO_ENABLED=0 GOOS=linux go build -o app ./src/ +RUN CGO_ENABLED=0 GOOS=linux go build -o app . -FROM scratch +FROM alpine:latest WORKDIR /root/ COPY --from=build /go/src/github.com/P147x/shibesbot/app . ENTRYPOINT ["./app"] diff --git a/src/discord.go b/discord.go similarity index 82% rename from src/discord.go rename to discord.go index ebb87fa..9b6ec30 100644 --- a/src/discord.go +++ b/discord.go @@ -40,21 +40,24 @@ func initDiscord(t string) { func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) error { var err error - if strings.HasPrefix(m.Content, "s") { + if strings.HasPrefix(m.Content, "p") { switch m.Content { - case "shibes": + case "papainperdu": _, err = s.ChannelMessageSend(m.ChannelID, getShibes()) presenceUpdate(s) break - case "sgifs": + case "papainperdumaisanime": _, err = s.ChannelMessageSend(m.ChannelID, getShibesGifs()) break - case "shelp": + case "painperdualaide": _, err = s.ChannelMessageSendEmbed(m.ChannelID, getHelp()) break - case "swalls": + case "painperdumur": _, err = s.ChannelMessageSend(m.ChannelID, getShibesWallpaper()) break + case "painperduquiestreslongaecriremaiscavautpeutetrelecoup": + _, _ = s.ChannelMessageSend(m.ChannelID, "https://giphy.com/stickers/imoji-wtf-l4FGAwUT9YmqqAZyg") + break } } return err diff --git a/src/dogequests.go b/dogequests.go similarity index 92% rename from src/dogequests.go rename to dogequests.go index 4f731b8..367efb6 100644 --- a/src/dogequests.go +++ b/dogequests.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "math/rand" "net/http" + "fmt" "github.com/bwmarrin/discordgo" "github.com/ivolo/go-giphy" @@ -51,19 +52,30 @@ type ShibesData struct { Wallpapers ShibesWallpapers } + func init() { req, err := http.NewRequest("GET", "https://wall.alphacoders.com/api2.0/get.php", nil) if err != nil { + fmt.Print("Error") + return } q := req.URL.Query() q.Add("auth", "c8b66cee6ef7022a615da5cbba315f3c") q.Add("method", "search") q.Add("term", "Shiba") req.URL.RawQuery = q.Encode() - resp, _ := http.Get(req.URL.String()) + resp, err := http.Get(req.URL.String()) + if err != nil { + fmt.Print("Error") + return + } defer resp.Body.Close() - body, _ := ioutil.ReadAll(resp.Body) + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Print("Error") + return + } var res AlphacodersData json.Unmarshal(body, &res) Shibes.Wallpapers.Shibes = make([]WallpaperData, len(res.Wallpapers)) diff --git a/src/shibes.go b/main.go similarity index 100% rename from src/shibes.go rename to main.go From 4a97a0e601a52589a1893d119a7b1c78a3f64b8c Mon Sep 17 00:00:00 2001 From: P147x Date: Sun, 19 Jul 2020 19:28:39 +0000 Subject: [PATCH 04/39] chore(dev): remove useless Makefile --- Makefile | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 01a9def..0000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -BINARY = shibes - -SRC_DIRECTORY = src/ -BIN_DIRECTORY = . -SRC = $(SRC_DIRECTORY)shibes.go \ - $(SRC_DIRECTORY)discord.go \ - $(SRC_DIRECTORY)dogequests.go \ - - -all: $(BINARY) - -$(BINARY): clean - go build -o $(BIN_DIRECTORY)/$(BINARY) $(SRC) - -clean: - rm -f bin/$(BINARY) - -.PHONY: all clean From f218b3dbace69178551bfabc4bc088cd96a2a8bd Mon Sep 17 00:00:00 2001 From: P147x Date: Sun, 19 Jul 2020 19:43:23 +0000 Subject: [PATCH 05/39] feat(better-logs): add logrus as logger --- discord.go | 2 +- go.mod | 1 + go.sum | 9 +++++++++ main.go | 22 +++++++++++----------- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/discord.go b/discord.go index 9b6ec30..11db1d2 100644 --- a/discord.go +++ b/discord.go @@ -18,7 +18,7 @@ var ( ) func initDiscord(t string) { - dg, err := discordgo.New("Bot " + Token) + dg, err := discordgo.New("Bot " + t) if err != nil { fmt.Println("error creating Discord session,", err) return diff --git a/go.mod b/go.mod index 38b82ed..7953a05 100644 --- a/go.mod +++ b/go.mod @@ -5,4 +5,5 @@ go 1.14 require ( github.com/bwmarrin/discordgo v0.21.1 github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 + github.com/sirupsen/logrus v1.6.0 ) diff --git a/go.sum b/go.sum index 9157122..c3d7533 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,17 @@ github.com/bwmarrin/discordgo v0.21.1 h1:UI2PWwzvn5IFuscYcDc6QB/duhs9MUIjQ4HclcIZisc= github.com/bwmarrin/discordgo v0.21.1/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index 53e552d..1154fda 100644 --- a/main.go +++ b/main.go @@ -2,18 +2,18 @@ package main import ( "os" - "fmt" + + log "github.com/sirupsen/logrus" ) -var ( - Token string -) - -func init() { - Token = os.Getenv("SHIBESBOT_TOKEN") - fmt.Print("Received token: ", Token) -} - func main() { - initDiscord(Token) + log.Info("Starting bot.") + + var token string + if token = os.Getenv("SHIBESBOT_TOKEN"); len(token) == 0 { + log.Error("Environnement variable SHIBESBOT_TOKEN is not provided") + return + } + + initDiscord(token) } From b6bdeca1464292f97d7e9d679e628794edc1f92b Mon Sep 17 00:00:00 2001 From: P147x Date: Wed, 29 Jul 2020 18:22:31 +0000 Subject: [PATCH 06/39] feat(better-logs): change fmt to logrus --- deployments/k8s-staging.yaml | 15 ++++++++++++++- discord.go | 26 ++++++++++++-------------- dogequests.go | 11 +++++------ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/deployments/k8s-staging.yaml b/deployments/k8s-staging.yaml index b1be294..a7bb860 100644 --- a/deployments/k8s-staging.yaml +++ b/deployments/k8s-staging.yaml @@ -21,4 +21,17 @@ spec: secretKeyRef: name: shibesbot-token key: password - \ No newline at end of file +--- +apiVersion: v1 +kind: Service +metadata: + name: shibesbot-entrypoint + namespace: default +spec: + type: NodePort + selector: + app: shibesbot + ports: + - port: 80 + targetPort: 80 + nodePort: 30001 \ No newline at end of file diff --git a/discord.go b/discord.go index 11db1d2..253a296 100644 --- a/discord.go +++ b/discord.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "os" "os/signal" "strconv" @@ -10,6 +9,8 @@ import ( "time" "github.com/bwmarrin/discordgo" + + log "github.com/sirupsen/logrus" ) var ( @@ -20,44 +21,41 @@ var ( func initDiscord(t string) { dg, err := discordgo.New("Bot " + t) if err != nil { - fmt.Println("error creating Discord session,", err) + log.Error("Connexion error: ", err.Error()) return } dg.AddHandler(shibesHandler) err = dg.Open() if err != nil { - fmt.Println("error opening connection,", err) + log.Error("Connexion error : ", err.Error()) return } - fmt.Println("Shibes ready for duty. Press CTRL+C for no shibes.") + log.Info("Bot OK, ready to bork on people") sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) <-sc + log.Info("Signal received, stopping in progress") dg.Close() } -func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) error { - var err error - if strings.HasPrefix(m.Content, "p") { +func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) (err error) { + if strings.HasPrefix(m.Content, "s") { switch m.Content { - case "papainperdu": + case "shibes": _, err = s.ChannelMessageSend(m.ChannelID, getShibes()) presenceUpdate(s) break - case "papainperdumaisanime": + case "sgifs": _, err = s.ChannelMessageSend(m.ChannelID, getShibesGifs()) break - case "painperdualaide": + case "shelp": _, err = s.ChannelMessageSendEmbed(m.ChannelID, getHelp()) break - case "painperdumur": + case "swalls": _, err = s.ChannelMessageSend(m.ChannelID, getShibesWallpaper()) break - case "painperduquiestreslongaecriremaiscavautpeutetrelecoup": - _, _ = s.ChannelMessageSend(m.ChannelID, "https://giphy.com/stickers/imoji-wtf-l4FGAwUT9YmqqAZyg") - break } } return err diff --git a/dogequests.go b/dogequests.go index 367efb6..a4ff029 100644 --- a/dogequests.go +++ b/dogequests.go @@ -5,10 +5,10 @@ import ( "io/ioutil" "math/rand" "net/http" - "fmt" "github.com/bwmarrin/discordgo" "github.com/ivolo/go-giphy" + log "github.com/sirupsen/logrus" ) var ( @@ -52,12 +52,11 @@ type ShibesData struct { Wallpapers ShibesWallpapers } - func init() { req, err := http.NewRequest("GET", "https://wall.alphacoders.com/api2.0/get.php", nil) if err != nil { - fmt.Print("Error") - return + log.Error("Error while getting images : ", err.Error()) + return } q := req.URL.Query() q.Add("auth", "c8b66cee6ef7022a615da5cbba315f3c") @@ -66,14 +65,14 @@ func init() { req.URL.RawQuery = q.Encode() resp, err := http.Get(req.URL.String()) if err != nil { - fmt.Print("Error") + log.Error("Error while getting images : ", err.Error()) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { - fmt.Print("Error") + log.Error("Error while getting images : ", err.Error()) return } var res AlphacodersData From ffc5b22d9870a5809881622448c144bbbe7fcad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Sat, 7 Nov 2020 14:19:23 +0100 Subject: [PATCH 07/39] Add timer on presence update function --- discord.go | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/discord.go b/discord.go index 253a296..3aaf9d7 100644 --- a/discord.go +++ b/discord.go @@ -5,39 +5,43 @@ import ( "os/signal" "strconv" "strings" + "sync" "syscall" "time" "github.com/bwmarrin/discordgo" - + log "github.com/sirupsen/logrus" ) var ( - Users int - Time int + Users int + UsageResetTimer time.Timer + Mtx sync.Mutex + BotSession *discordgo.Session ) func initDiscord(t string) { - dg, err := discordgo.New("Bot " + t) + var err error + BotSession, err = discordgo.New("Bot " + t) if err != nil { log.Error("Connexion error: ", err.Error()) return } - - dg.AddHandler(shibesHandler) - err = dg.Open() + BotSession.AddHandler(shibesHandler) + err = BotSession.Open() if err != nil { log.Error("Connexion error : ", err.Error()) return } + defer BotSession.Close() + resetUsageCounter() log.Info("Bot OK, ready to bork on people") sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) <-sc log.Info("Signal received, stopping in progress") - dg.Close() } func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) (err error) { @@ -45,7 +49,7 @@ func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) (err error) switch m.Content { case "shibes": _, err = s.ChannelMessageSend(m.ChannelID, getShibes()) - presenceUpdate(s) + incrementPresenceUpdate() break case "sgifs": _, err = s.ChannelMessageSend(m.ChannelID, getShibesGifs()) @@ -61,12 +65,29 @@ func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) (err error) return err } -func presenceUpdate(s *discordgo.Session) { - if Time != int(time.Now().Day()) { - Time = int(time.Now().Day()) - Users = 0 - } +func resetUsageCounter() { + t := time.Now() + n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) + resetPresenceUpdate() + log.Info("Reset programmed in ", n.Sub(t).String()) + time.AfterFunc(n.Sub(t), resetUsageCounter) +} + +func resetPresenceUpdate() { + Mtx.Lock() + defer Mtx.Unlock() + Users = 0 + updatePresenceUpdate(BotSession) +} + +func incrementPresenceUpdate() { + Mtx.Lock() + defer Mtx.Unlock() Users++ + updatePresenceUpdate(BotSession) +} + +func updatePresenceUpdate(s *discordgo.Session) { s.UpdateStatus(Users, "shelp for help || "+ strconv.Itoa(Users)+" usages this day.") } From 61155088c0b3f76c991aedd15c17e95de040329e Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 29 Jun 2021 11:13:47 +0200 Subject: [PATCH 08/39] Add GitHub actions --- .gitconfig | 2 ++ .github/workflows/go.yml | 16 ++++++++++++++++ .github/workflows/publish.yml | 31 +++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 .gitconfig create mode 100644 .github/workflows/go.yml create mode 100644 .github/workflows/publish.yml diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..c73ef1c --- /dev/null +++ b/.gitconfig @@ -0,0 +1,2 @@ +user.name=Lucas DEBOUTE +user.email=lucas.deboute@gmail.com diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..9ef93dc --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,16 @@ +name: Golang CI +on: [push, pull_request] +jobs: + build: + name: Build and test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: 1.16 + - name: Build + run: go build . + - name: Test + run: go test -v . + diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..826bc26 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,31 @@ +name: Deploy +on: + push: + branches: ['dev'] + +env: + IMAGE_NAME: 'codeinu/shibesbot' + +jobs: + build-and-push-images: + runs-on: ubuntu-latest + permission: + contents: read + packages: write + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: 1.16 + - name: Log in to the Container registry + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + push: true + tags: ${{ env.IMAGE_NAME }}:dev From 338a3d66154180bbdc59327cdb12742e1b7dcb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Wed, 18 Aug 2021 12:53:05 +0200 Subject: [PATCH 09/39] Add support for slash commands --- .github/workflows/go.yml | 4 +- Dockerfile | 4 +- Makefile | 17 +++ cmd/shibesbot/discord.go | 131 +++++++++++++++++++ dogequests.go => cmd/shibesbot/dogequests.go | 4 +- main.go => cmd/shibesbot/main.go | 0 discord.go | 102 --------------- go.mod | 10 +- go.sum | 33 +++-- 9 files changed, 181 insertions(+), 124 deletions(-) create mode 100644 Makefile create mode 100644 cmd/shibesbot/discord.go rename dogequests.go => cmd/shibesbot/dogequests.go (100%) rename main.go => cmd/shibesbot/main.go (100%) delete mode 100644 discord.go diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 9ef93dc..c629925 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -10,7 +10,7 @@ jobs: with: go-version: 1.16 - name: Build - run: go build . + run: make - name: Test - run: go test -v . + run: make test diff --git a/Dockerfile b/Dockerfile index 480cbc0..a76273a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -FROM golang:1.14.4 AS build +FROM golang:1.16.5 AS build WORKDIR $GOPATH/src/github.com/P147x/shibesbot COPY . . -RUN CGO_ENABLED=0 GOOS=linux go build -o app . +RUN CGO_ENABLED=0 GOOS=linux go build -o app ./cmd/shibesbot FROM alpine:latest WORKDIR /root/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..73db258 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +BINARY = shibes + +BIN_DIRECTORY = bin + + +all: $(BINARY) + +$(BINARY): clean + go build -o $(BIN_DIRECTORY)/$(BINARY) cmd/shibesbot/*.go + +test: + go test ./... -v + +clean: + rm -f bin/$(BINARY) + +.PHONY: all clean diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go new file mode 100644 index 0000000..2a65f35 --- /dev/null +++ b/cmd/shibesbot/discord.go @@ -0,0 +1,131 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "strconv" + "sync" + "syscall" + "time" + + "github.com/bwmarrin/discordgo" + + log "github.com/sirupsen/logrus" +) + +var ( + Users int + UsageResetTimer time.Timer + Mtx sync.Mutex + BotSession *discordgo.Session + + commands = []*discordgo.ApplicationCommand{ + { + Name: "shibes", + Description: "Returns an image of a Shiba", + Options: []*discordgo.ApplicationCommandOption{ + + { + Type: discordgo.ApplicationCommandOptionString, + Name: "count", + Description: "Ask for more pictures in one request", + Required: false, + }, + }, + }, + { + Name: "swalls", + Description: "Returns a wallpaper with a Shiba ina !", + }, + { + Name: "sgifs", + Description: "Returns a gif with a Shiba ina !"}, + { + Name: "shelp", + Description: "Returns helper", + }, + } +) + +func initDiscord(t string) { + var err error + BotSession, err = discordgo.New("Bot " + t) + if err != nil { + log.Error("Connexion error: ", err.Error()) + return + } + BotSession.AddHandler(commandPicker) + err = BotSession.Open() + if err != nil { + log.Error("Connexion error : ", err.Error()) + return + } + defer BotSession.Close() + for _, cmd := range commands { + BotSession.ApplicationCommandCreate(BotSession.State.User.ID, "", cmd) + } + + resetUsageCounter() + log.Info("Bot OK, ready to bork on people") + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) + <-sc + log.Info("Signal received, stopping in progress") +} + +func commandPicker(s *discordgo.Session, i *discordgo.InteractionCreate) { + fmt.Println("command received: " + i.ApplicationCommandData().Name) + var response string + switch i.ApplicationCommandData().Name { + case "shibes": + response = getShibes() + incrementPresenceUpdate() + case "sgifs": + response = getShibesGifs() + case "shelp": + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Embeds: []*discordgo.MessageEmbed{getHelp()}, + }, + }) + return + case "swalls": + response = getShibesWallpaper() + } + + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: response, + }, + }) +} + +func resetUsageCounter() { + t := time.Now() + n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) + resetPresenceUpdate() + log.Info("Reset programmed in ", n.Sub(t).String()) + time.AfterFunc(n.Sub(t), resetUsageCounter) +} + +func resetPresenceUpdate() { + Mtx.Lock() + defer Mtx.Unlock() + Users = 0 + updatePresenceUpdate(BotSession) +} + +func incrementPresenceUpdate() { + Mtx.Lock() + defer Mtx.Unlock() + Users++ + updatePresenceUpdate(BotSession) +} + +func updatePresenceUpdate(s *discordgo.Session) { + s.UpdateGameStatus(0, "shelp for help || "+ + strconv.Itoa(Users)+" usages this day.") +} diff --git a/dogequests.go b/cmd/shibesbot/dogequests.go similarity index 100% rename from dogequests.go rename to cmd/shibesbot/dogequests.go index a4ff029..59c0a0e 100644 --- a/dogequests.go +++ b/cmd/shibesbot/dogequests.go @@ -1,14 +1,14 @@ package main import ( - "encoding/json" "io/ioutil" "math/rand" "net/http" + "github.com/ivolo/go-giphy" "github.com/bwmarrin/discordgo" - "github.com/ivolo/go-giphy" log "github.com/sirupsen/logrus" + "encoding/json" ) var ( diff --git a/main.go b/cmd/shibesbot/main.go similarity index 100% rename from main.go rename to cmd/shibesbot/main.go diff --git a/discord.go b/discord.go deleted file mode 100644 index 3aaf9d7..0000000 --- a/discord.go +++ /dev/null @@ -1,102 +0,0 @@ -package main - -import ( - "os" - "os/signal" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "github.com/bwmarrin/discordgo" - - log "github.com/sirupsen/logrus" -) - -var ( - Users int - UsageResetTimer time.Timer - Mtx sync.Mutex - BotSession *discordgo.Session -) - -func initDiscord(t string) { - var err error - BotSession, err = discordgo.New("Bot " + t) - if err != nil { - log.Error("Connexion error: ", err.Error()) - return - } - BotSession.AddHandler(shibesHandler) - err = BotSession.Open() - if err != nil { - log.Error("Connexion error : ", err.Error()) - return - } - defer BotSession.Close() - - resetUsageCounter() - log.Info("Bot OK, ready to bork on people") - sc := make(chan os.Signal, 1) - signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) - <-sc - log.Info("Signal received, stopping in progress") -} - -func commandPicker(s *discordgo.Session, m *discordgo.MessageCreate) (err error) { - if strings.HasPrefix(m.Content, "s") { - switch m.Content { - case "shibes": - _, err = s.ChannelMessageSend(m.ChannelID, getShibes()) - incrementPresenceUpdate() - break - case "sgifs": - _, err = s.ChannelMessageSend(m.ChannelID, getShibesGifs()) - break - case "shelp": - _, err = s.ChannelMessageSendEmbed(m.ChannelID, getHelp()) - break - case "swalls": - _, err = s.ChannelMessageSend(m.ChannelID, getShibesWallpaper()) - break - } - } - return err -} - -func resetUsageCounter() { - t := time.Now() - n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) - resetPresenceUpdate() - log.Info("Reset programmed in ", n.Sub(t).String()) - time.AfterFunc(n.Sub(t), resetUsageCounter) -} - -func resetPresenceUpdate() { - Mtx.Lock() - defer Mtx.Unlock() - Users = 0 - updatePresenceUpdate(BotSession) -} - -func incrementPresenceUpdate() { - Mtx.Lock() - defer Mtx.Unlock() - Users++ - updatePresenceUpdate(BotSession) -} - -func updatePresenceUpdate(s *discordgo.Session) { - s.UpdateStatus(Users, "shelp for help || "+ - strconv.Itoa(Users)+" usages this day.") -} - -func shibesHandler(s *discordgo.Session, m *discordgo.MessageCreate) { - if m.Author.ID == s.State.User.ID { - return - } - if commandPicker(s, m) != nil { - s.ChannelMessageSend(m.ChannelID, "Oops, something wrong happened. :<") - } -} diff --git a/go.mod b/go.mod index 7953a05..4cd944d 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,11 @@ -module github.com/P147x/shibesbot/app +module github.com/P147x/shibesbot -go 1.14 +go 1.16 require ( - github.com/bwmarrin/discordgo v0.21.1 + github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 - github.com/sirupsen/logrus v1.6.0 + github.com/sirupsen/logrus v1.8.1 + golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect ) diff --git a/go.sum b/go.sum index c3d7533..e22992b 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,26 @@ -github.com/bwmarrin/discordgo v0.21.1 h1:UI2PWwzvn5IFuscYcDc6QB/duhs9MUIjQ4HclcIZisc= -github.com/bwmarrin/discordgo v0.21.1/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= +github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 h1:JgAlPJlCqsrUqXcClndnvF6LOjV528hpU/l5YzN++PA= +github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 5c89b44b256886a1df39ff2f8645280f027f4a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Fri, 30 Jun 2023 22:28:36 +0200 Subject: [PATCH 10/39] Encapsulate logger + add Zap & Logrus support --- cmd/shibesbot/main.go | 9 +++++++-- go.mod | 13 ++++++++++++- go.sum | 19 +++++++++++++++++-- pkg/logger/logger.go | 8 ++++++++ pkg/logger/logrus/logrus.go | 26 ++++++++++++++++++++++++++ pkg/logger/zap/zap.go | 26 ++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 pkg/logger/logger.go create mode 100644 pkg/logger/logrus/logrus.go create mode 100644 pkg/logger/zap/zap.go diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 1154fda..030628e 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -2,13 +2,18 @@ package main import ( "os" - + + "github.com/P147x/shibesbot/pkg/logger" + "github.com/P147x/shibesbot/pkg/logger/logrus" log "github.com/sirupsen/logrus" ) func main() { log.Info("Starting bot.") - + var logger logger.Logger + + logger = logrus.NewLogrusLogger() + var token string if token = os.Getenv("SHIBESBOT_TOKEN"); len(token) == 0 { log.Error("Environnement variable SHIBESBOT_TOKEN is not provided") diff --git a/go.mod b/go.mod index 4cd944d..0af83c5 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,22 @@ module github.com/P147x/shibesbot -go 1.16 +go 1.18 require ( github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 github.com/sirupsen/logrus v1.8.1 +) + +require ( + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect +) + +require ( + github.com/gorilla/websocket v1.4.2 // indirect + github.com/stretchr/testify v1.8.0 // indirect + go.uber.org/zap v1.24.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect ) diff --git a/go.sum b/go.sum index e22992b..623e205 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,6 @@ github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 h1:JgAlPJlCqsrUqXcClndnvF6LOjV528hpU/l5YzN++PA= github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -10,17 +11,31 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go new file mode 100644 index 0000000..a8c3e8f --- /dev/null +++ b/pkg/logger/logger.go @@ -0,0 +1,8 @@ +package logger + +// Logger interface implementation +type Logger interface { + Info(...any) + Warn(...any) + Error(...any) +} diff --git a/pkg/logger/logrus/logrus.go b/pkg/logger/logrus/logrus.go new file mode 100644 index 0000000..ffd003f --- /dev/null +++ b/pkg/logger/logrus/logrus.go @@ -0,0 +1,26 @@ +package logrus + +import "github.com/sirupsen/logrus" + +type LogrusLogger struct { + logger *logrus.Logger +} + +func NewLogrusLogger() *LogrusLogger { + logger := logrus.New() + return &LogrusLogger{ + logger: logger, + } +} + +func (l LogrusLogger) Info(v ...any) { + l.logger.Info(v...) +} + +func (l LogrusLogger) Error(v ...any) { + l.logger.Error(v...) +} + +func (l LogrusLogger) Warn(v ...any) { + l.logger.Warn(v...) +} diff --git a/pkg/logger/zap/zap.go b/pkg/logger/zap/zap.go new file mode 100644 index 0000000..28bf7bb --- /dev/null +++ b/pkg/logger/zap/zap.go @@ -0,0 +1,26 @@ +package zap + +import "go.uber.org/zap" + +type ZapSugarLogger struct { + logger *zap.SugaredLogger +} + +func NewSugarLogger() ZapSugarLogger { + logger, _ := zap.NewProduction() + return ZapSugarLogger{ + logger: logger.Sugar(), + } +} + +func (z ZapSugarLogger) Info(v ...any) { + z.logger.Info(v) +} + +func (z ZapSugarLogger) Warn(v ...any) { + z.logger.Info(v) +} + +func (z ZapSugarLogger) Error(v ...any) { + z.logger.Info(v) +} From 058a5b8a90b8436f4a016af85383d64ead257ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 11:31:15 +0200 Subject: [PATCH 11/39] Use local logger implementation --- cmd/shibesbot/discord.go | 12 ++++++------ cmd/shibesbot/main.go | 9 ++++----- go.mod | 1 - go.sum | 9 +++------ 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 2a65f35..cfab5ea 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -9,9 +9,8 @@ import ( "syscall" "time" + "github.com/P147x/shibesbot/pkg/logger" "github.com/bwmarrin/discordgo" - - log "github.com/sirupsen/logrus" ) var ( @@ -48,7 +47,7 @@ var ( } ) -func initDiscord(t string) { +func initDiscord(log logger.Logger, t string) { var err error BotSession, err = discordgo.New("Bot " + t) if err != nil { @@ -66,7 +65,7 @@ func initDiscord(t string) { BotSession.ApplicationCommandCreate(BotSession.State.User.ID, "", cmd) } - resetUsageCounter() + resetUsageCounter(log) log.Info("Bot OK, ready to bork on people") sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) @@ -103,12 +102,13 @@ func commandPicker(s *discordgo.Session, i *discordgo.InteractionCreate) { }) } -func resetUsageCounter() { +func resetUsageCounter(log logger.Logger) { t := time.Now() n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) resetPresenceUpdate() log.Info("Reset programmed in ", n.Sub(t).String()) - time.AfterFunc(n.Sub(t), resetUsageCounter) + f := func() { resetUsageCounter(log) } + time.AfterFunc(n.Sub(t), f) } func resetPresenceUpdate() { diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 030628e..7583dcd 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -5,14 +5,13 @@ import ( "github.com/P147x/shibesbot/pkg/logger" "github.com/P147x/shibesbot/pkg/logger/logrus" - log "github.com/sirupsen/logrus" ) func main() { - log.Info("Starting bot.") - var logger logger.Logger + var log logger.Logger - logger = logrus.NewLogrusLogger() + log = logrus.NewLogrusLogger() + log.Info("Starting Shibesbot") var token string if token = os.Getenv("SHIBESBOT_TOKEN"); len(token) == 0 { @@ -20,5 +19,5 @@ func main() { return } - initDiscord(token) + initDiscord(log, token) } diff --git a/go.mod b/go.mod index 0af83c5..4b2f507 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( require ( github.com/gorilla/websocket v1.4.2 // indirect - github.com/stretchr/testify v1.8.0 // indirect go.uber.org/zap v1.24.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect diff --git a/go.sum b/go.sum index 623e205..b633769 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 h1:JgAlPJlCqsrUqXcClndnvF6LOjV528hpU/l5YzN++PA= github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -7,19 +8,18 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= @@ -35,7 +35,4 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 67e14471295e5829f7ccbd002c36293e3e9ae052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 11:37:43 +0200 Subject: [PATCH 12/39] Update packages --- go.mod | 14 +++++++------- go.sum | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 4b2f507..e327d78 100644 --- a/go.mod +++ b/go.mod @@ -3,19 +3,19 @@ module github.com/P147x/shibesbot go 1.18 require ( - github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 + github.com/bwmarrin/discordgo v0.27.1 github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 - github.com/sirupsen/logrus v1.8.1 + github.com/sirupsen/logrus v1.9.3 ) require ( - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect ) require ( - github.com/gorilla/websocket v1.4.2 // indirect + github.com/gorilla/websocket v1.5.0 // indirect go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/crypto v0.10.0 // indirect + golang.org/x/sys v0.9.0 // indirect ) diff --git a/go.sum b/go.sum index b633769..2412f73 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,15 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 h1:JgAlPJlCqsrUqXcClndnvF6LOjV528hpU/l5YzN++PA= github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= +github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -13,26 +17,40 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 1c8cf2acb28f8cc0b70033342eb5b649de80f9db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 11:44:40 +0200 Subject: [PATCH 13/39] Update Golang version for GitHub CI --- .github/workflows/go.yml | 6 +++--- go.mod | 2 +- go.sum | 16 ---------------- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index c629925..5fe6a11 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -5,10 +5,10 @@ jobs: name: Build and test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 with: - go-version: 1.16 + go-version: 1.19 - name: Build run: make - name: Test diff --git a/go.mod b/go.mod index e327d78..3ebe12d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/P147x/shibesbot -go 1.18 +go 1.19 require ( github.com/bwmarrin/discordgo v0.27.1 diff --git a/go.sum b/go.sum index 2412f73..4bcc2c3 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,9 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 h1:JgAlPJlCqsrUqXcClndnvF6LOjV528hpU/l5YzN++PA= -github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -15,36 +12,23 @@ github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 815d3cfba86e1201231123daaae330b53ee4491b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 12:34:46 +0200 Subject: [PATCH 14/39] Update Golang version in Dockerfile --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index a76273a..f8db200 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM golang:1.16.5 AS build -WORKDIR $GOPATH/src/github.com/P147x/shibesbot +FROM golang:1.19 AS build +WORKDIR $GOPATH/src/github.com/codeinuit/shibesbot COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o app ./cmd/shibesbot FROM alpine:latest WORKDIR /root/ -COPY --from=build /go/src/github.com/P147x/shibesbot/app . +COPY --from=build /go/src/github.com/codeinuit/shibesbot/app . ENTRYPOINT ["./app"] From 6c9c9725526b4105b9106ba624501ca19acb42dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 15:08:59 +0200 Subject: [PATCH 15/39] Remove private tokens from image providers --- cmd/shibesbot/discord.go | 97 +++++++++++++++++-------------------- cmd/shibesbot/dogequests.go | 17 ++++--- cmd/shibesbot/main.go | 66 ++++++++++++++++++++++--- go.mod | 3 ++ go.sum | 12 +++++ 5 files changed, 128 insertions(+), 67 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index cfab5ea..57ce3c6 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -1,15 +1,9 @@ package main import ( - "fmt" - "os" - "os/signal" - "strconv" "sync" - "syscall" "time" - "github.com/P147x/shibesbot/pkg/logger" "github.com/bwmarrin/discordgo" ) @@ -17,7 +11,6 @@ var ( Users int UsageResetTimer time.Timer Mtx sync.Mutex - BotSession *discordgo.Session commands = []*discordgo.ApplicationCommand{ { @@ -47,39 +40,37 @@ var ( } ) -func initDiscord(log logger.Logger, t string) { +func (sb *Shibesbot) initDiscord() error { var err error - BotSession, err = discordgo.New("Bot " + t) + + sb.session, err = discordgo.New("Bot " + sb.apiConfigurations.discordToken) if err != nil { - log.Error("Connexion error: ", err.Error()) - return + return err } - BotSession.AddHandler(commandPicker) - err = BotSession.Open() - if err != nil { - log.Error("Connexion error : ", err.Error()) - return + + sb.session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { sb.commandPicker(s, i) }) + if err = sb.session.Open(); err != nil { + return err } - defer BotSession.Close() + for _, cmd := range commands { - BotSession.ApplicationCommandCreate(BotSession.State.User.ID, "", cmd) + _, err := sb.session.ApplicationCommandCreate(sb.session.State.User.ID, "", cmd) + if err != nil { + return err + } } - resetUsageCounter(log) - log.Info("Bot OK, ready to bork on people") - sc := make(chan os.Signal, 1) - signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) - <-sc - log.Info("Signal received, stopping in progress") + // resetUsageCounter(log) + return nil } -func commandPicker(s *discordgo.Session, i *discordgo.InteractionCreate) { - fmt.Println("command received: " + i.ApplicationCommandData().Name) +func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.InteractionCreate) { + sb.log.Info("command received: " + i.ApplicationCommandData().Name) var response string switch i.ApplicationCommandData().Name { case "shibes": - response = getShibes() - incrementPresenceUpdate() + response = sb.getShibes() + // incrementPresenceUpdate() case "sgifs": response = getShibesGifs() case "shelp": @@ -102,30 +93,30 @@ func commandPicker(s *discordgo.Session, i *discordgo.InteractionCreate) { }) } -func resetUsageCounter(log logger.Logger) { - t := time.Now() - n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) - resetPresenceUpdate() - log.Info("Reset programmed in ", n.Sub(t).String()) - f := func() { resetUsageCounter(log) } - time.AfterFunc(n.Sub(t), f) -} +// func resetUsageCounter(log logger.Logger) { +// t := time.Now() +// n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) +// resetPresenceUpdate() +// log.Info("Reset programmed in ", n.Sub(t).String()) +// f := func() { resetUsageCounter(log) } +// time.AfterFunc(n.Sub(t), f) +// } -func resetPresenceUpdate() { - Mtx.Lock() - defer Mtx.Unlock() - Users = 0 - updatePresenceUpdate(BotSession) -} +// func resetPresenceUpdate() { +// Mtx.Lock() +// defer Mtx.Unlock() +// Users = 0 +// updatePresenceUpdate(BotSession) +// } +// +// func incrementPresenceUpdate() { +// Mtx.Lock() +// defer Mtx.Unlock() +// Users++ +// updatePresenceUpdate(BotSession) +// } -func incrementPresenceUpdate() { - Mtx.Lock() - defer Mtx.Unlock() - Users++ - updatePresenceUpdate(BotSession) -} - -func updatePresenceUpdate(s *discordgo.Session) { - s.UpdateGameStatus(0, "shelp for help || "+ - strconv.Itoa(Users)+" usages this day.") -} +// func updatePresenceUpdate(s *discordgo.Session) { +// s.UpdateGameStatus(0, "shelp for help || "+ +// strconv.Itoa(Users)+" usages this day.") +// } diff --git a/cmd/shibesbot/dogequests.go b/cmd/shibesbot/dogequests.go index 59c0a0e..1f7f467 100644 --- a/cmd/shibesbot/dogequests.go +++ b/cmd/shibesbot/dogequests.go @@ -4,11 +4,13 @@ import ( "io/ioutil" "math/rand" "net/http" + "github.com/ivolo/go-giphy" + "encoding/json" + "github.com/bwmarrin/discordgo" log "github.com/sirupsen/logrus" - "encoding/json" ) var ( @@ -52,27 +54,27 @@ type ShibesData struct { Wallpapers ShibesWallpapers } -func init() { +func (sb *Shibesbot) initRequests() { req, err := http.NewRequest("GET", "https://wall.alphacoders.com/api2.0/get.php", nil) if err != nil { log.Error("Error while getting images : ", err.Error()) return } q := req.URL.Query() - q.Add("auth", "c8b66cee6ef7022a615da5cbba315f3c") + q.Add("auth", sb.apiConfigurations.alphacodersToken) q.Add("method", "search") q.Add("term", "Shiba") req.URL.RawQuery = q.Encode() resp, err := http.Get(req.URL.String()) if err != nil { - log.Error("Error while getting images : ", err.Error()) + sb.log.Error("Error while getting images : ", err.Error()) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { - log.Error("Error while getting images : ", err.Error()) + sb.log.Error("Error while getting images : ", err.Error()) return } var res AlphacodersData @@ -81,13 +83,13 @@ func init() { Shibes.Wallpapers.Shibes = res.Wallpapers Shibes.Wallpapers.Total = len(res.Wallpapers) - gp := giphy.New("PcVZFoFsmh2vhFHqSKjhvbnwq74N7JSi") + gp := giphy.New(sb.apiConfigurations.giphyToken) Shibes.Gifs.Shibes, _ = gp.Search("shiba") Shibes.Gifs.Total = len(Shibes.Gifs.Shibes) Shibes.Gifs.Cursor = 0 } -func getShibes() string { +func (sb *Shibesbot) getShibes() string { if Shibes.Images.Cursor >= Shibes.Images.Total { Shibes.Images.Cursor = 0 Shibes.Images.Total = 10 @@ -96,6 +98,7 @@ func getShibes() string { defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) json.Unmarshal(body, &Shibes.Images.Shibes) + sb.log.Info("Updated ", Shibes.Images.Total, " pictures from shibes.online") } } Shibes.Images.Cursor++ diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 7583dcd..a69d8d8 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -2,22 +2,74 @@ package main import ( "os" + "os/signal" + "syscall" "github.com/P147x/shibesbot/pkg/logger" "github.com/P147x/shibesbot/pkg/logger/logrus" + "github.com/bwmarrin/discordgo" ) +const ( + DISCORD_TOKEN = "SHIBESBOT_TOKEN" + ALPHACODERS_TOKEN = "ALPHACODERS_TOKEN" + SHIBESONLINE_TOKEN = "SHIBESONLINE_TOKEN" + GIPHY_TOKEN = "GIPHY_TOKEN" +) + +type ApiConfigurations struct { + discordToken string + alphacodersToken string + shibesolineToken string + giphyToken string +} + +type Shibesbot struct { + session *discordgo.Session + + apiConfigurations ApiConfigurations + log logger.Logger +} + +func initConfiguration() *Shibesbot { + return &Shibesbot{ + log: logrus.NewLogrusLogger(), + apiConfigurations: ApiConfigurations{ + discordToken: os.Getenv(DISCORD_TOKEN), + alphacodersToken: os.Getenv(ALPHACODERS_TOKEN), + shibesolineToken: os.Getenv(SHIBESONLINE_TOKEN), + giphyToken: os.Getenv(GIPHY_TOKEN), + }, + } + +} + func main() { - var log logger.Logger + sb := initConfiguration() + sb.log.Info("Starting Shibesbot") - log = logrus.NewLogrusLogger() - log.Info("Starting Shibesbot") + if len(sb.apiConfigurations.discordToken) <= 0 { + sb.log.Error("Environnement variable SHIBESBOT_TOKEN is not provided") + return + } - var token string - if token = os.Getenv("SHIBESBOT_TOKEN"); len(token) == 0 { - log.Error("Environnement variable SHIBESBOT_TOKEN is not provided") + if err := sb.initDiscord(); err != nil { + sb.log.Error("Connexion error: ", err.Error()) return } + defer func() { + if err := sb.session.Close(); err != nil { + sb.log.Error("Discord session could not close properly:", err.Error()) + return + } + + sb.log.Error("Discord session closed successfully") + }() + + sb.log.Info("Shibesbot OK, ready to nicely bork on people") - initDiscord(log, token) + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) + <-sc + sb.log.Info("Stop signal has been received, stopping Shibesbot..") } diff --git a/go.mod b/go.mod index 3ebe12d..489b4d3 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,13 @@ go 1.19 require ( github.com/bwmarrin/discordgo v0.27.1 github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 + github.com/rs/zerolog v1.29.1 github.com/sirupsen/logrus v1.9.3 ) require ( + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 4bcc2c3..2211416 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,27 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -29,6 +39,8 @@ golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From e728867edc50ae00cdfad08cd2b2691f481bcf0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 16:52:35 +0200 Subject: [PATCH 16/39] Protected cases without data --- cmd/shibesbot/dogequests.go | 81 +++++++++++++++++++++++++++++-------- cmd/shibesbot/main.go | 4 +- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/cmd/shibesbot/dogequests.go b/cmd/shibesbot/dogequests.go index 1f7f467..5de2e58 100644 --- a/cmd/shibesbot/dogequests.go +++ b/cmd/shibesbot/dogequests.go @@ -1,6 +1,7 @@ package main import ( + "errors" "io/ioutil" "math/rand" "net/http" @@ -10,7 +11,6 @@ import ( "encoding/json" "github.com/bwmarrin/discordgo" - log "github.com/sirupsen/logrus" ) var ( @@ -54,39 +54,80 @@ type ShibesData struct { Wallpapers ShibesWallpapers } -func (sb *Shibesbot) initRequests() { +func initWallpapers(t string) (wp ShibesWallpapers, err error) { + wpEmpty := ShibesWallpapers{ + Cursor: 0, + Total: 0, + Shibes: make([]WallpaperData, 0), + } + + if len(t) <= 0 { + return wpEmpty, errors.New("no alphacoders token provided, skipping") + } req, err := http.NewRequest("GET", "https://wall.alphacoders.com/api2.0/get.php", nil) if err != nil { - log.Error("Error while getting images : ", err.Error()) - return + return wpEmpty, err } + q := req.URL.Query() - q.Add("auth", sb.apiConfigurations.alphacodersToken) + q.Add("auth", t) q.Add("method", "search") q.Add("term", "Shiba") req.URL.RawQuery = q.Encode() resp, err := http.Get(req.URL.String()) if err != nil { - sb.log.Error("Error while getting images : ", err.Error()) - return + return wpEmpty, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { - sb.log.Error("Error while getting images : ", err.Error()) - return + return wpEmpty, err + } var res AlphacodersData json.Unmarshal(body, &res) - Shibes.Wallpapers.Shibes = make([]WallpaperData, len(res.Wallpapers)) - Shibes.Wallpapers.Shibes = res.Wallpapers - Shibes.Wallpapers.Total = len(res.Wallpapers) - - gp := giphy.New(sb.apiConfigurations.giphyToken) - Shibes.Gifs.Shibes, _ = gp.Search("shiba") - Shibes.Gifs.Total = len(Shibes.Gifs.Shibes) - Shibes.Gifs.Cursor = 0 + wp.Shibes = make([]WallpaperData, len(res.Wallpapers)) + wp.Shibes = res.Wallpapers + wp.Total = len(res.Wallpapers) + + return wp, nil +} + +func initGifs(t string) (ShibesGifs, error) { + var gifs ShibesGifs + + if len(t) <= 0 { + return ShibesGifs{ + Cursor: 0, + Shibes: make([]giphy.Gif, 0), + Total: 0, + }, errors.New("no giphy token provided, skipping") + } + + gp := giphy.New(t) + gifs.Shibes, _ = gp.Search("shiba") + gifs.Total = len(gifs.Shibes) + gifs.Cursor = 0 + + return gifs, nil +} + +func (sb *Shibesbot) initRequests() { + var err error + + Shibes.Wallpapers, err = initWallpapers(sb.apiConfigurations.alphacodersToken) + sb.log.Info("retrieved ", Shibes.Wallpapers.Total, " wallpapers") + if err != nil { + sb.log.Warn(err) + } + + Shibes.Gifs, err = initGifs(sb.apiConfigurations.giphyToken) + sb.log.Info("retrieved ", Shibes.Gifs.Total, " gifs") + if err != nil { + sb.log.Warn(err) + } + } func (sb *Shibesbot) getShibes() string { @@ -129,9 +170,15 @@ func getHelp() *discordgo.MessageEmbed { } func getShibesGifs() string { + if Shibes.Gifs.Total <= 0 { + return "no gifs available, sorry. :(" + } return Shibes.Gifs.Shibes[rand.Int()%Shibes.Gifs.Total].URL } func getShibesWallpaper() string { + if Shibes.Wallpapers.Total <= 0 { + return "no wallpapers available, sorry. :(" + } return string(Shibes.Wallpapers.Shibes[rand.Int()%Shibes.Wallpapers.Total].Url_Image) } diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index a69d8d8..dd0fa4c 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -41,11 +41,11 @@ func initConfiguration() *Shibesbot { giphyToken: os.Getenv(GIPHY_TOKEN), }, } - } func main() { sb := initConfiguration() + sb.initRequests() sb.log.Info("Starting Shibesbot") if len(sb.apiConfigurations.discordToken) <= 0 { @@ -63,7 +63,7 @@ func main() { return } - sb.log.Error("Discord session closed successfully") + sb.log.Info("Discord session closed successfully") }() sb.log.Info("Shibesbot OK, ready to nicely bork on people") From 3fa2af933e8702227b8f121803dbbac74ac6b5a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 16:54:45 +0200 Subject: [PATCH 17/39] Remove usage counter --- cmd/shibesbot/discord.go | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 57ce3c6..231f7aa 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -1,17 +1,10 @@ package main import ( - "sync" - "time" - "github.com/bwmarrin/discordgo" ) var ( - Users int - UsageResetTimer time.Timer - Mtx sync.Mutex - commands = []*discordgo.ApplicationCommand{ { Name: "shibes", @@ -60,7 +53,6 @@ func (sb *Shibesbot) initDiscord() error { } } - // resetUsageCounter(log) return nil } @@ -70,7 +62,6 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio switch i.ApplicationCommandData().Name { case "shibes": response = sb.getShibes() - // incrementPresenceUpdate() case "sgifs": response = getShibesGifs() case "shelp": @@ -92,31 +83,3 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio }, }) } - -// func resetUsageCounter(log logger.Logger) { -// t := time.Now() -// n := time.Date(t.Year(), t.Month(), t.Day(), 24, 0, 0, 0, t.Location()) -// resetPresenceUpdate() -// log.Info("Reset programmed in ", n.Sub(t).String()) -// f := func() { resetUsageCounter(log) } -// time.AfterFunc(n.Sub(t), f) -// } - -// func resetPresenceUpdate() { -// Mtx.Lock() -// defer Mtx.Unlock() -// Users = 0 -// updatePresenceUpdate(BotSession) -// } -// -// func incrementPresenceUpdate() { -// Mtx.Lock() -// defer Mtx.Unlock() -// Users++ -// updatePresenceUpdate(BotSession) -// } - -// func updatePresenceUpdate(s *discordgo.Session) { -// s.UpdateGameStatus(0, "shelp for help || "+ -// strconv.Itoa(Users)+" usages this day.") -// } From cecf9bb39a9ed8fc2fefaf2be0195596c42a1686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 17:16:58 +0200 Subject: [PATCH 18/39] Update .gitignore to remove vscode & bin files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index a1338d6..5b54145 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ + +.vscode +bin/ From a17eb2d0607807b8695a1b0992f7318ff07a025d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 3 Jul 2023 17:21:16 +0200 Subject: [PATCH 19/39] Move deployments scripts to /scripts folder --- deploy-staging.sh => scripts/deploy-staging.sh | 0 remove-staging.sh => scripts/remove-staging.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename deploy-staging.sh => scripts/deploy-staging.sh (100%) rename remove-staging.sh => scripts/remove-staging.sh (100%) diff --git a/deploy-staging.sh b/scripts/deploy-staging.sh similarity index 100% rename from deploy-staging.sh rename to scripts/deploy-staging.sh diff --git a/remove-staging.sh b/scripts/remove-staging.sh similarity index 100% rename from remove-staging.sh rename to scripts/remove-staging.sh From 1b3cf50b55d3af24eb23981bce74c0d3402c3860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Wed, 5 Jul 2023 10:45:59 +0200 Subject: [PATCH 20/39] Add Redis support as cache --- pkg/cache/cache.go | 10 +++++++++ pkg/cache/redis/redis.go | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 pkg/cache/cache.go create mode 100644 pkg/cache/redis/redis.go diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go new file mode 100644 index 0000000..e0daaab --- /dev/null +++ b/pkg/cache/cache.go @@ -0,0 +1,10 @@ +package cache + +import "context" + +// Cache is an interface for cache implementations +type Cache interface { + Get(context.Context, string) (any, error) + Set(context.Context, string, string) (any, error) + Incr(context.Context, string) (any, error) +} diff --git a/pkg/cache/redis/redis.go b/pkg/cache/redis/redis.go new file mode 100644 index 0000000..1337548 --- /dev/null +++ b/pkg/cache/redis/redis.go @@ -0,0 +1,46 @@ +package redis + +import ( + "context" + "fmt" + + "github.com/redis/go-redis/v9" +) + +type RedisDB struct { + client *redis.Client +} + +type RedisOptions struct { + Port int32 + Address string + Password string + Database string +} + +func NewRedisCache(opt RedisOptions) (*RedisDB, error) { + client := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("%s:%d", opt.Address, opt.Port), + Password: opt.Password, + DB: 0, + }) + + ctx := context.TODO() + if err := client.Ping(ctx).Err(); err != nil { + return &RedisDB{}, err + } + + return &RedisDB{client: client}, nil +} + +func (r *RedisDB) Get(ctx context.Context, k string) (any, error) { + return r.client.Get(ctx, k).Result() +} + +func (r *RedisDB) Set(ctx context.Context, k, v string) (any, error) { + return r.client.Set(ctx, k, v, 0).Result() +} + +func (r *RedisDB) Incr(ctx context.Context, k string) (any, error) { + return r.client.Incr(ctx, k).Result() +} From b15c235e7e8e21b6e2ffb34d2a3947bde6ca4dc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Fri, 7 Jul 2023 12:53:42 +0200 Subject: [PATCH 21/39] Update go.mod --- go.mod | 7 ++++--- go.sum | 21 +++++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 489b4d3..018cd05 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,14 @@ go 1.19 require ( github.com/bwmarrin/discordgo v0.27.1 github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 - github.com/rs/zerolog v1.29.1 + github.com/redis/go-redis/v9 v9.0.5 github.com/sirupsen/logrus v1.9.3 ) require ( - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/pkg/errors v0.9.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 2211416..e95e386 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,26 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= +github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= -github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o= +github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -39,8 +38,6 @@ golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 052ac36bd22c2b72743958becc6ad2a4b8a16157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Fri, 7 Jul 2023 14:42:10 +0200 Subject: [PATCH 22/39] Count usage and display it as Discord game status --- cmd/shibesbot/discord.go | 32 ++++++++++++++++++++++++++++++++ cmd/shibesbot/main.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 231f7aa..84f355f 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -1,6 +1,10 @@ package main import ( + "context" + "fmt" + "time" + "github.com/bwmarrin/discordgo" ) @@ -42,6 +46,15 @@ func (sb *Shibesbot) initDiscord() error { } sb.session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { sb.commandPicker(s, i) }) + sb.session.AddHandlerOnce(func(s *discordgo.Session, i *discordgo.Ready) { + t := time.Now() + key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) + count, err := sb.cache.Get(context.Background(), key) + if err != nil { + sb.log.Warn("could not get daily counter from cache : ", err.Error()) + } + s.UpdateGameStatus(0, fmt.Sprintf("used %s times today", count)) + }) if err = sb.session.Open(); err != nil { return err } @@ -82,4 +95,23 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio Content: response, }, }) + count := sb.updateDailyCounter() + s.UpdateGameStatus(0, fmt.Sprintf("used %d times today", count)) +} + +func (sb *Shibesbot) updateDailyCounter() int64 { + t := time.Now() + key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) + count, err := sb.cache.Incr(context.Background(), key) + if err != nil { + sb.log.Warn("could not get daily counter from cache : ", err.Error()) + return 0 + } + countInt, ok := count.(int64) + if !ok { + sb.log.Warn("could not get daily counter from cache") + return 0 + } + + return countInt } diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index dd0fa4c..f3f1f39 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -1,20 +1,31 @@ package main import ( + "log" "os" "os/signal" + "strconv" "syscall" + "github.com/P147x/shibesbot/pkg/cache" + "github.com/P147x/shibesbot/pkg/cache/redis" "github.com/P147x/shibesbot/pkg/logger" "github.com/P147x/shibesbot/pkg/logger/logrus" "github.com/bwmarrin/discordgo" ) +// ENV variables const ( DISCORD_TOKEN = "SHIBESBOT_TOKEN" ALPHACODERS_TOKEN = "ALPHACODERS_TOKEN" SHIBESONLINE_TOKEN = "SHIBESONLINE_TOKEN" GIPHY_TOKEN = "GIPHY_TOKEN" + + // Redis configuration + REDIS_ADDR = "REDIS_ADDR" + REDIS_PORT = "REDIS_PORT" + REDIS_PASS = "REDIS_PASS" + REDIS_DB = "REDIS_DB" ) type ApiConfigurations struct { @@ -29,11 +40,28 @@ type Shibesbot struct { apiConfigurations ApiConfigurations log logger.Logger + cache cache.Cache } func initConfiguration() *Shibesbot { + port, err := strconv.Atoi(os.Getenv(REDIS_PORT)) + if err != nil { + port = 6379 + } + + r, err := redis.NewRedisCache(redis.RedisOptions{ + Address: os.Getenv(REDIS_ADDR), + Port: int32(port), + Password: os.Getenv(REDIS_PASS), + }) + + if err != nil { + log.Fatal(err.Error()) + } + return &Shibesbot{ - log: logrus.NewLogrusLogger(), + cache: r, + log: logrus.NewLogrusLogger(), apiConfigurations: ApiConfigurations{ discordToken: os.Getenv(DISCORD_TOKEN), alphacodersToken: os.Getenv(ALPHACODERS_TOKEN), From 0c7bc5c04dd4da504fdc155faaaad22533510503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 10 Jul 2023 09:23:21 +0200 Subject: [PATCH 23/39] Update log messages without uppercases --- cmd/shibesbot/main.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index f3f1f39..53b8a1a 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -74,30 +74,30 @@ func initConfiguration() *Shibesbot { func main() { sb := initConfiguration() sb.initRequests() - sb.log.Info("Starting Shibesbot") + sb.log.Info("starting Shibesbot") if len(sb.apiConfigurations.discordToken) <= 0 { - sb.log.Error("Environnement variable SHIBESBOT_TOKEN is not provided") + sb.log.Error("environnement variable SHIBESBOT_TOKEN is not provided") return } if err := sb.initDiscord(); err != nil { - sb.log.Error("Connexion error: ", err.Error()) + sb.log.Error("connexion error: ", err.Error()) return } defer func() { if err := sb.session.Close(); err != nil { - sb.log.Error("Discord session could not close properly:", err.Error()) + sb.log.Error("discord session could not close properly:", err.Error()) return } - sb.log.Info("Discord session closed successfully") + sb.log.Info("discord session closed successfully") }() - sb.log.Info("Shibesbot OK, ready to nicely bork on people") + sb.log.Info("shibesbot OK, ready to nicely bork on people") sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) <-sc - sb.log.Info("Stop signal has been received, stopping Shibesbot..") + sb.log.Info("stop signal has been received, stopping Shibesbot..") } From a504831269547ecab675338a21352b7d8694b2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Mon, 10 Jul 2023 12:15:15 +0200 Subject: [PATCH 24/39] Reset daily counter every day at midnight --- cmd/shibesbot/discord.go | 27 +++++++++---------- cmd/shibesbot/main.go | 56 ++++++++++++++++++++++++++++++++++++++++ go.mod | 1 + go.sum | 2 ++ pkg/cache/cache.go | 1 + pkg/cache/redis/redis.go | 4 +++ 6 files changed, 78 insertions(+), 13 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 84f355f..f4b6530 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -3,7 +3,6 @@ package main import ( "context" "fmt" - "time" "github.com/bwmarrin/discordgo" ) @@ -47,9 +46,7 @@ func (sb *Shibesbot) initDiscord() error { sb.session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { sb.commandPicker(s, i) }) sb.session.AddHandlerOnce(func(s *discordgo.Session, i *discordgo.Ready) { - t := time.Now() - key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) - count, err := sb.cache.Get(context.Background(), key) + count, err := sb.cache.Get(context.Background(), sb.dailyKey) if err != nil { sb.log.Warn("could not get daily counter from cache : ", err.Error()) } @@ -95,23 +92,27 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio Content: response, }, }) - count := sb.updateDailyCounter() - s.UpdateGameStatus(0, fmt.Sprintf("used %d times today", count)) + + sb.updateDailyCounter() } -func (sb *Shibesbot) updateDailyCounter() int64 { - t := time.Now() - key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) - count, err := sb.cache.Incr(context.Background(), key) +func (sb *Shibesbot) updateDailyCounter() { + sb.mtx.RLock() + defer sb.mtx.RUnlock() + count, err := sb.cache.Incr(context.Background(), sb.dailyKey) if err != nil { sb.log.Warn("could not get daily counter from cache : ", err.Error()) - return 0 + return } countInt, ok := count.(int64) if !ok { sb.log.Warn("could not get daily counter from cache") - return 0 + return } - return countInt + sb.setDailyCounter(countInt) +} + +func (sb *Shibesbot) setDailyCounter(count int64) { + sb.session.UpdateGameStatus(0, fmt.Sprintf("used %d times today", count)) } diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 53b8a1a..cf932ca 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -1,17 +1,22 @@ package main import ( + "context" + "fmt" "log" "os" "os/signal" "strconv" + "sync" "syscall" + "time" "github.com/P147x/shibesbot/pkg/cache" "github.com/P147x/shibesbot/pkg/cache/redis" "github.com/P147x/shibesbot/pkg/logger" "github.com/P147x/shibesbot/pkg/logger/logrus" "github.com/bwmarrin/discordgo" + "github.com/robfig/cron/v3" ) // ENV variables @@ -38,6 +43,9 @@ type ApiConfigurations struct { type Shibesbot struct { session *discordgo.Session + dailyKey string + mtx sync.RWMutex + apiConfigurations ApiConfigurations log logger.Logger cache cache.Cache @@ -71,10 +79,45 @@ func initConfiguration() *Shibesbot { } } +func (sb *Shibesbot) setDailyKey() { + sb.log.Info("setting daily counter") + sb.mtx.Lock() + defer sb.mtx.Unlock() + + t := time.Now() + key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) + + isUnset, err := sb.cache.SetNX(context.Background(), key, 0) + if err != nil { + sb.log.Warn("could not update and retrieve usage count: ", err.Error()) + return + } + + if isUnset == true { + count, err := sb.cache.Get(context.Background(), key) + + if err != nil { + sb.log.Warn("could not update and retrieve usage count: ", err.Error()) + return + } + + countInt, ok := count.(int64) + if !ok { + sb.log.Warn("could not set daily counter") + return + } + + sb.setDailyCounter(countInt) + + return + } +} + func main() { sb := initConfiguration() sb.initRequests() sb.log.Info("starting Shibesbot") + c := cron.New() if len(sb.apiConfigurations.discordToken) <= 0 { sb.log.Error("environnement variable SHIBESBOT_TOKEN is not provided") @@ -94,6 +137,19 @@ func main() { sb.log.Info("discord session closed successfully") }() + _, err := c.AddFunc("0 0 * * *", func() { + sb.log.Info("running daily counter update job") + sb.setDailyKey() + }) + + if err != nil { + sb.log.Error("could not create cronjob: ", err.Error()) + return + } + + c.Start() + defer c.Stop() + sb.log.Info("shibesbot OK, ready to nicely bork on people") sc := make(chan os.Signal, 1) diff --git a/go.mod b/go.mod index 018cd05..d5a7c0f 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/robfig/cron/v3 v3.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index e95e386..76d52ce 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o= github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= +github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index e0daaab..b344a76 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -7,4 +7,5 @@ type Cache interface { Get(context.Context, string) (any, error) Set(context.Context, string, string) (any, error) Incr(context.Context, string) (any, error) + SetNX(context.Context, string, any) (any, error) } diff --git a/pkg/cache/redis/redis.go b/pkg/cache/redis/redis.go index 1337548..409584e 100644 --- a/pkg/cache/redis/redis.go +++ b/pkg/cache/redis/redis.go @@ -44,3 +44,7 @@ func (r *RedisDB) Set(ctx context.Context, k, v string) (any, error) { func (r *RedisDB) Incr(ctx context.Context, k string) (any, error) { return r.client.Incr(ctx, k).Result() } + +func (r *RedisDB) SetNX(ctx context.Context, k string, v any) (any, error) { + return r.client.SetNX(ctx, k, v, 0).Result() +} From 4669b28a0a55a758a36ef9a592664530afb79f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Tue, 11 Jul 2023 18:10:37 +0200 Subject: [PATCH 25/39] Add error handling --- cmd/shibesbot/discord.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index f4b6530..dcb44e3 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "strconv" "github.com/bwmarrin/discordgo" ) @@ -49,9 +50,23 @@ func (sb *Shibesbot) initDiscord() error { count, err := sb.cache.Get(context.Background(), sb.dailyKey) if err != nil { sb.log.Warn("could not get daily counter from cache : ", err.Error()) + return } - s.UpdateGameStatus(0, fmt.Sprintf("used %s times today", count)) + + countString, ok := count.(string) + if !ok { + sb.log.Warn("could not get daily counter from cache : conversion error") + return + } + countInt, err := strconv.Atoi(countString) + if err != nil { + sb.log.Warn("could not get daily counter from cache : ", err.Error()) + return + } + + sb.setDailyCounter(int64(countInt)) }) + if err = sb.session.Open(); err != nil { return err } From 64df2c465ddae6afbd92dd1487565f765363ce58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Tue, 11 Jul 2023 18:16:07 +0200 Subject: [PATCH 26/39] Add linter support on GitHub CI --- .github/workflows/golangci-lint.yml | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/golangci-lint.yml diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 0000000..bdfa495 --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,55 @@ +name: golangci-lint +on: + push: + branches: + - master + - dev + pull_request: + +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + # pull-requests: read + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: '1.20' + cache: false + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + # Require: The version of golangci-lint to use. + # When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version. + # When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit. + version: v1.53 + + # Optional: working directory, useful for monorepos + # working-directory: somedir + + # Optional: golangci-lint command line arguments. + # + # Note: By default, the `.golangci.yml` file should be at the root of the repository. + # The location of the configuration file can be changed by using `--config=` + # args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0 + + # Optional: show only new issues if it's a pull request. The default value is `false`. + # only-new-issues: true + + # Optional: if set to true, then all caching functionality will be completely disabled, + # takes precedence over all other caching options. + # skip-cache: true + + # Optional: if set to true, then the action won't cache or restore ~/go/pkg. + # skip-pkg-cache: true + + # Optional: if set to true, then the action won't cache or restore ~/.cache/go-build. + # skip-build-cache: true + + # Optional: The mode to install golangci-lint. It can be 'binary' or 'goinstall'. + # install-mode: "goinstall" From 56f39fb1b48aed51eacc1053e9146f7a4e8183a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Tue, 11 Jul 2023 18:49:05 +0200 Subject: [PATCH 27/39] Fix lint issue --- cmd/shibesbot/discord.go | 17 ++++++++++++++--- cmd/shibesbot/dogequests.go | 28 +++++++++++++++------------- cmd/shibesbot/main.go | 2 +- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index dcb44e3..87ea622 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -90,24 +90,32 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio case "sgifs": response = getShibesGifs() case "shelp": - s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Embeds: []*discordgo.MessageEmbed{getHelp()}, }, }) + if err != nil { + sb.log.Error("could not answer to user help command: ", err.Error()) + } return case "swalls": response = getShibesWallpaper() } - s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Content: response, }, }) + if err != nil { + sb.log.Error("could not answer to user help command: ", err.Error()) + return + } + sb.updateDailyCounter() } @@ -129,5 +137,8 @@ func (sb *Shibesbot) updateDailyCounter() { } func (sb *Shibesbot) setDailyCounter(count int64) { - sb.session.UpdateGameStatus(0, fmt.Sprintf("used %d times today", count)) + err := sb.session.UpdateGameStatus(0, fmt.Sprintf("used %d times today", count)) + if err != nil { + sb.log.Warn("could not update daily counter: ", err.Error()) + } } diff --git a/cmd/shibesbot/dogequests.go b/cmd/shibesbot/dogequests.go index 5de2e58..1e91781 100644 --- a/cmd/shibesbot/dogequests.go +++ b/cmd/shibesbot/dogequests.go @@ -2,7 +2,6 @@ package main import ( "errors" - "io/ioutil" "math/rand" "net/http" @@ -79,14 +78,12 @@ func initWallpapers(t string) (wp ShibesWallpapers, err error) { return wpEmpty, err } defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - + var res AlphacodersData + err = json.NewDecoder(resp.Body).Decode(&res) if err != nil { return wpEmpty, err - } - var res AlphacodersData - json.Unmarshal(body, &res) + wp.Shibes = make([]WallpaperData, len(res.Wallpapers)) wp.Shibes = res.Wallpapers wp.Total = len(res.Wallpapers) @@ -119,13 +116,13 @@ func (sb *Shibesbot) initRequests() { Shibes.Wallpapers, err = initWallpapers(sb.apiConfigurations.alphacodersToken) sb.log.Info("retrieved ", Shibes.Wallpapers.Total, " wallpapers") if err != nil { - sb.log.Warn(err) + sb.log.Warn("could not retrieve wallpapers: ", err.Error()) } Shibes.Gifs, err = initGifs(sb.apiConfigurations.giphyToken) sb.log.Info("retrieved ", Shibes.Gifs.Total, " gifs") if err != nil { - sb.log.Warn(err) + sb.log.Warn("could not retrieve gifs: ", err.Error()) } } @@ -135,12 +132,17 @@ func (sb *Shibesbot) getShibes() string { Shibes.Images.Cursor = 0 Shibes.Images.Total = 10 resp, err := http.Get("http://shibe.online/api/shibes?count=10") - if err == nil { - defer resp.Body.Close() - body, _ := ioutil.ReadAll(resp.Body) - json.Unmarshal(body, &Shibes.Images.Shibes) - sb.log.Info("Updated ", Shibes.Images.Total, " pictures from shibes.online") + if err != nil { + sb.log.Warn("could not get images from shibes.online: ", err.Error()) + return "" + } + defer resp.Body.Close() + err = json.NewDecoder(resp.Body).Decode(&Shibes.Images.Shibes) + if err != nil { + sb.log.Warn("could not get images from shibes.online: ", err.Error()) + return "" } + sb.log.Info("Updated ", Shibes.Images.Total, " pictures from shibes.online") } Shibes.Images.Cursor++ return Shibes.Images.Shibes[Shibes.Images.Cursor-1] diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index cf932ca..96bbbf8 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -153,7 +153,7 @@ func main() { sb.log.Info("shibesbot OK, ready to nicely bork on people") sc := make(chan os.Signal, 1) - signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) <-sc sb.log.Info("stop signal has been received, stopping Shibesbot..") } From 54f5f8bb8525151168e44cc590d60ef195461ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Fri, 14 Jul 2023 12:14:57 +0200 Subject: [PATCH 28/39] Fix daily key not set --- cmd/shibesbot/discord.go | 5 +++++ cmd/shibesbot/main.go | 1 + 2 files changed, 6 insertions(+) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 87ea622..17223de 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strconv" + "time" "github.com/bwmarrin/discordgo" ) @@ -47,6 +48,10 @@ func (sb *Shibesbot) initDiscord() error { sb.session.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { sb.commandPicker(s, i) }) sb.session.AddHandlerOnce(func(s *discordgo.Session, i *discordgo.Ready) { + t := time.Now() + key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) + sb.dailyKey = key + count, err := sb.cache.Get(context.Background(), sb.dailyKey) if err != nil { sb.log.Warn("could not get daily counter from cache : ", err.Error()) diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 96bbbf8..a778e9b 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -108,6 +108,7 @@ func (sb *Shibesbot) setDailyKey() { } sb.setDailyCounter(countInt) + sb.dailyKey = key return } From f3a79e31ad376cd226b9a89ca1f3946d829624e3 Mon Sep 17 00:00:00 2001 From: "Lucas D (inu)" Date: Mon, 24 Jul 2023 16:01:11 +0200 Subject: [PATCH 29/39] Create local storage implementation for caching --- go.mod | 4 ++ go.sum | 3 ++ pkg/cache/cache.go | 17 +++++-- pkg/cache/localstorage/localstorage.go | 69 ++++++++++++++++++++++++++ pkg/cache/localstorage_test.go | 42 ++++++++++++++++ pkg/cache/redis/redis.go | 9 +++- 6 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 pkg/cache/localstorage/localstorage.go create mode 100644 pkg/cache/localstorage_test.go diff --git a/go.mod b/go.mod index d5a7c0f..3383bd2 100644 --- a/go.mod +++ b/go.mod @@ -11,11 +11,15 @@ require ( require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/robfig/cron/v3 v3.0.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( diff --git a/go.sum b/go.sum index 76d52ce..0f0acad 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= @@ -49,3 +51,4 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index b344a76..77fa84a 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -2,10 +2,21 @@ package cache import "context" -// Cache is an interface for cache implementations +// Cache is used as the main implementation for caching libraries type Cache interface { + // Get returns the assigned value for a given key Get(context.Context, string) (any, error) - Set(context.Context, string, string) (any, error) + + // Set registers a value, regardless if the key as been + // already set or not. + Set(context.Context, string, any) (any, error) + + // Incr increments an value for a given key. + // If the key does not exists, Incr assumes the default + // value is 0 and will return 1. Incr(context.Context, string) (any, error) - SetNX(context.Context, string, any) (any, error) + + // SetNX check if the key is already defined, and return + // the result as a boolean value. + SetNX(context.Context, string, any) (bool, error) } diff --git a/pkg/cache/localstorage/localstorage.go b/pkg/cache/localstorage/localstorage.go new file mode 100644 index 0000000..ea3b085 --- /dev/null +++ b/pkg/cache/localstorage/localstorage.go @@ -0,0 +1,69 @@ +package localstorage + +import ( + "context" + "errors" + "sync" +) + +type LocalStorage struct { + array map[string]any + rwm sync.RWMutex +} + +func NewLocalStorageCache() *LocalStorage { + return &LocalStorage{ + array: make(map[string]any), + } +} + +func (ls *LocalStorage) Get(ctx context.Context, k string) (any, error) { + ls.rwm.RLock() + defer ls.rwm.RUnlock() + + value, ok := ls.array[k] + if !ok { + return nil, errors.New("could not get value") + } + + return value, nil +} + +func (ls *LocalStorage) Set(ctx context.Context, k string, v any) (any, error) { + ls.rwm.Lock() + defer ls.rwm.Unlock() + + ls.array[k] = v + + return v, nil +} + +func (ls *LocalStorage) Incr(ctx context.Context, k string) (any, error) { + ls.rwm.Lock() + defer ls.rwm.Unlock() + + if ls.array[k] == nil { + ls.array[k] = 1 + return 1, nil + } + convertedValue, ok := ls.array[k].(int) + if !ok { + return nil, errors.New("could not increment value") + } + + ls.array[k] = convertedValue + 1 + return ls.array[k], nil +} + +func (ls *LocalStorage) SetNX(ctx context.Context, k string, v any) (bool, error) { + ls.rwm.Lock() + defer ls.rwm.Unlock() + + if ls.array[k] != nil { + ls.array[k] = v + + return false, nil + } + + return true, nil +} diff --git a/pkg/cache/localstorage_test.go b/pkg/cache/localstorage_test.go new file mode 100644 index 0000000..0b96600 --- /dev/null +++ b/pkg/cache/localstorage_test.go @@ -0,0 +1,42 @@ +package cache_test + +import ( + "context" + "testing" + + "github.com/P147x/shibesbot/pkg/cache" + "github.com/P147x/shibesbot/pkg/cache/localstorage" + "github.com/stretchr/testify/assert" +) + +func TestLocalStorage(t *testing.T) { + var cache cache.Cache + + const key string = "test" + const value string = "test" + + cache = localstorage.NewLocalStorageCache() + cache.Set(context.Background(), key, value) + awaitedValue, error := cache.Get(context.Background(), key) + + assert.Equal(t, nil, error) + assert.Equal(t, awaitedValue, value) +} + +func TestLocalStorageIncr(t *testing.T) { + var cache cache.Cache + + const key string = "test" + const value int = 41 + const newAwaitedValue int = 42 + + cache = localstorage.NewLocalStorageCache() + + cache.Set(context.Background(), key, value) + awaitedValue, error := cache.Incr(context.Background(), key) + convertedAwaitedValue, ok := awaitedValue.(int) + + assert.True(t, ok) + assert.Equal(t, nil, error) + assert.Equal(t, newAwaitedValue, convertedAwaitedValue) +} diff --git a/pkg/cache/redis/redis.go b/pkg/cache/redis/redis.go index 409584e..255b639 100644 --- a/pkg/cache/redis/redis.go +++ b/pkg/cache/redis/redis.go @@ -18,6 +18,7 @@ type RedisOptions struct { Database string } +// NewRedisCache returns a Redis implemenation based on Cache interface func NewRedisCache(opt RedisOptions) (*RedisDB, error) { client := redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%d", opt.Address, opt.Port), @@ -33,18 +34,22 @@ func NewRedisCache(opt RedisOptions) (*RedisDB, error) { return &RedisDB{client: client}, nil } +// Get is the implementation of Get Redis function func (r *RedisDB) Get(ctx context.Context, k string) (any, error) { return r.client.Get(ctx, k).Result() } -func (r *RedisDB) Set(ctx context.Context, k, v string) (any, error) { +// Set is the implementation of Set Redis function +func (r *RedisDB) Set(ctx context.Context, k string, v any) (any, error) { return r.client.Set(ctx, k, v, 0).Result() } +// Incr is the implementation of Inch Redis function func (r *RedisDB) Incr(ctx context.Context, k string) (any, error) { return r.client.Incr(ctx, k).Result() } -func (r *RedisDB) SetNX(ctx context.Context, k string, v any) (any, error) { +// SetNX is the implementation of SetNX Redis function +func (r *RedisDB) SetNX(ctx context.Context, k string, v any) (bool, error) { return r.client.SetNX(ctx, k, v, 0).Result() } From a7d8ca853a353ba0f42e7af4a02a0ad53711701e Mon Sep 17 00:00:00 2001 From: "Lucas D (inu)" Date: Mon, 24 Jul 2023 16:31:50 +0200 Subject: [PATCH 30/39] Fix lint issues --- cmd/shibesbot/main.go | 2 +- pkg/cache/localstorage_test.go | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index a778e9b..27a032c 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -93,7 +93,7 @@ func (sb *Shibesbot) setDailyKey() { return } - if isUnset == true { + if isUnset { count, err := sb.cache.Get(context.Background(), key) if err != nil { diff --git a/pkg/cache/localstorage_test.go b/pkg/cache/localstorage_test.go index 0b96600..c99f830 100644 --- a/pkg/cache/localstorage_test.go +++ b/pkg/cache/localstorage_test.go @@ -16,7 +16,10 @@ func TestLocalStorage(t *testing.T) { const value string = "test" cache = localstorage.NewLocalStorageCache() - cache.Set(context.Background(), key, value) + setValue, error := cache.Set(context.Background(), key, value) + assert.Nil(t, error) + assert.Equal(t, value, setValue) + awaitedValue, error := cache.Get(context.Background(), key) assert.Equal(t, nil, error) @@ -32,7 +35,10 @@ func TestLocalStorageIncr(t *testing.T) { cache = localstorage.NewLocalStorageCache() - cache.Set(context.Background(), key, value) + setValue, error := cache.Set(context.Background(), key, value) + assert.Nil(t, error) + assert.Equal(t, value, setValue) + awaitedValue, error := cache.Incr(context.Background(), key) convertedAwaitedValue, ok := awaitedValue.(int) From 4699b2038c5f26e88c17effa6d47ca26637807ad Mon Sep 17 00:00:00 2001 From: "Lucas D (inu)" Date: Tue, 25 Jul 2023 09:41:20 +0200 Subject: [PATCH 31/39] Add main unit tests --- cmd/shibesbot/main.go | 23 ++++------------------- cmd/shibesbot/main_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 cmd/shibesbot/main_test.go diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 27a032c..861e898 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -79,12 +79,10 @@ func initConfiguration() *Shibesbot { } } -func (sb *Shibesbot) setDailyKey() { - sb.log.Info("setting daily counter") +func (sb *Shibesbot) setDailyKey(t time.Time) { sb.mtx.Lock() defer sb.mtx.Unlock() - t := time.Now() key := fmt.Sprintf("usage:%d%d%d", t.Day(), t.Month(), t.Year()) isUnset, err := sb.cache.SetNX(context.Background(), key, 0) @@ -94,20 +92,6 @@ func (sb *Shibesbot) setDailyKey() { } if isUnset { - count, err := sb.cache.Get(context.Background(), key) - - if err != nil { - sb.log.Warn("could not update and retrieve usage count: ", err.Error()) - return - } - - countInt, ok := count.(int64) - if !ok { - sb.log.Warn("could not set daily counter") - return - } - - sb.setDailyCounter(countInt) sb.dailyKey = key return @@ -139,8 +123,9 @@ func main() { }() _, err := c.AddFunc("0 0 * * *", func() { - sb.log.Info("running daily counter update job") - sb.setDailyKey() + sb.log.Info("updating usage count status") + sb.setDailyKey(time.Now()) + sb.setDailyCounter(0) }) if err != nil { diff --git a/cmd/shibesbot/main_test.go b/cmd/shibesbot/main_test.go new file mode 100644 index 0000000..479d23a --- /dev/null +++ b/cmd/shibesbot/main_test.go @@ -0,0 +1,25 @@ +package main + +import ( + "testing" + "time" + + "github.com/P147x/shibesbot/pkg/cache/localstorage" + "github.com/P147x/shibesbot/pkg/logger/logrus" + "github.com/stretchr/testify/assert" +) + +func TestResetDailyCounterKey(t *testing.T) { + bot := &Shibesbot{ + cache: localstorage.NewLocalStorageCache(), + log: logrus.NewLogrusLogger(), + } + + date := time.Unix(1690212965, 0) + bot.setDailyKey(date) + assert.Equal(t, "usage:2472023", bot.dailyKey) + + date = time.Unix(1690236000, 0) + bot.setDailyKey(date) + assert.Equal(t, "usage:2572023", bot.dailyKey) +} From adff7af334498bcfc96f7f27d8b168d0360dbf09 Mon Sep 17 00:00:00 2001 From: "Lucas D (inu)" Date: Thu, 1 Feb 2024 22:55:35 +0100 Subject: [PATCH 32/39] add base monitoring with prometheus --- cmd/shibesbot/main.go | 8 +++++- cmd/shibesbot/main_test.go | 37 ++++++++++---------------- cmd/shibesbot/monitoring/monitoring.go | 37 ++++++++++++++++++++++++++ go.mod | 9 ++++++- go.sum | 20 ++++++++++++++ 5 files changed, 86 insertions(+), 25 deletions(-) create mode 100644 cmd/shibesbot/monitoring/monitoring.go diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 861e898..3a8c3f6 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -11,6 +11,7 @@ import ( "syscall" "time" + "github.com/P147x/shibesbot/cmd/shibesbot/monitoring" "github.com/P147x/shibesbot/pkg/cache" "github.com/P147x/shibesbot/pkg/cache/redis" "github.com/P147x/shibesbot/pkg/logger" @@ -103,6 +104,7 @@ func main() { sb.initRequests() sb.log.Info("starting Shibesbot") c := cron.New() + monitor := monitoring.NewHTTPMonitorServer(sb.log) if len(sb.apiConfigurations.discordToken) <= 0 { sb.log.Error("environnement variable SHIBESBOT_TOKEN is not provided") @@ -134,7 +136,11 @@ func main() { } c.Start() - defer c.Stop() + go monitor.Run() + defer func() { + monitor.Stop() + c.Stop() + }() sb.log.Info("shibesbot OK, ready to nicely bork on people") diff --git a/cmd/shibesbot/main_test.go b/cmd/shibesbot/main_test.go index 479d23a..48a9603 100644 --- a/cmd/shibesbot/main_test.go +++ b/cmd/shibesbot/main_test.go @@ -1,25 +1,16 @@ package main -import ( - "testing" - "time" - - "github.com/P147x/shibesbot/pkg/cache/localstorage" - "github.com/P147x/shibesbot/pkg/logger/logrus" - "github.com/stretchr/testify/assert" -) - -func TestResetDailyCounterKey(t *testing.T) { - bot := &Shibesbot{ - cache: localstorage.NewLocalStorageCache(), - log: logrus.NewLogrusLogger(), - } - - date := time.Unix(1690212965, 0) - bot.setDailyKey(date) - assert.Equal(t, "usage:2472023", bot.dailyKey) - - date = time.Unix(1690236000, 0) - bot.setDailyKey(date) - assert.Equal(t, "usage:2572023", bot.dailyKey) -} +// func TestResetDailyCounterKey(t *testing.T) { +// bot := &Shibesbot{ +// cache: localstorage.NewLocalStorageCache(), +// log: logrus.NewLogrusLogger(), +// } +// +// date := time.Unix(1690212965, 0) +// bot.setDailyKey(date) +// assert.Equal(t, "usage:2472023", bot.dailyKey) +// +// date = time.Unix(1690236000, 0) +// bot.setDailyKey(date) +// assert.Equal(t, "usage:2572023", bot.dailyKey) +// } diff --git a/cmd/shibesbot/monitoring/monitoring.go b/cmd/shibesbot/monitoring/monitoring.go new file mode 100644 index 0000000..3a9f5c2 --- /dev/null +++ b/cmd/shibesbot/monitoring/monitoring.go @@ -0,0 +1,37 @@ +package monitoring + +import ( + "context" + "net/http" + + "github.com/P147x/shibesbot/pkg/logger" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +type HttpMonitor struct { + log logger.Logger + srv *http.Server +} + +func NewHTTPMonitorServer(l logger.Logger) *HttpMonitor { + http.Handle("/metrics", promhttp.Handler()) + return &HttpMonitor{ + log: l, + srv: &http.Server{Addr: ":8080"}, + } +} + +func (hm *HttpMonitor) Run() { + err := hm.srv.ListenAndServe() + if err != http.ErrServerClosed { + hm.log.Error(err.Error()) + } +} + +func (hm *HttpMonitor) Stop() { + if hm.srv != nil { + if err := hm.srv.Shutdown(context.Background()); err != nil { + hm.log.Error(err.Error()) + } + } +} diff --git a/go.mod b/go.mod index 3383bd2..6d2a22f 100644 --- a/go.mod +++ b/go.mod @@ -10,15 +10,22 @@ require ( ) require ( + github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/robfig/cron/v3 v3.0.0 // indirect github.com/stretchr/testify v1.8.4 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -26,5 +33,5 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect go.uber.org/zap v1.24.0 golang.org/x/crypto v0.10.0 // indirect - golang.org/x/sys v0.9.0 // indirect + golang.org/x/sys v0.15.0 // indirect ) diff --git a/go.sum b/go.sum index 0f0acad..c58b319 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= @@ -10,15 +12,27 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4 h1:Rq1bBuOq3A4P/41LjhqHV9nqWAfFTiaPe83WdkI+MYc= github.com/ivolo/go-giphy v0.0.0-20150927080050-d31b832022e4/go.mod h1:9KUT8qK3+k9SRKuDCiqe3BS2GZ74e5HtIVSGNorAbHk= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o= github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= @@ -45,9 +59,15 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 8f5a788159d3194ffbaf27f3570030881d08146c Mon Sep 17 00:00:00 2001 From: "Lucas D (inu)" Date: Sun, 11 Feb 2024 16:44:42 +0100 Subject: [PATCH 33/39] update go version to 1.21 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index f8db200..47bfe13 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM golang:1.19 AS build +FROM golang:1.21 AS build WORKDIR $GOPATH/src/github.com/codeinuit/shibesbot COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o app ./cmd/shibesbot -FROM alpine:latest +FROM alpine:3.19 WORKDIR /root/ COPY --from=build /go/src/github.com/codeinuit/shibesbot/app . ENTRYPOINT ["./app"] From cdd6bf036d630d8c53dad1ba0d891aa08ad990c8 Mon Sep 17 00:00:00 2001 From: "inu (Lucas DEBOUTE)" Date: Sun, 3 Mar 2024 07:56:20 -0800 Subject: [PATCH 34/39] update golang from 1.19 to 1.21 + rename package --- cmd/shibesbot/main.go | 11 ++++++----- cmd/shibesbot/monitoring/monitoring.go | 2 +- go.mod | 4 ++-- pkg/cache/localstorage_test.go | 4 ++-- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index 3a8c3f6..d7ea74a 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -11,11 +11,12 @@ import ( "syscall" "time" - "github.com/P147x/shibesbot/cmd/shibesbot/monitoring" - "github.com/P147x/shibesbot/pkg/cache" - "github.com/P147x/shibesbot/pkg/cache/redis" - "github.com/P147x/shibesbot/pkg/logger" - "github.com/P147x/shibesbot/pkg/logger/logrus" + "github.com/codeinuit/shibesbot/cmd/shibesbot/monitoring" + "github.com/codeinuit/shibesbot/pkg/cache" + "github.com/codeinuit/shibesbot/pkg/cache/redis" + "github.com/codeinuit/shibesbot/pkg/logger" + "github.com/codeinuit/shibesbot/pkg/logger/logrus" + "github.com/bwmarrin/discordgo" "github.com/robfig/cron/v3" ) diff --git a/cmd/shibesbot/monitoring/monitoring.go b/cmd/shibesbot/monitoring/monitoring.go index 3a9f5c2..9f33f82 100644 --- a/cmd/shibesbot/monitoring/monitoring.go +++ b/cmd/shibesbot/monitoring/monitoring.go @@ -4,7 +4,7 @@ import ( "context" "net/http" - "github.com/P147x/shibesbot/pkg/logger" + "github.com/codeinuit/shibesbot/pkg/logger" "github.com/prometheus/client_golang/prometheus/promhttp" ) diff --git a/go.mod b/go.mod index 6d2a22f..b779d8f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ -module github.com/P147x/shibesbot +module github.com/codeinuit/shibesbot -go 1.19 +go 1.21 require ( github.com/bwmarrin/discordgo v0.27.1 diff --git a/pkg/cache/localstorage_test.go b/pkg/cache/localstorage_test.go index c99f830..614d87c 100644 --- a/pkg/cache/localstorage_test.go +++ b/pkg/cache/localstorage_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - "github.com/P147x/shibesbot/pkg/cache" - "github.com/P147x/shibesbot/pkg/cache/localstorage" + "github.com/codeinuit/shibesbot/pkg/cache" + "github.com/codeinuit/shibesbot/pkg/cache/localstorage" "github.com/stretchr/testify/assert" ) From 4823244207f309163fef06207c44edfdbe6cdd8a Mon Sep 17 00:00:00 2001 From: "inu (Lucas DEBOUTE)" Date: Wed, 6 Mar 2024 13:05:55 -0800 Subject: [PATCH 35/39] feat(logger) support formatting --- pkg/logger/logger.go | 3 +++ pkg/logger/logrus/logrus.go | 12 ++++++++++++ pkg/logger/zap/zap.go | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index a8c3e8f..641a990 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -3,6 +3,9 @@ package logger // Logger interface implementation type Logger interface { Info(...any) + Infof(string, ...any) Warn(...any) + Warnf(string, ...any) Error(...any) + Errorf(string, ...any) } diff --git a/pkg/logger/logrus/logrus.go b/pkg/logger/logrus/logrus.go index ffd003f..51ed2f5 100644 --- a/pkg/logger/logrus/logrus.go +++ b/pkg/logger/logrus/logrus.go @@ -17,10 +17,22 @@ func (l LogrusLogger) Info(v ...any) { l.logger.Info(v...) } +func (l LogrusLogger) Infof(format string, v ...any) { + l.logger.Infof(format, v...) +} + func (l LogrusLogger) Error(v ...any) { l.logger.Error(v...) } +func (l LogrusLogger) Errorf(format string, v ...any) { + l.logger.Errorf(format, v...) +} + func (l LogrusLogger) Warn(v ...any) { l.logger.Warn(v...) } + +func (l LogrusLogger) Warnf(format string, v ...any) { + l.logger.Warnf(format, v...) +} diff --git a/pkg/logger/zap/zap.go b/pkg/logger/zap/zap.go index 28bf7bb..812af9b 100644 --- a/pkg/logger/zap/zap.go +++ b/pkg/logger/zap/zap.go @@ -17,10 +17,22 @@ func (z ZapSugarLogger) Info(v ...any) { z.logger.Info(v) } +func (z ZapSugarLogger) Infof(format string, v ...any) { + z.logger.Infof(format, v...) +} + func (z ZapSugarLogger) Warn(v ...any) { - z.logger.Info(v) + z.logger.Warn(v) +} + +func (z ZapSugarLogger) Warnf(format string, v ...any) { + z.logger.Warnf(format, v...) } func (z ZapSugarLogger) Error(v ...any) { - z.logger.Info(v) + z.logger.Error(v) +} + +func (z ZapSugarLogger) Errorf(format string, v ...any) { + z.logger.Errorf(format, v...) } From 564801b2761ba4dd1989e96898a4a4f85df03b50 Mon Sep 17 00:00:00 2001 From: "inu (Lucas DEBOUTE)" Date: Wed, 6 Mar 2024 13:49:29 -0800 Subject: [PATCH 36/39] chore(main) remove unused calls + use local cache by default --- cmd/shibesbot/dogequests.go | 75 -------------------------- cmd/shibesbot/main.go | 72 ++++++++++++++----------- cmd/shibesbot/monitoring/monitoring.go | 5 ++ 3 files changed, 47 insertions(+), 105 deletions(-) diff --git a/cmd/shibesbot/dogequests.go b/cmd/shibesbot/dogequests.go index 1e91781..e85299b 100644 --- a/cmd/shibesbot/dogequests.go +++ b/cmd/shibesbot/dogequests.go @@ -1,7 +1,6 @@ package main import ( - "errors" "math/rand" "net/http" @@ -53,80 +52,6 @@ type ShibesData struct { Wallpapers ShibesWallpapers } -func initWallpapers(t string) (wp ShibesWallpapers, err error) { - wpEmpty := ShibesWallpapers{ - Cursor: 0, - Total: 0, - Shibes: make([]WallpaperData, 0), - } - - if len(t) <= 0 { - return wpEmpty, errors.New("no alphacoders token provided, skipping") - } - req, err := http.NewRequest("GET", "https://wall.alphacoders.com/api2.0/get.php", nil) - if err != nil { - return wpEmpty, err - } - - q := req.URL.Query() - q.Add("auth", t) - q.Add("method", "search") - q.Add("term", "Shiba") - req.URL.RawQuery = q.Encode() - resp, err := http.Get(req.URL.String()) - if err != nil { - return wpEmpty, err - } - defer resp.Body.Close() - var res AlphacodersData - err = json.NewDecoder(resp.Body).Decode(&res) - if err != nil { - return wpEmpty, err - } - - wp.Shibes = make([]WallpaperData, len(res.Wallpapers)) - wp.Shibes = res.Wallpapers - wp.Total = len(res.Wallpapers) - - return wp, nil -} - -func initGifs(t string) (ShibesGifs, error) { - var gifs ShibesGifs - - if len(t) <= 0 { - return ShibesGifs{ - Cursor: 0, - Shibes: make([]giphy.Gif, 0), - Total: 0, - }, errors.New("no giphy token provided, skipping") - } - - gp := giphy.New(t) - gifs.Shibes, _ = gp.Search("shiba") - gifs.Total = len(gifs.Shibes) - gifs.Cursor = 0 - - return gifs, nil -} - -func (sb *Shibesbot) initRequests() { - var err error - - Shibes.Wallpapers, err = initWallpapers(sb.apiConfigurations.alphacodersToken) - sb.log.Info("retrieved ", Shibes.Wallpapers.Total, " wallpapers") - if err != nil { - sb.log.Warn("could not retrieve wallpapers: ", err.Error()) - } - - Shibes.Gifs, err = initGifs(sb.apiConfigurations.giphyToken) - sb.log.Info("retrieved ", Shibes.Gifs.Total, " gifs") - if err != nil { - sb.log.Warn("could not retrieve gifs: ", err.Error()) - } - -} - func (sb *Shibesbot) getShibes() string { if Shibes.Images.Cursor >= Shibes.Images.Total { Shibes.Images.Cursor = 0 diff --git a/cmd/shibesbot/main.go b/cmd/shibesbot/main.go index d7ea74a..04963ed 100644 --- a/cmd/shibesbot/main.go +++ b/cmd/shibesbot/main.go @@ -3,16 +3,17 @@ package main import ( "context" "fmt" - "log" "os" "os/signal" "strconv" + "strings" "sync" "syscall" "time" "github.com/codeinuit/shibesbot/cmd/shibesbot/monitoring" "github.com/codeinuit/shibesbot/pkg/cache" + "github.com/codeinuit/shibesbot/pkg/cache/localstorage" "github.com/codeinuit/shibesbot/pkg/cache/redis" "github.com/codeinuit/shibesbot/pkg/logger" "github.com/codeinuit/shibesbot/pkg/logger/logrus" @@ -23,10 +24,12 @@ import ( // ENV variables const ( + // Token configuration DISCORD_TOKEN = "SHIBESBOT_TOKEN" - ALPHACODERS_TOKEN = "ALPHACODERS_TOKEN" SHIBESONLINE_TOKEN = "SHIBESONLINE_TOKEN" - GIPHY_TOKEN = "GIPHY_TOKEN" + + // Flags + ENV_CACHE = "CACHE" // Redis configuration REDIS_ADDR = "REDIS_ADDR" @@ -37,9 +40,7 @@ const ( type ApiConfigurations struct { discordToken string - alphacodersToken string shibesolineToken string - giphyToken string } type Shibesbot struct { @@ -53,32 +54,39 @@ type Shibesbot struct { cache cache.Cache } -func initConfiguration() *Shibesbot { - port, err := strconv.Atoi(os.Getenv(REDIS_PORT)) - if err != nil { - port = 6379 - } +func NewShibesbot() (*Shibesbot, error) { + var cache cache.Cache = localstorage.NewLocalStorageCache() + var log logger.Logger = logrus.NewLogrusLogger() + var err error - r, err := redis.NewRedisCache(redis.RedisOptions{ - Address: os.Getenv(REDIS_ADDR), - Port: int32(port), - Password: os.Getenv(REDIS_PASS), - }) + // check if Redis is enabled; otherwise fallback to local storage + if c := os.Getenv(ENV_CACHE); strings.ToUpper(c) == "REDIS" { + var port int - if err != nil { - log.Fatal(err.Error()) + log.Info("Redis enabled") + + address := os.Getenv(REDIS_ADDR) + if port, err = strconv.Atoi(os.Getenv(REDIS_PORT)); err != nil { + log.Warnf("environnement variable %s is undefined; using default value", REDIS_PORT) + port = 6379 + } + log.Infof("using Redis on %s with port %d", address, port) + + cache, err = redis.NewRedisCache(redis.RedisOptions{ + Address: address, + Port: int32(port), + Password: os.Getenv(REDIS_PASS), + }) } return &Shibesbot{ - cache: r, - log: logrus.NewLogrusLogger(), + cache: cache, + log: log, apiConfigurations: ApiConfigurations{ discordToken: os.Getenv(DISCORD_TOKEN), - alphacodersToken: os.Getenv(ALPHACODERS_TOKEN), shibesolineToken: os.Getenv(SHIBESONLINE_TOKEN), - giphyToken: os.Getenv(GIPHY_TOKEN), }, - } + }, err } func (sb *Shibesbot) setDailyKey(t time.Time) { @@ -101,31 +109,35 @@ func (sb *Shibesbot) setDailyKey(t time.Time) { } func main() { - sb := initConfiguration() - sb.initRequests() - sb.log.Info("starting Shibesbot") + sb, err := NewShibesbot() + if err != nil { + fmt.Printf("could not initialize bot : %s", err.Error()) + os.Exit(1) + } + + sb.log.Info("starting bot") c := cron.New() monitor := monitoring.NewHTTPMonitorServer(sb.log) if len(sb.apiConfigurations.discordToken) <= 0 { - sb.log.Error("environnement variable SHIBESBOT_TOKEN is not provided") + sb.log.Errorf("environnement variable %s is not provided", SHIBESONLINE_TOKEN) return } if err := sb.initDiscord(); err != nil { sb.log.Error("connexion error: ", err.Error()) - return + os.Exit(1) } defer func() { if err := sb.session.Close(); err != nil { sb.log.Error("discord session could not close properly:", err.Error()) - return + os.Exit(1) } sb.log.Info("discord session closed successfully") }() - _, err := c.AddFunc("0 0 * * *", func() { + _, err = c.AddFunc("0 0 * * *", func() { sb.log.Info("updating usage count status") sb.setDailyKey(time.Now()) sb.setDailyCounter(0) @@ -133,7 +145,7 @@ func main() { if err != nil { sb.log.Error("could not create cronjob: ", err.Error()) - return + os.Exit(1) } c.Start() diff --git a/cmd/shibesbot/monitoring/monitoring.go b/cmd/shibesbot/monitoring/monitoring.go index 9f33f82..8c3f40b 100644 --- a/cmd/shibesbot/monitoring/monitoring.go +++ b/cmd/shibesbot/monitoring/monitoring.go @@ -8,6 +8,11 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" ) +type Monitoring interface { + Run() + Stop() +} + type HttpMonitor struct { log logger.Logger srv *http.Server From 8386128fbef95a47e6fd5063fe69c9188456c27d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Sun, 12 May 2024 12:13:27 +0200 Subject: [PATCH 37/39] (clean) remove deprecated commands --- cmd/shibesbot/discord.go | 18 ++----------- cmd/shibesbot/dogequests.go | 50 ++----------------------------------- 2 files changed, 4 insertions(+), 64 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 17223de..0c41cb4 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -24,13 +24,6 @@ var ( }, }, }, - { - Name: "swalls", - Description: "Returns a wallpaper with a Shiba ina !", - }, - { - Name: "sgifs", - Description: "Returns a gif with a Shiba ina !"}, { Name: "shelp", Description: "Returns helper", @@ -92,8 +85,6 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio switch i.ApplicationCommandData().Name { case "shibes": response = sb.getShibes() - case "sgifs": - response = getShibesGifs() case "shelp": err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, @@ -104,19 +95,14 @@ func (sb *Shibesbot) commandPicker(s *discordgo.Session, i *discordgo.Interactio if err != nil { sb.log.Error("could not answer to user help command: ", err.Error()) } - return - case "swalls": - response = getShibesWallpaper() } - err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + if err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Content: response, }, - }) - - if err != nil { + }); err != nil { sb.log.Error("could not answer to user help command: ", err.Error()) return } diff --git a/cmd/shibesbot/dogequests.go b/cmd/shibesbot/dogequests.go index e85299b..e20f0ba 100644 --- a/cmd/shibesbot/dogequests.go +++ b/cmd/shibesbot/dogequests.go @@ -1,11 +1,8 @@ package main import ( - "math/rand" "net/http" - "github.com/ivolo/go-giphy" - "encoding/json" "github.com/bwmarrin/discordgo" @@ -15,41 +12,14 @@ var ( Shibes ShibesData ) -type WallpaperData struct { - Id int - Width int - Height int - Url_Image string -} - -type AlphacodersData struct { - Success bool - Wallpapers []WallpaperData - Total_Match int -} - type ShibesPictures struct { Shibes []string Total int Cursor int } -type ShibesGifs struct { - Shibes []giphy.Gif - Total int - Cursor int -} - -type ShibesWallpapers struct { - Shibes []WallpaperData - Total int - Cursor int -} - type ShibesData struct { - Images ShibesPictures - Gifs ShibesGifs - Wallpapers ShibesWallpapers + Images ShibesPictures } func (sb *Shibesbot) getShibes() string { @@ -85,9 +55,7 @@ func getHelp() *discordgo.MessageEmbed { { Name: "Available commands", Value: "- *shibes* to get a random shibe !\n" + - "- *sgifs* to get a random gif of shiba !\n" + - "- *shelp* to get help\n" + - "- *swalls* to get an amazing shibe wallpaper", + "- *shelp* to get help", Inline: false, }, }, @@ -95,17 +63,3 @@ func getHelp() *discordgo.MessageEmbed { } return test } - -func getShibesGifs() string { - if Shibes.Gifs.Total <= 0 { - return "no gifs available, sorry. :(" - } - return Shibes.Gifs.Shibes[rand.Int()%Shibes.Gifs.Total].URL -} - -func getShibesWallpaper() string { - if Shibes.Wallpapers.Total <= 0 { - return "no wallpapers available, sorry. :(" - } - return string(Shibes.Wallpapers.Shibes[rand.Int()%Shibes.Wallpapers.Total].Url_Image) -} From 1c9e86feda2080398ebc3707cf2fede8613d4770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Sun, 12 May 2024 12:35:36 +0200 Subject: [PATCH 38/39] (feat) add debug wrap for logger --- pkg/logger/logger.go | 2 ++ pkg/logger/logrus/logrus.go | 8 ++++++++ pkg/logger/zap/zap.go | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 641a990..530c2cd 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -2,6 +2,8 @@ package logger // Logger interface implementation type Logger interface { + Debug(...any) + Debugf(string, ...any) Info(...any) Infof(string, ...any) Warn(...any) diff --git a/pkg/logger/logrus/logrus.go b/pkg/logger/logrus/logrus.go index 51ed2f5..3f24290 100644 --- a/pkg/logger/logrus/logrus.go +++ b/pkg/logger/logrus/logrus.go @@ -13,6 +13,14 @@ func NewLogrusLogger() *LogrusLogger { } } +func (l LogrusLogger) Debug(v ...any) { + l.logger.Debug(v...) +} + +func (l LogrusLogger) Debugf(format string, v ...any) { + l.logger.Debugf(format, v...) +} + func (l LogrusLogger) Info(v ...any) { l.logger.Info(v...) } diff --git a/pkg/logger/zap/zap.go b/pkg/logger/zap/zap.go index 812af9b..ff72dee 100644 --- a/pkg/logger/zap/zap.go +++ b/pkg/logger/zap/zap.go @@ -13,6 +13,14 @@ func NewSugarLogger() ZapSugarLogger { } } +func (z ZapSugarLogger) Debug(v ...any) { + z.logger.Debug(v) +} + +func (z ZapSugarLogger) Debugf(format string, v ...any) { + z.logger.Debugf(format, v...) +} + func (z ZapSugarLogger) Info(v ...any) { z.logger.Info(v) } From b53907ca31e7d669dee38bd45e226f8d117141b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Debout=C3=A9?= Date: Sun, 12 May 2024 12:40:04 +0200 Subject: [PATCH 39/39] add debug logging --- cmd/shibesbot/discord.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/shibesbot/discord.go b/cmd/shibesbot/discord.go index 0c41cb4..b7a3fc2 100644 --- a/cmd/shibesbot/discord.go +++ b/cmd/shibesbot/discord.go @@ -69,9 +69,10 @@ func (sb *Shibesbot) initDiscord() error { return err } + sb.log.Debug("updating Discord command list") for _, cmd := range commands { - _, err := sb.session.ApplicationCommandCreate(sb.session.State.User.ID, "", cmd) - if err != nil { + sb.log.Debugf("adding command %s", cmd.Name) + if _, err := sb.session.ApplicationCommandCreate(sb.session.State.User.ID, "", cmd); err != nil { return err } }