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:
2026-04-03 22:15:54 +08:00
parent d8fd372e53
commit df1fb034b3
4 changed files with 235 additions and 48 deletions

View File

@@ -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()
}