Files
stat_center/common/tgbot/entity.go
T
2026-05-20 16:13:58 +08:00

110 lines
2.4 KiB
Go

package tgbot
import (
"fmt"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"strings"
"unicode/utf16"
)
type Entity struct {
Title string
Content string
}
func (p *Entity) GetTitle() string {
return fmt.Sprintf("%s", p.Title)
}
func (p *Entity) Entity(startOffset int) ([]tgbotapi.MessageEntity, string) {
ret := make([]tgbotapi.MessageEntity, 0)
ret = append(ret, tgbotapi.MessageEntity{
Type: "expandable_blockquote",
Offset: startOffset,
Length: p.TextU16Len(),
})
if p.TitleU16Len() > 0 {
ret = append(ret, tgbotapi.MessageEntity{
Type: "bold",
Offset: startOffset,
Length: p.TitleU16Len(),
})
}
if p.ContentU16Len() > 0 {
ret = append(ret, tgbotapi.MessageEntity{
Type: "bold",
Offset: startOffset + p.TitleU16Len() + 1,
Length: p.ContentU16Len(),
})
}
if p.TitleU16Len() > 0 {
return ret, p.GetTitle() + "\n" + p.Content
}
return ret, p.Content
}
func (p *Entity) TextU16Len() int {
text := p.GetTitle()
if text != "" {
text += "\n"
}
text += p.Content
return len(utf16.Encode([]rune(text)))
}
func (p *Entity) TitleU16Len() int {
return len(utf16.Encode([]rune(p.GetTitle())))
}
func (p *Entity) ContentU16Len() int {
return len(utf16.Encode([]rune(p.Content)))
}
type EntityList struct {
Title string
Desc string
Entities []*Entity
}
func NewEntityList(title, desc string, entities []*Entity) *EntityList {
return &EntityList{
Title: strings.TrimSpace(title),
Desc: strings.TrimSpace(desc),
Entities: entities,
}
}
func (p *EntityList) ToEntities() ([]tgbotapi.MessageEntity, string) {
ret := make([]tgbotapi.MessageEntity, 0)
var text string
var startOffset int
// 添加总标题
titleU16Len := len(utf16.Encode([]rune(p.Title)))
ret = append(ret, tgbotapi.MessageEntity{
Type: "bold",
Offset: 0,
Length: titleU16Len,
})
text += p.Title + "\n"
startOffset += titleU16Len + 1
// 添加总描述
if p.Desc != "" {
descU16Len := len(utf16.Encode([]rune(p.Desc)))
ret = append(ret, tgbotapi.MessageEntity{
Type: "bold",
Offset: startOffset,
Length: descU16Len,
})
text += p.Desc + "\n"
startOffset += descU16Len + 1
}
// 添加每个Prompt
for _, ent := range p.Entities {
promptEntities, promptText := ent.Entity(startOffset)
ret = append(ret, promptEntities...)
text += promptText + "\n"
startOffset += ent.TextU16Len() + 1
}
return ret, text
}