mirror of
https://github.com/Kyren223/eko.git
synced 2025-09-09 15:08:22 +00:00
able to read it and also fixed some other bugs and implemented propagation for members joining/leavings servers
104 lines
2.6 KiB
Go
104 lines
2.6 KiB
Go
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"
|
|
)
|
|
|
|
const hex = "0123456789abcdefABCDEF"
|
|
|
|
func isValidHexColor(color string) (bool, string) {
|
|
if len(color) != 7 {
|
|
return false, "color must be hex with length of 7"
|
|
}
|
|
|
|
if color[0] != '#' {
|
|
return false, "color must start with '#'"
|
|
}
|
|
|
|
for _, c := range color[1:] {
|
|
if !strings.ContainsRune(hex, c) {
|
|
return false, "color must start with '#' and contain exactly 6 digits 0-9, a-f, A-F"
|
|
}
|
|
}
|
|
|
|
return true, ""
|
|
}
|
|
|
|
func IsNetworkAdmin(ctx context.Context, queries *data.Queries, userId, networkId snowflake.ID) (bool, error) {
|
|
userNetwork, err := queries.GetMemberById(ctx, data.GetMemberByIdParams{
|
|
NetworkID: networkId,
|
|
UserID: userId,
|
|
})
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
isAdmin := userNetwork.IsAdmin && userNetwork.IsMember && !userNetwork.IsBanned
|
|
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.NewMsgPackEncoder(payload))
|
|
if ok := session.Write(context, pkt); !ok {
|
|
log.Println(sess.Addr(), "propagation to", session.Addr(), "failed")
|
|
} else {
|
|
log.Println(session.Addr(), "sent: ", pkt.String())
|
|
log.Println(sess.Addr(), "propagation to", session.Addr(), "succeeded")
|
|
}
|
|
}()
|
|
}
|
|
|
|
return payload
|
|
}
|
|
|
|
func SplitMembersAndUsers(membersAndUsers []data.GetNetworkMembersRow) ([]data.Member, []data.User) {
|
|
members := make([]data.Member, 0, len(membersAndUsers))
|
|
users := make([]data.User, 0, len(membersAndUsers))
|
|
for _, memberAndUser := range membersAndUsers {
|
|
members = append(members, memberAndUser.Member)
|
|
users = append(users, memberAndUser.User)
|
|
}
|
|
|
|
return members, users
|
|
}
|