feat(channel): 跨平台 IM 接入抽象契约(UnifiedMessage/PlatformAdapter/Capabilities/Actor 身份)
This commit is contained in:
1 parent
a21176ec0a
commit
c52ddfd9c7
8 files changed
+767
No files matched your search
@@ -0,0 +1,71 @@
|
||||
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
|
||||
}
|
||||
Reference in new issue
Block a user