From 3efd003424bc04f9089d772c4cbd8ae8fcba1fe0 Mon Sep 17 00:00:00 2001 From: daru Date: Sun, 17 Jul 2022 19:42:49 +0200 Subject: [PATCH] Erster Discord Versuch --- go.mod | 3 +++ go.sum | 12 ++++++++---- huso.go | 25 +++++++++++++++++++------ labersack.go | 27 +++++++++++++++++++++++++++ nuss.go | 6 ++++-- ober.go | 26 +++++++++++++++++++++++++- zecke.go | 9 +++++++++ 7 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 labersack.go diff --git a/go.mod b/go.mod index 0ea0d6a..c0d6e14 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.18 require ( github.com/allegro/bigcache/v3 v3.0.2 + github.com/bwmarrin/discordgo v0.25.0 github.com/fasthttp/router v1.4.10 github.com/go-sql-driver/mysql v1.6.0 github.com/gookit/color v1.5.1 @@ -16,6 +17,7 @@ require ( require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/bwmarrin/snowflake v0.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect github.com/klauspost/compress v1.15.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect @@ -23,5 +25,6 @@ require ( github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/xujiajun/mmap-go v1.0.1 // indirect github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b // indirect + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect ) diff --git a/go.sum b/go.sum index a728e29..9e136bc 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/bwmarrin/discordgo v0.25.0 h1:NXhdfHRNxtwso6FPdzW2i3uBvvU7UIQTghmV2T4nqAs= +github.com/bwmarrin/discordgo v0.25.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -17,11 +19,12 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ= github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= +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/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.7 h1:7cgTQxJCU/vy+oP/E3B9RGbQTgbiVzIJWIKOLoAsPok= -github.com/klauspost/compress v1.15.7/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.8 h1:JahtItbkWjf2jzm/T+qgMxkP9EMHsqEUA6vCMGmXvhA= github.com/klauspost/compress v1.15.8/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -52,8 +55,11 @@ github.com/xujiajun/nutsdb v0.9.0 h1:vy8rjDp0Sk/SnTAqg61i+G4NIN/3tBKSdZ6rIyKYVIo github.com/xujiajun/nutsdb v0.9.0/go.mod h1:8ZdTTF0cEQO+wN940htfHYKswFql2iB6Osckx+GmOoU= github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b h1:jKG9OiL4T4xQN3IUrhUpc1tG+HfDXppkgVcrAiiaI/0= github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b/go.mod h1:AZd87GYJlUzl82Yab2kTjx1EyXSQCAfZDhpTo1SQC4k= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -67,8 +73,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e h1:CsOuNlbOuf0mzxJIefr6Q4uAUetRUwZE4qt7VfzP+xo= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/huso.go b/huso.go index bce5704..7a2404f 100644 --- a/huso.go +++ b/huso.go @@ -12,6 +12,7 @@ import ( "time" "github.com/allegro/bigcache/v3" + "github.com/bwmarrin/discordgo" _ "github.com/go-sql-driver/mysql" "github.com/gookit/color" "github.com/xujiajun/nutsdb" @@ -48,6 +49,7 @@ var ( localServer = flag.Bool("localServer", false, "Set varius headers for running locally") mmDbServer = flag.String("mmDbServer", "hanami.family:3306", "MovieManager db server") mmDbUser = flag.String("mmDbUser", "yui", "MovieManager db user") + discordToken = flag.String("discordToken", "OTk4MTk3MTMzNjE2MzUzMzUw.GKPdLt.zaMvvlikffjBxJO-Qx69A5nQNQxtA-FmkH2yTA", "Discord bot auth token") animeCache *bigcache.BigCache seasoncache *bigcache.BigCache userCache *bigcache.BigCache @@ -56,6 +58,7 @@ var ( mmCache *bigcache.BigCache db *nutsdb.DB mmDb *sql.DB + discc *discordgo.Session jikanLimiter *rate.Limiter logOut *RingBuf buildTime string @@ -124,12 +127,8 @@ func main() { color.Errorln(err.Error()) } else { mmDb, err = sql.Open("mysql", conns) - if err != nil || mmDb == nil { - if err != nil { - color.Errorln(err.Error()) - } else { - color.Errorln("No MovieManager DB connection") - } + if err != nil { + color.Errorln(err.Error()) } else { mmDb.SetConnMaxLifetime(time.Minute * 3) mmDb.SetMaxOpenConns(10) @@ -146,6 +145,20 @@ func main() { } } + discc, err = discordgo.New("Bot " + *discordToken) + if err != nil { + color.Errorln(err.Error()) + } else { + err = discc.Open() + if err != nil { + color.Errorln(err.Error()) + } else { + defer discc.Close() + color.Infoln("Discord huso online") + logOut.WriteLine("📯 Discord huso online") + } + } + Arbeit() LangeArbeit() diff --git a/labersack.go b/labersack.go new file mode 100644 index 0000000..8deb43b --- /dev/null +++ b/labersack.go @@ -0,0 +1,27 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/gookit/color" +) + +func SendAppointBroadcast(creator string, app *Appointment) { + if app != nil && discc != nil { + var msgStart strings.Builder + for _, u := range app.Users { + uData, err := ReadUser(u) + if err != nil || uData.DiscordID == 0 { + continue + } + msgStart.WriteString(fmt.Sprintf("<@%d> ", uData.DiscordID)) + } + + msg := fmt.Sprintf("📺 %s%s created appointment for %d at ", msgStart.String(), creator, app.Anime, app.Time.Unix()) + _, err := discc.ChannelMessageSend("998277590609559632", msg) + if err != nil { + color.Errorln(err.Error()) + } + } +} diff --git a/nuss.go b/nuss.go index 1116a29..a84714f 100644 --- a/nuss.go +++ b/nuss.go @@ -79,14 +79,16 @@ func AddUserToAnime(username string, userId, animeId int64, progress int, update return &anime, err } -func AddUserToAppointment(username string, animeId int64, meeting time.Time) (*Appointment, error) { +func AddUserToAppointment(username string, animeId int64, meeting time.Time) (*Appointment, bool, error) { var appoint Appointment + fresh := false err := db.Update( func(tx *nutsdb.Tx) error { keyBytes := Int64AndDateToBytes(animeId, meeting) e, err := tx.Get(bucketAppoint, keyBytes) var users []string if err != nil { + fresh = true users = make([]string, 0) } else { // parse user list @@ -121,7 +123,7 @@ func AddUserToAppointment(username string, animeId int64, meeting time.Time) (*A } return tx.Put(bucketAppoint, keyBytes, newData, nutsdb.Persistent) }) - return &appoint, err + return &appoint, fresh, err } func DeleteUserFromAnime(username string, userId, animeId int64) (*AnimeUser, error) { diff --git a/ober.go b/ober.go index 1746ee8..9ea9f6c 100644 --- a/ober.go +++ b/ober.go @@ -435,6 +435,15 @@ func Register(ctx *fasthttp.RequestCtx) { ctx.SetStatusCode(fasthttp.StatusExpectationFailed) return } + // check user discord id + if register.DiscordID != 0 && discc != nil { + _, err = discc.User(fmt.Sprint(register.DiscordID != 0)) + if err != nil { + ctx.WriteString("Discord user id is kaputt") + ctx.SetStatusCode(fasthttp.StatusExpectationFailed) + return + } + } // REGISTER user := UserData{ Username: register.Username, @@ -499,6 +508,16 @@ func RegisterUpdate(ctx *fasthttp.RequestCtx) { if regUpdate.Secret != "" { user.Secret = regUpdate.Secret } + + // check user discord id + if regUpdate.DiscordID != 0 && discc != nil { + _, err = discc.User(fmt.Sprint(regUpdate.DiscordID)) + if err != nil { + ctx.WriteString("Discord user id is kaputt") + ctx.SetStatusCode(fasthttp.StatusExpectationFailed) + return + } + } user.DiscordID = regUpdate.DiscordID err = SaveUser(user) @@ -795,6 +814,7 @@ func processUpdateAppointmentReq(ctx *fasthttp.RequestCtx, update bool) { for i, appointment := range appoints { var appData *Appointment var found bool + fresh := false if update { // kann sich (noch) nicht in der Vergagenheit verabreden @@ -816,7 +836,7 @@ func processUpdateAppointmentReq(ctx *fasthttp.RequestCtx, update bool) { } // save appointment and get list - appData, err = AddUserToAppointment(username, appointment.Anime, appointment.Time) + appData, fresh, err = AddUserToAppointment(username, appointment.Anime, appointment.Time) } else { found, err = CheckAnimeExistInDb(appointment.Anime) if err != nil { @@ -836,6 +856,10 @@ func processUpdateAppointmentReq(ctx *fasthttp.RequestCtx, update bool) { return } appoints[i].Users = appData.Users + + if update && fresh { + SendAppointBroadcast(username, appData) + } } data, err := json.Marshal(appoints) diff --git a/zecke.go b/zecke.go index 7f8af20..d7792a7 100644 --- a/zecke.go +++ b/zecke.go @@ -5,6 +5,7 @@ import ( _ "embed" "encoding/base64" "encoding/json" + "errors" "fmt" ) @@ -30,6 +31,10 @@ func MmReadOracle() ([]MmOracle, error) { } } + if mmDb == nil { + return oracles, errors.New("no DB connection") + } + oracleQuery := `SELECT m.id, m.title, m.mal_id, COALESCE(SUM(pv.score), 0) AS avgScore FROM movie m JOIN vote pv ON (m.id = pv.movie_id) JOIN promise pp ON (pp.user_id = pv.user_id) @@ -87,6 +92,10 @@ func MmReadOracle() ([]MmOracle, error) { } func MmReadCharts() ([]MmOracle, error) { + if mmDb == nil { + return nil, errors.New("no DB connection") + } + chartsQuery := `SELECT m.id, m.title, m.mal_id FROM movie m JOIN evening_movie em ON em.movie_id = m.id JOIN evening e ON em.evening_id = e.id