summaryrefslogtreecommitdiff
path: root/internal/server/api/helpers.go
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-06 16:17:59 +0200
committerKyren223 <Kyren223@proton.me>2025-01-06 16:17:59 +0200
commit547593d3159d8772392e81b40082928094b35b8c (patch)
treec8c7a93309c1938d6de8b1fc3ccb8042d2210821 /internal/server/api/helpers.go
parent6be63e6df626e390565e26439b65e81088375a84 (diff)
Fleshed out and fixed issues in both the server and client for how
networks and members work
Diffstat (limited to 'internal/server/api/helpers.go')
-rw-r--r--internal/server/api/helpers.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/internal/server/api/helpers.go b/internal/server/api/helpers.go
index f82bf6e..05dae0e 100644
--- a/internal/server/api/helpers.go
+++ b/internal/server/api/helpers.go
@@ -2,9 +2,13 @@ package api
import (
"context"
+ "log"
"strings"
+ "time"
"github.com/kyren223/eko/internal/data"
+ "github.com/kyren223/eko/internal/packet"
+ "github.com/kyren223/eko/internal/server/session"
"github.com/kyren223/eko/pkg/snowflake"
)
@@ -41,3 +45,45 @@ func IsNetworkAdmin(ctx context.Context, queries *data.Queries, userId, networkI
return isAdmin, nil
}
+func NetworkPropagate(
+ ctx context.Context, sess *session.Session,
+ network snowflake.ID, payload packet.Payload,
+) packet.Payload {
+ var sessions []snowflake.ID
+ sess.Manager().UseSessions(func(s map[snowflake.ID]*session.Session) {
+ sessions = make([]snowflake.ID, 0, len(s)-1)
+ for key := range s {
+ if key != sess.ID() {
+ sessions = append(sessions, key)
+ }
+ }
+ })
+
+ queries := data.New(db)
+ sessions, err := queries.FilterUsersInNetwork(ctx, data.FilterUsersInNetworkParams{
+ NetworkID: network,
+ Users: sessions,
+ })
+ if err != nil {
+ log.Println("database error in propagate:", err)
+ return &ErrInternalError
+ }
+
+ for _, sessionId := range sessions {
+ session := sess.Manager().Session(sessionId)
+ if session == nil {
+ continue
+ }
+ timeout := 1 * time.Second
+ context, cancel := context.WithTimeout(context.Background(), timeout)
+ go func() {
+ defer cancel()
+ pkt := packet.NewPacket(packet.NewJsonEncoder(payload))
+ if ok := session.Write(context, pkt); !ok {
+ log.Println(sess.Addr(), "propagation to", session.Addr(), "failed")
+ }
+ }()
+ }
+
+ return payload
+}