From 01fc6a3a1ffe6bec6f29d6a1fe8d4e9efe33ba89 Mon Sep 17 00:00:00 2001 From: Kevin Kandlbinder Date: Thu, 24 Mar 2022 16:45:27 +0100 Subject: [PATCH] bot: Add linking command --- internal/bot/commandParser.go | 37 +++++++++++++++++++++++++++++++++++ internal/db/model/user.go | 16 +++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/internal/bot/commandParser.go b/internal/bot/commandParser.go index 84aa414..555fcc2 100644 --- a/internal/bot/commandParser.go +++ b/internal/bot/commandParser.go @@ -19,7 +19,9 @@ package bot import ( "context" + "github.com/Unkn0wnCat/matrix-veles/internal/db" "github.com/Unkn0wnCat/matrix-veles/internal/tracer" + "go.mongodb.org/mongo-driver/bson/primitive" "go.opentelemetry.io/otel/attribute" "log" "maunium.net/go/mautrix" @@ -61,11 +63,46 @@ func handleCommand(command string, sender id.UserID, id id.RoomID, client *mautr return } + if strings.HasPrefix(command, "link ") { + commandLink(sender, id, client, strings.TrimPrefix(command, "link ")) + return + } + // No match :( - display help commandHelp(sender, id, client) return } +func commandLink(userId id.UserID, id id.RoomID, client *mautrix.Client, linkId string) { + linkId = strings.Trim(linkId, " \n\r") + + linkIdP, err := primitive.ObjectIDFromHex(linkId) + if err != nil { + _, _ = client.SendNotice(id, "Invalid Link ID") + return + } + + user, err := db.GetUserByID(linkIdP) + if err != nil { + _, _ = client.SendNotice(id, "Invalid Link ID") + return + } + + err = user.ValidateMXID(userId.String()) + if err != nil { + _, _ = client.SendNotice(id, "No matching link request pending") + return + } + + err = db.SaveUser(user) + if err != nil { + _, _ = client.SendNotice(id, "Database error") + return + } + + _, _ = client.SendNotice(id, "Successfully linked") +} + func commandHelp(_ id.UserID, id id.RoomID, client *mautrix.Client) { // TODO: Improve help message diff --git a/internal/db/model/user.go b/internal/db/model/user.go index c0ca80d..a3dd4e4 100644 --- a/internal/db/model/user.go +++ b/internal/db/model/user.go @@ -2,8 +2,10 @@ package model import ( "encoding/base64" + "errors" "go.mongodb.org/mongo-driver/bson/primitive" "golang.org/x/crypto/bcrypt" + "strings" ) type DBUser struct { @@ -20,6 +22,20 @@ type DBUser struct { Password *string `bson:"-" json:"-"` // Password may never be sent out! } +func (usr *DBUser) ValidateMXID(mxid string) error { + for i, pendingMxid := range usr.PendingMatrixLinks { + if strings.EqualFold(*pendingMxid, mxid) { + usr.PendingMatrixLinks = append(usr.PendingMatrixLinks[:i], usr.PendingMatrixLinks[i+1:]...) + + usr.MatrixLinks = append(usr.MatrixLinks, &mxid) + + return nil + } + } + + return errors.New("not pending") +} + func (usr *DBUser) HashPassword() error { if usr.Password == nil { return nil