Ctrl K
ComunidadGuías…

internal/domain/community.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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
}