Fixed a bug where when kicking a member, it'd send a left request to the

person who is kicking and not to the person who was kicked
This commit is contained in:
2025-01-21 17:40:19 +02:00
parent a91411fde4
commit ad58adeeb2
2 changed files with 33 additions and 2 deletions

View File

@@ -615,18 +615,27 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
}
if !newMember.IsMember {
NetworkPropagate(ctx, sess, request.Network, &packet.MembersInfo{
membersInfoPayload := NetworkPropagateWithFilter(ctx, sess, request.Network, &packet.MembersInfo{
RemovedMembers: []snowflake.ID{newMember.UserID},
Members: nil,
Users: nil,
Network: request.Network,
}, func(userId snowflake.ID) (pass bool) {
return userId != newMember.UserID
})
return &packet.NetworksInfo{
networksInfoPayload := &packet.NetworksInfo{
Networks: nil,
RemovedNetworks: []snowflake.ID{request.Network},
Partial: false,
}
if newMember.UserID == sess.ID() {
return networksInfoPayload
} else {
UserPropagate(ctx, sess, newMember.UserID, networksInfoPayload)
return membersInfoPayload
}
}
user, err := queries.GetUserById(ctx, newMember.UserID)

View File

@@ -108,3 +108,25 @@ func SplitMembersAndUsers(membersAndUsers []data.GetNetworkMembersRow) ([]data.M
return members, users
}
func UserPropagate(
ctx context.Context, sess *session.Session,
user snowflake.ID, payload packet.Payload,
) packet.Payload {
session := sess.Manager().Session(user)
if session == nil {
log.Println(sess.Addr(), "propagation to", session.Addr(), "failed due to session being nil")
return payload
}
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")
}
}()
return payload
}