live-sfu-demo/internal/room/member.go

96 lines
2.3 KiB
Go

package room
import (
"time"
)
type RoomMember struct {
RoomName string `json:"room_name"`
RoomID string `json:"room_id"`
UserID string `json:"user_id"`
Username string `json:"username"`
Role RoomRole `json:"role"`
Status MemberStatus `json:"status"`
AddedPerms uint64 `json:"added_permissions"`
RemovedPerms uint64 `json:"removed_permissions"`
AdminAdded uint64 `json:"admin_added_permissions"`
AdminRemoved uint64 `json:"admin_removed_permissions"`
JoinedAt time.Time `json:"joined_at"`
Version int64 `json:"version"`
}
func NewMember(room, username string, role RoomRole) *RoomMember {
return &RoomMember{
RoomName: room,
Username: username,
UserID: username,
Role: role,
Status: MemberActive,
JoinedAt: time.Now(),
Version: 1,
}
}
func (m *RoomMember) EffectivePermissions(settings *RoomSettings) PermissionSet {
if m.Role == RoleCreator {
return PermAll
}
base := m.basePermissions(settings)
switch m.Role {
case RoleAdmin:
res := base
res |= PermissionSet(m.AdminAdded)
res &^= PermissionSet(m.AdminRemoved)
return res
case RoleMember:
res := base
res |= PermissionSet(m.AddedPerms)
res &^= PermissionSet(m.RemovedPerms)
return res
case RoleGuest:
res := base & PermGuestAssignable
added := PermissionSet(m.AddedPerms) & PermGuestAssignable
removed := PermissionSet(m.RemovedPerms) & PermGuestAssignable
res |= added
res &^= removed
return res
default:
return base
}
}
func (m *RoomMember) basePermissions(settings *RoomSettings) PermissionSet {
if settings == nil {
return DefaultForRole(m.Role)
}
switch m.Role {
case RoleAdmin:
return settings.AdminPermissions()
case RoleMember:
return settings.MemberPermissions()
case RoleGuest:
return settings.GuestPermissions()
case RoleCreator:
return PermAll
default:
return DefaultForRole(m.Role)
}
}
func (m *RoomMember) HasPermission(p RoomPermission, settings *RoomSettings) bool {
return m.EffectivePermissions(settings).Has(p)
}
func (m *RoomMember) CanGrant(target *RoomMember, perm RoomPermission, settings *RoomSettings) bool {
if !m.HasPermission(PermManagePermissions, settings) {
return false
}
if !m.Role.CanManage(target.Role) {
return false
}
if m.Role == RoleAdmin && perm == PermDeleteRoom {
return false
}
return true
}