From 614cc4d9dabc0e058ee149fbc2fcff866ae62a41 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sat, 4 Jan 2025 18:35:44 +0200 Subject: Implemented joining functionality --- internal/server/api/api.go | 110 +++++++++++++++++++++++++++++++++++++++++ internal/server/api/helpers.go | 26 ++++++++++ internal/server/server.go | 2 + 3 files changed, 138 insertions(+) (limited to 'internal/server') diff --git a/internal/server/api/api.go b/internal/server/api/api.go index 9f29ad7..852e07e 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -411,3 +411,113 @@ func DeleteNetwork(ctx context.Context, sess *session.Session, request *packet.D Set: false, } } + +func SetNetworkUser(ctx context.Context, sess *session.Session, request packet.SetNetworkUser) packet.Payload { + queries := data.New(db) + + network, err := queries.GetNetworkById(ctx, request.Network) + if err != nil { + log.Println("database error 1:", err) + return &ErrInternalError + } + + member, err := queries.GetNetworkMemberById(ctx, data.GetNetworkMemberByIdParams{ + NetworkID: request.Network, + UserID: request.User, + }) + + wantsToJoin := request.Member != nil && *request.Member && request.User == sess.ID() + if err == sql.ErrNoRows && network.IsPublic && wantsToJoin { + _, err = queries.SetNetworkUser(ctx, data.SetNetworkUserParams{ + UserID: request.User, + NetworkID: request.Network, + IsMember: true, + IsAdmin: false, + IsMuted: false, + IsBanned: false, + BanReason: nil, + }) + if err != nil { + log.Println("database error 2:", err) + return &ErrInternalError + } + + payload, err := GetSingleNetworkInfo(ctx, queries, network) + if err != nil { + log.Println("database error 3:", err) + return &ErrInternalError + } + + return payload + } + + if err != nil { + log.Println("database error 4:", err) + return &ErrInternalError + } + + isSessAdmin, err := IsNetworkAdmin(ctx, queries, sess.ID(), request.Network) + if err != nil { + log.Println("database error 5:", err) + return &ErrInternalError + } + + isMember := member.IsMember + isAdmin := member.IsAdmin + isMuted := member.IsMuted + IsBanned := member.IsBanned + banReason := member.BanReason + + if request.Member != nil && !IsBanned { + isLeave := !*request.Member && request.User == sess.ID() + isKick := !*request.Member && isSessAdmin + if request.User != network.OwnerID && (isLeave || isKick) { + isMember = false + isAdmin = false // Important for security + } + isJoin := *request.Member && request.User == sess.ID() && network.IsPublic + if isJoin { + isMember = true + } + } else if request.Admin != nil { + if network.OwnerID == sess.ID() && request.User != sess.ID() { + isAdmin = *request.Admin + } + } else if request.Muted != nil { + notSelf := request.User != sess.ID() + notOwner := request.User != network.OwnerID + if isSessAdmin && notSelf && notOwner { + isMuted = *request.Muted + } + } else if request.Banned != nil { + notSelf := request.User != sess.ID() + notOwner := request.User != network.OwnerID + if isSessAdmin && notSelf && notOwner { + IsBanned = *request.Banned + banReason = request.BanReason + isAdmin = false // Important for security + } + } + + _, err = queries.SetNetworkUser(ctx, data.SetNetworkUserParams{ + UserID: request.User, + NetworkID: request.Network, + IsMember: isMember, + IsAdmin: isAdmin, + IsMuted: isMuted, + IsBanned: IsBanned, + BanReason: banReason, + }) + if err != nil { + log.Println("database error 6:", err) + return &ErrInternalError + } + + payload, err := GetSingleNetworkInfo(ctx, queries, network) + if err != nil { + log.Println("database error 7:", err) + return &ErrInternalError + } + + return payload +} diff --git a/internal/server/api/helpers.go b/internal/server/api/helpers.go index 52c8649..d5b2d8c 100644 --- a/internal/server/api/helpers.go +++ b/internal/server/api/helpers.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/kyren223/eko/internal/data" + "github.com/kyren223/eko/internal/packet" "github.com/kyren223/eko/pkg/snowflake" ) @@ -40,3 +41,28 @@ func IsNetworkAdmin(ctx context.Context, queries *data.Queries, userId, networkI isAdmin := userNetwork.IsAdmin && userNetwork.IsMember && !userNetwork.IsBanned return isAdmin, nil } + +func GetSingleNetworkInfo(ctx context.Context, queries *data.Queries, network data.Network) (packet.Payload, error) { + frequencies, err := queries.GetNetworkFrequencies(ctx, network.ID) + if err != nil { + return nil, err + } + + members, err := queries.GetNetworkMembers(ctx, network.ID) + if err != nil { + return nil, err + } + + fullNetwork := packet.FullNetwork{ + Network: network, + Frequencies: frequencies, + Members: members, + Position: -1, + } + + return &packet.NetworksInfo{ + Networks: []packet.FullNetwork{fullNetwork}, + RemoveNetworks: nil, + Set: false, + }, nil +} diff --git a/internal/server/server.go b/internal/server/server.go index 1d7397e..036dc24 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -319,6 +319,8 @@ func processRequest(ctx context.Context, sess *session.Session, request packet.P response = timeout(500*time.Millisecond, api.DeleteNetwork, ctx, sess, request) case *packet.SwapUserNetworks: response = timeout(5*time.Millisecond, api.SwapUserNetworks, ctx, sess, request) + case *packet.SetNetworkUser: + response = timeout(5*time.Millisecond, api.SetNetworkUser, ctx, sess, request) case *packet.CreateFrequency: response = timeout(5*time.Millisecond, api.CreateFrequency, ctx, sess, request) -- cgit v1.3.1