74 lines
2.9 KiB
Go
74 lines
2.9 KiB
Go
package memory
|
||
|
||
import (
|
||
"sync"
|
||
"telesrv/internal/domain"
|
||
)
|
||
|
||
// MessageStore 是 store.MessageStore 的内存实现。
|
||
type MessageStore struct {
|
||
mu sync.RWMutex
|
||
noForwardsMu sync.Mutex
|
||
m map[int64][]domain.Message
|
||
nextUID int64
|
||
nextBox map[int64]int
|
||
nextPts map[int64]int
|
||
readOutboxDates map[readOutboxDateKey]int
|
||
privateReactions map[int64]map[int64][]domain.ChannelMessagePeerReaction
|
||
savedMessageTags map[int64]map[int][]domain.MessageReaction
|
||
savedTagTitles map[int64]map[string]string
|
||
privateSendDedup map[privateSendDedupKey]privateSendDedupRecord
|
||
loginCodeDeliveries map[[32]byte]loginCodeDeliveryRecord
|
||
albumGroups map[albumGroupKey]albumGroupRecord
|
||
dialogs *DialogStore
|
||
updateEvents *UpdateEventStore
|
||
// polls 是共享 poll 权威(投票校验与读路径 enrichment);nil 时 poll 链路按未接入处理。
|
||
polls *PollStore
|
||
// savedPins 是收藏夹子会话置顶顺序(下标即 pinned_order,越小越前)。
|
||
savedPins map[int64][]domain.Peer
|
||
// privateNoForwards is keyed by the sorted user pair. Requests are keyed by
|
||
// the shared logical private-message id so both local box ids resolve to one
|
||
// one-shot response fact.
|
||
privateNoForwards map[privateNoForwardsPair]domain.PrivateNoForwardsState
|
||
privateNoForwardsRequests map[int64]memoryNoForwardsRequest
|
||
}
|
||
|
||
// AttachPollStore 注入共享 poll 权威(与 ChannelStore 共用同一实例)。
|
||
func (s *MessageStore) AttachPollStore(polls *PollStore) {
|
||
s.polls = polls
|
||
}
|
||
|
||
func (s *MessageStore) AttachUpdateEventStore(events *UpdateEventStore) {
|
||
s.updateEvents = events
|
||
}
|
||
|
||
type readOutboxDateKey struct {
|
||
ownerUserID int64
|
||
peerID int64
|
||
msgID int
|
||
}
|
||
|
||
// NewMessageStore 创建内存 MessageStore。
|
||
func NewMessageStore(dialogs ...*DialogStore) *MessageStore {
|
||
s := &MessageStore{
|
||
m: make(map[int64][]domain.Message),
|
||
nextUID: 1,
|
||
nextBox: make(map[int64]int),
|
||
nextPts: make(map[int64]int),
|
||
readOutboxDates: make(map[readOutboxDateKey]int),
|
||
privateReactions: make(map[int64]map[int64][]domain.ChannelMessagePeerReaction),
|
||
savedMessageTags: make(map[int64]map[int][]domain.MessageReaction),
|
||
savedTagTitles: make(map[int64]map[string]string),
|
||
privateSendDedup: make(map[privateSendDedupKey]privateSendDedupRecord),
|
||
loginCodeDeliveries: make(map[[32]byte]loginCodeDeliveryRecord),
|
||
albumGroups: make(map[albumGroupKey]albumGroupRecord),
|
||
savedPins: make(map[int64][]domain.Peer),
|
||
privateNoForwards: make(map[privateNoForwardsPair]domain.PrivateNoForwardsState),
|
||
privateNoForwardsRequests: make(map[int64]memoryNoForwardsRequest),
|
||
updateEvents: NewUpdateEventStore(),
|
||
}
|
||
if len(dialogs) > 0 {
|
||
s.dialogs = dialogs[0]
|
||
}
|
||
return s
|
||
}
|