mirror of
https://github.com/Kyren223/eko.git
synced 2025-09-05 21:18:14 +00:00
Added a list of banned members server-side
This commit is contained in:
@@ -56,6 +56,58 @@ func (q *Queries) FilterUsersInNetwork(ctx context.Context, arg FilterUsersInNet
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const getBannedMembers = `-- name: GetBannedMembers :many
|
||||
SELECT
|
||||
users.id, users.name, users.public_key, users.description, users.is_public_dm, users.is_deleted,
|
||||
members.user_id, members.network_id, members.joined_at, members.is_member, members.is_admin, members.is_muted, members.is_banned, members.ban_reason
|
||||
FROM members
|
||||
JOIN users ON users.id = members.user_id
|
||||
WHERE network_id = ? AND is_banned = true
|
||||
`
|
||||
|
||||
type GetBannedMembersRow struct {
|
||||
User User
|
||||
Member Member
|
||||
}
|
||||
|
||||
func (q *Queries) GetBannedMembers(ctx context.Context, networkID snowflake.ID) ([]GetBannedMembersRow, error) {
|
||||
rows, err := q.db.QueryContext(ctx, getBannedMembers, networkID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []GetBannedMembersRow
|
||||
for rows.Next() {
|
||||
var i GetBannedMembersRow
|
||||
if err := rows.Scan(
|
||||
&i.User.ID,
|
||||
&i.User.Name,
|
||||
&i.User.PublicKey,
|
||||
&i.User.Description,
|
||||
&i.User.IsPublicDM,
|
||||
&i.User.IsDeleted,
|
||||
&i.Member.UserID,
|
||||
&i.Member.NetworkID,
|
||||
&i.Member.JoinedAt,
|
||||
&i.Member.IsMember,
|
||||
&i.Member.IsAdmin,
|
||||
&i.Member.IsMuted,
|
||||
&i.Member.IsBanned,
|
||||
&i.Member.BanReason,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Close(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const getMemberById = `-- name: GetMemberById :one
|
||||
SELECT user_id, network_id, joined_at, is_member, is_admin, is_muted, is_banned, ban_reason FROM members
|
||||
WHERE network_id = ? AND user_id = ?
|
||||
|
@@ -73,6 +73,7 @@ const (
|
||||
PacketRequestMessages
|
||||
PacketMessagesInfo
|
||||
|
||||
PacketGetBannedMembers
|
||||
PacketSetMember
|
||||
PacketMembersInfo
|
||||
|
||||
|
@@ -224,3 +224,11 @@ type TrustInfo struct {
|
||||
func (m *TrustInfo) Type() PacketType {
|
||||
return PacketTrustInfo
|
||||
}
|
||||
|
||||
type GetBannedMembers struct {
|
||||
Network snowflake.ID
|
||||
}
|
||||
|
||||
func (m *GetBannedMembers) Type() PacketType {
|
||||
return PacketGetBannedMembers
|
||||
}
|
||||
|
@@ -21,6 +21,8 @@ var (
|
||||
ErrInternalError = packet.Error{Error: "internal server error"}
|
||||
ErrPermissionDenied = packet.Error{Error: "permission denied"}
|
||||
ErrNotImplemented = packet.Error{Error: "not implemented yet"}
|
||||
|
||||
DefaultBanReason = ""
|
||||
)
|
||||
|
||||
func SendMessage(ctx context.Context, sess *session.Session, request *packet.SendMessage) packet.Payload {
|
||||
@@ -567,10 +569,10 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
|
||||
isMember := member.IsMember
|
||||
isAdmin := member.IsAdmin
|
||||
isMuted := member.IsMuted
|
||||
IsBanned := member.IsBanned
|
||||
isBanned := member.IsBanned
|
||||
banReason := member.BanReason
|
||||
|
||||
if request.Member != nil && !IsBanned {
|
||||
if request.Member != nil && !isBanned {
|
||||
isLeave := !*request.Member && request.User == sess.ID()
|
||||
isKick := !*request.Member && isSessAdmin && (!isAdmin || isSessOwner)
|
||||
if request.User != network.OwnerID && (isLeave || isKick) {
|
||||
@@ -593,11 +595,16 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
|
||||
} else if request.Banned != nil {
|
||||
notSelf := request.User != sess.ID()
|
||||
if isSessAdmin && notSelf && (!isAdmin || isSessOwner) {
|
||||
IsBanned = *request.Banned
|
||||
banReason = request.BanReason
|
||||
isAdmin = false // Important for security
|
||||
if IsBanned {
|
||||
isBanned = *request.Banned
|
||||
if isBanned {
|
||||
isMember = false // kick if user got banned
|
||||
banReason = request.BanReason
|
||||
isAdmin = false // Important for security
|
||||
if banReason == nil {
|
||||
banReason = &DefaultBanReason
|
||||
}
|
||||
} else {
|
||||
banReason = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -608,7 +615,7 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
|
||||
IsMember: isMember,
|
||||
IsAdmin: isAdmin,
|
||||
IsMuted: isMuted,
|
||||
IsBanned: IsBanned,
|
||||
IsBanned: isBanned,
|
||||
BanReason: banReason,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -1116,3 +1123,42 @@ func GetUserTrusteds(ctx context.Context, sess *session.Session) packet.Payload
|
||||
RemovedTrusteds: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func GetBannedMembers(ctx context.Context, sess *session.Session, request *packet.GetBannedMembers) packet.Payload {
|
||||
queries := data.New(db)
|
||||
|
||||
member, err := queries.GetMemberById(ctx, data.GetMemberByIdParams{
|
||||
NetworkID: request.Network,
|
||||
UserID: sess.ID(),
|
||||
})
|
||||
if err == sql.ErrNoRows {
|
||||
return &packet.Error{Error: "network doesn't exist"}
|
||||
}
|
||||
if err != nil {
|
||||
log.Println("database error 0:", err)
|
||||
return &ErrInternalError
|
||||
}
|
||||
|
||||
if !member.IsAdmin {
|
||||
return &ErrPermissionDenied
|
||||
}
|
||||
|
||||
bannedMembersRow, err := queries.GetBannedMembers(ctx, request.Network)
|
||||
if err != nil {
|
||||
log.Println("database error 1:", err)
|
||||
return &ErrInternalError
|
||||
}
|
||||
members := make([]data.Member, 0, len(bannedMembersRow))
|
||||
users := make([]data.User, 0, len(bannedMembersRow))
|
||||
for _, memberAndUser := range bannedMembersRow {
|
||||
members = append(members, memberAndUser.Member)
|
||||
users = append(users, memberAndUser.User)
|
||||
}
|
||||
|
||||
return &packet.MembersInfo{
|
||||
RemovedMembers: nil,
|
||||
Members: members,
|
||||
Users: users,
|
||||
Network: request.Network,
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,14 @@ FROM members
|
||||
JOIN users ON users.id = members.user_id
|
||||
WHERE network_id = ? AND is_member = true;
|
||||
|
||||
-- name: GetBannedMembers :many
|
||||
SELECT
|
||||
sqlc.embed(users),
|
||||
sqlc.embed(members)
|
||||
FROM members
|
||||
JOIN users ON users.id = members.user_id
|
||||
WHERE network_id = ? AND is_banned = true;
|
||||
|
||||
-- name: GetMemberById :one
|
||||
SELECT * FROM members
|
||||
WHERE network_id = ? AND user_id = ?;
|
||||
|
Reference in New Issue
Block a user