TOC分页:解决内容超长导致MEDIA_CAPTION_TOO_LONG错误
当目录条目增多超过Telegram caption字符限制时,自动按字符上限分页渲染, 附带翻页inline keyboard(⏮首页/⬅️上一页/➡️下一页),支持photo和text两种模式。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,11 +3,13 @@ package telegram
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"tgchanbot/internal/storage"
|
||||
"tgchanbot/internal/toc"
|
||||
|
||||
tele "gopkg.in/telebot.v3"
|
||||
)
|
||||
@@ -273,12 +275,18 @@ func (b *Bot) buildCategoryKeyboard(categories []storage.Category) *tele.ReplyMa
|
||||
}
|
||||
|
||||
func (b *Bot) handleCallback(c tele.Context) error {
|
||||
// telebot v3 会在 data 前加 \f 前缀,需要去掉
|
||||
data := strings.TrimPrefix(c.Callback().Data, "\f")
|
||||
|
||||
// TOC 翻页回调:任何用户都可点击(频道公开按钮),不需要 admin 权限
|
||||
if strings.HasPrefix(data, toc.CbPrefixTocPage) {
|
||||
return b.handleTocPageCallback(c, data)
|
||||
}
|
||||
|
||||
if !b.isAdmin(c.Sender().ID) {
|
||||
return c.Respond(&tele.CallbackResponse{Text: "无权限"})
|
||||
}
|
||||
|
||||
// telebot v3 会在 data 前加 \f 前缀,需要去掉
|
||||
data := strings.TrimPrefix(c.Callback().Data, "\f")
|
||||
userID := c.Sender().ID
|
||||
|
||||
switch {
|
||||
@@ -593,3 +601,18 @@ func buildMessageLink(msg *tele.Message) string {
|
||||
}
|
||||
return fmt.Sprintf("https://t.me/c/%d/%d", chatID, msgID)
|
||||
}
|
||||
|
||||
// handleTocPageCallback 处理 TOC 翻页回调
|
||||
func (b *Bot) handleTocPageCallback(c tele.Context, data string) error {
|
||||
pageStr := strings.TrimPrefix(data, toc.CbPrefixTocPage)
|
||||
page, err := strconv.Atoi(pageStr)
|
||||
if err != nil || page < 1 {
|
||||
return c.Respond(&tele.CallbackResponse{Text: "无效页码"})
|
||||
}
|
||||
|
||||
if err := b.toc.HandlePageCallback(page); err != nil {
|
||||
return c.Respond(&tele.CallbackResponse{Text: "更新失败"})
|
||||
}
|
||||
|
||||
return c.Respond()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user