owpengram-server/internal/domain/community.go
A da6a57e1a3 feat: sync community aggregates
Sync telesrv 36eda30 (feat(communities): implement Layer 228 community aggregates).

Skipped telesrv docs changes per public sync rules; normalized the public appearance seed label.
2026-07-20 16:46:02 +08:00

214 lines
5.4 KiB
Go

package domain
import "errors"
const (
MaxCommunityPeers = 100
MaxCommunityBotPeers = 100
MaxCommunityLinkRequests = 100
MaxCommunityTitleRunes = 128
MaxCommunityAboutRunes = 255
MaxCommunityParticipants = 200
)
var (
ErrCommunityInvalid = errors.New("community invalid")
ErrCommunityPrivate = errors.New("community private")
ErrCommunityAdminRequired = errors.New("community admin required")
ErrCommunityCreatorRequired = errors.New("community creator required")
ErrCommunityPeerInvalid = errors.New("community peer invalid")
ErrCommunityPeerLinked = errors.New("community peer already linked")
ErrCommunityPeersTooMuch = errors.New("community peers too much")
ErrCommunityRequestCreated = errors.New("community request created")
ErrCommunityRequestMissing = errors.New("community request missing")
ErrCommunityParticipantInvalid = errors.New("community participant invalid")
)
// Community is the Layer 228 aggregation container. It intentionally has no
// message/read/pts fields: linked dialogs remain the only message truth.
type Community struct {
ID int64
AccessHash int64
CreatorUserID int64
Title string
About string
Date int
Deleted bool
DefaultBannedRights ChannelBannedRights
PhotoID int64
PhotoDCID int
PhotoStripped []byte
}
type CommunityMemberRole string
const (
CommunityRoleCreator CommunityMemberRole = "creator"
CommunityRoleAdmin CommunityMemberRole = "admin"
CommunityRoleMember CommunityMemberRole = "member"
)
type CommunityMemberStatus string
const (
CommunityMemberActive CommunityMemberStatus = "active"
CommunityMemberKicked CommunityMemberStatus = "kicked"
)
type CommunityMember struct {
CommunityID int64
UserID int64
Role CommunityMemberRole
Status CommunityMemberStatus
AdminRights ChannelAdminRights
Rank string
Date int
}
func (m CommunityMember) Active() bool { return m.Status == CommunityMemberActive }
func (m CommunityMember) CanManageLinkedPeers() bool {
return m.Active() && (m.Role == CommunityRoleCreator ||
(m.Role == CommunityRoleAdmin && m.AdminRights.ManageLinkedPeers))
}
func (m CommunityMember) CanChangeInfo() bool {
return m.Active() && (m.Role == CommunityRoleCreator ||
(m.Role == CommunityRoleAdmin && m.AdminRights.ChangeInfo))
}
func (m CommunityMember) CanAddAdmins() bool {
return m.Active() && (m.Role == CommunityRoleCreator ||
(m.Role == CommunityRoleAdmin && m.AdminRights.AddAdmins))
}
func (m CommunityMember) CanBanUsers() bool {
return m.Active() && (m.Role == CommunityRoleCreator ||
(m.Role == CommunityRoleAdmin && m.AdminRights.BanUsers))
}
type CommunityPeerVisibility string
const (
CommunityPeerVisible CommunityPeerVisibility = "visible"
CommunityPeerHidden CommunityPeerVisibility = "hidden"
)
type CommunityPeerLink struct {
CommunityID int64
Peer Peer
Visibility CommunityPeerVisibility
CanViewHistory bool
CreatedBy int64
Date int
}
func (l CommunityPeerLink) Visible() bool { return l.Visibility == CommunityPeerVisible }
type CommunityPeerLinkRequest struct {
CommunityID int64
Peer Peer
RequestedBy int64
Visibility CommunityPeerVisibility
Date int
}
type CommunityUserState struct {
CommunityID int64
UserID int64
Collapsed bool
Pinned bool
PinnedOrder int
NotifySettings *PeerNotifySettings
}
type CommunityView struct {
Community Community
Self CommunityMember
State CommunityUserState
Links []CommunityPeerLink
Channels []Channel
Users []User
ServiceMessages []SendChannelMessageResult
AdminsCount int
KickedCount int
PendingRequests int
Forbidden bool
}
func (v CommunityView) Creator() bool {
return v.Self.Active() && v.Self.Role == CommunityRoleCreator
}
type CreateCommunityRequest struct {
CreatorUserID int64
Title string
About string
InitialPeer Peer
Visibility CommunityPeerVisibility
Date int
}
type CommunityTogglePeerLinkRequest struct {
ActorUserID int64
CommunityID int64
Peer Peer
Visibility CommunityPeerVisibility
Deleted bool
RequestOnly bool
Date int
}
type CommunityTogglePeerLinkResult struct {
Community Community
Peer Peer
RequestedBy int64
Link *CommunityPeerLink
ServiceMessage *SendChannelMessageResult
Removed bool
RequestCreated bool
}
type CommunityPeerLinkRequestPage struct {
TotalCount int
Requests []CommunityPeerLinkRequest
NextOffset string
Channels []Channel
Users []User
}
type CommunityParticipantJoinedChats struct {
CreatorChatIDs []int64
JoinedChatIDs []int64
Channels []Channel
Users []User
}
type CommunityParticipantList struct {
Community Community
Count int
Participants []CommunityMember
Users []User
Hash int64
}
type CommunityParticipantBanResult struct {
Changed bool
ChannelBans []EditChannelBannedResult
RemovedLinks []CommunityTogglePeerLinkResult
}
type CommunityEditAdminRequest struct {
ActorUserID int64
CommunityID int64
UserID int64
Rights ChannelAdminRights
Rank string
Date int
}
type CommunitySearchScope struct {
CommunityID int64
ChannelIDs []int64
BotUserIDs []int64
}