Files
2026-02-05 11:07:37 +08:00

155 lines
2.9 KiB
Go

package telegram
import (
"sync"
"time"
tele "gopkg.in/telebot.v3"
)
type PostStep int
const (
StepAwaitForward PostStep = iota
StepAwaitCategory
StepAwaitTitle
StepAwaitConfirm
)
type PostState struct {
UserID int64
ForwardedMsg *tele.Message // 单条消息
ForwardedMsgs []*tele.Message // 相册消息
AlbumID string // 相册ID
SelectedCat string
Title string
Step PostStep
CreatedAt time.Time
}
type StateManager struct {
mu sync.RWMutex
states map[int64]*PostState
}
func NewStateManager() *StateManager {
return &StateManager{
states: make(map[int64]*PostState),
}
}
func (sm *StateManager) Get(userID int64) *PostState {
sm.mu.RLock()
defer sm.mu.RUnlock()
return sm.states[userID]
}
func (sm *StateManager) Set(state *PostState) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.states[state.UserID] = state
}
func (sm *StateManager) Delete(userID int64) {
sm.mu.Lock()
defer sm.mu.Unlock()
delete(sm.states, userID)
}
func (sm *StateManager) StartPost(userID int64) *PostState {
state := &PostState{
UserID: userID,
Step: StepAwaitForward,
CreatedAt: time.Now(),
}
sm.Set(state)
return state
}
func (sm *StateManager) SetForwarded(userID int64, msg *tele.Message) *PostState {
sm.mu.Lock()
defer sm.mu.Unlock()
state := sm.states[userID]
if state == nil {
return nil
}
state.ForwardedMsg = msg
state.ForwardedMsgs = nil
state.AlbumID = ""
state.Step = StepAwaitCategory
return state
}
// AddAlbumMessage 添加相册消息,返回是否应该继续等待更多消息
func (sm *StateManager) AddAlbumMessage(userID int64, msg *tele.Message) (shouldWait bool) {
sm.mu.Lock()
defer sm.mu.Unlock()
state := sm.states[userID]
if state == nil {
return false
}
// 第一条相册消息
if state.AlbumID == "" {
state.AlbumID = msg.AlbumID
state.ForwardedMsgs = []*tele.Message{msg}
return true
}
// 同一相册的后续消息
if state.AlbumID == msg.AlbumID {
state.ForwardedMsgs = append(state.ForwardedMsgs, msg)
return true
}
return false
}
// FinalizeAlbum 完成相册收集
func (sm *StateManager) FinalizeAlbum(userID int64) *PostState {
sm.mu.Lock()
defer sm.mu.Unlock()
state := sm.states[userID]
if state == nil {
return nil
}
if len(state.ForwardedMsgs) > 0 {
state.ForwardedMsg = state.ForwardedMsgs[0] // 用第一条提取标题
}
state.Step = StepAwaitCategory
return state
}
func (sm *StateManager) SetCategory(userID int64, category string) *PostState {
sm.mu.Lock()
defer sm.mu.Unlock()
state := sm.states[userID]
if state == nil {
return nil
}
state.SelectedCat = category
state.Step = StepAwaitTitle
return state
}
func (sm *StateManager) SetTitle(userID int64, title string) *PostState {
sm.mu.Lock()
defer sm.mu.Unlock()
state := sm.states[userID]
if state == nil {
return nil
}
state.Title = title
state.Step = StepAwaitConfirm
return state
}