tg/inline.go

115 lines
2.3 KiB
Go

package tg
import (
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
// The type represents keyboard to be emdedded into the messages (inline in Telegram terms).
type Inline struct {
*Keyboard
}
// Convert the inline keyboard to markup for the tgbotapi.
func (kbd *Inline) ToApi() tgbotapi.InlineKeyboardMarkup {
rows := [][]tgbotapi.InlineKeyboardButton{}
for _, row := range kbd.Rows {
if row == nil {
continue
}
buttons := []tgbotapi.InlineKeyboardButton{}
for _, button := range row {
if button == nil {
continue
}
buttons = append(buttons, button.ToTelegramInline())
}
rows = append(rows, buttons)
}
return tgbotapi.NewInlineKeyboardMarkup(rows...)
}
// The type implements message with an inline keyboard.
type InlineCompo struct {
*MessageCompo
*Inline
}
// Implementing the Sendable interface.
func (compo *InlineCompo) SendConfig(
sid SessionId, bot *Bot,
) (*SendConfig) {
sendConfig := compo.MessageCompo.SendConfig(sid, bot)
sendConfig.Message.ReplyMarkup = compo.Inline.ToApi()
return sendConfig
}
func (compo *InlineCompo) Update(c *Context) {
var edit tgbotapi.Chattable
markup := compo.Inline.ToApi()
ln := len(markup.InlineKeyboard)
c.Sendf("%d shit", ln)
if ln == 0 {
edit = tgbotapi.NewEditMessageText(
c.Session.Id.ToApi(),
compo.Message.MessageID,
compo.Text,
)
} else {
edit = tgbotapi.NewEditMessageTextAndMarkup(
c.Session.Id.ToApi(),
compo.Message.MessageID,
compo.Text,
markup,
)
}
msg, _ := c.Bot.Api.Send(edit)
compo.Message = &msg
}
// Implementing the Filterer interface.
func (compo *InlineCompo) Filter(u *Update) bool {
if compo == nil || u.CallbackQuery == nil {
return true
}
if u.CallbackQuery.Message.MessageID !=
compo.Message.MessageID {
return true
}
return false
}
// Implementing the Server interface.
func (widget *InlineCompo) Serve(c *Context) {
btns := widget.ButtonMap()
for u := range c.Input() {
var act Action
cb := tgbotapi.NewCallback(
u.CallbackQuery.ID,
u.CallbackQuery.Data,
)
data := u.CallbackQuery.Data
_, err := c.Bot.Api.Request(cb)
if err != nil {
//return err
continue
}
btn, ok := btns[data]
if !ok {
continue
}
if btn != nil {
act = btn.Action
} else if widget.Action != nil {
act = widget.Action
}
c.WithUpdate(u).Run(act)
}
}