Erster Discord Versuch

This commit is contained in:
daru
2022-07-17 19:42:49 +02:00
parent fd0f8bc8e2
commit 3efd003424
7 changed files with 95 additions and 13 deletions

3
go.mod
View File

@@ -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
)

12
go.sum
View File

@@ -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=

25
huso.go
View File

@@ -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()

27
labersack.go Normal file
View File

@@ -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 <t:%d:F>", msgStart.String(), creator, app.Anime, app.Time.Unix())
_, err := discc.ChannelMessageSend("998277590609559632", msg)
if err != nil {
color.Errorln(err.Error())
}
}
}

View File

@@ -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) {

26
ober.go
View File

@@ -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)

View File

@@ -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