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 }