72 lines
2.6 KiB
Go
72 lines
2.6 KiB
Go
package adapter
|
|
|
|
// Role is the strongly typed identity role the channel layer assigns to a
|
|
// message sender. It is derived from channel-level actor metadata (login state,
|
|
// account binding, group membership) by the strategy engine, never from prompt
|
|
// text. This is a project red line: identity resolution must not rely on
|
|
// natural-language hints.
|
|
type Role string
|
|
|
|
const (
|
|
// RoleOwner is the bound owner/primary account.
|
|
RoleOwner Role = "owner"
|
|
// RoleMember is a non-owner participant (for example a stranger in a group).
|
|
RoleMember Role = "member"
|
|
// RoleSystem is a system/synthetic sender (platform notice, bot).
|
|
RoleSystem Role = "system"
|
|
// RoleUnknown is a sender whose identity could not be determined.
|
|
RoleUnknown Role = "unknown"
|
|
)
|
|
|
|
// Valid reports whether r is one of the known roles.
|
|
func (r Role) Valid() bool {
|
|
switch r {
|
|
case RoleOwner, RoleMember, RoleSystem, RoleUnknown:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Actor is the strongly typed identity metadata attached to a message sender.
|
|
// The channel layer derives it from channel telemetry (login session, account
|
|
// binding, group membership) rather than from the message's free-text sender
|
|
// name. Owner detection and group isolation read this field, not prompt text.
|
|
type Actor struct {
|
|
// Role is the resolved identity role.
|
|
Role Role
|
|
// UserID is the stable platform user identifier.
|
|
UserID string
|
|
// DisplayName is the human-readable sender name, used for display only.
|
|
DisplayName string
|
|
// IsGroup is true when the actor represents a group/room conversation
|
|
// rather than a single user.
|
|
IsGroup bool
|
|
// GroupID is the group identifier, set when IsGroup is true.
|
|
GroupID string
|
|
// GroupName is the human-readable group name, used for display only.
|
|
GroupName string
|
|
}
|
|
|
|
// IsOwner reports whether the actor is the bound owner account.
|
|
func (a Actor) IsOwner() bool { return a.Role == RoleOwner }
|
|
|
|
// IsGroupChat reports whether the actor represents a group conversation.
|
|
func (a Actor) IsGroupChat() bool { return a.IsGroup }
|
|
|
|
// IsSystem reports whether the actor is a system/synthetic sender.
|
|
func (a Actor) IsSystem() bool { return a.Role == RoleSystem }
|
|
|
|
// IsUnknown reports whether the actor's role could not be determined.
|
|
func (a Actor) IsUnknown() bool { return a.Role == RoleUnknown }
|
|
|
|
// Resolve is a pure helper that infers IsGroup and the group identity from the
|
|
// GroupID when the channel layer has not set them explicitly, so adapters can
|
|
// populate a minimal Actor and still get correct group flags.
|
|
func (a Actor) Resolve() Actor {
|
|
if a.GroupID != "" {
|
|
a.IsGroup = true
|
|
}
|
|
return a
|
|
}
|