forked from all_user/stat_center
110 lines
2.4 KiB
Go
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
|
|
}
|