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 }