tg/keyboard.go

111 lines
2.3 KiB
Go
Raw Permalink Normal View History

2023-08-19 09:12:26 +03:00
package tg
2023-07-09 01:28:59 +03:00
import (
//tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
2023-07-09 01:28:59 +03:00
)
// The general keyboard type used both in Reply and Inline.
2023-07-09 01:28:59 +03:00
type Keyboard struct {
// The action is called if there is no
// defined action for the button.
Action Action
Rows []ButtonRow
}
2023-08-15 16:02:14 +03:00
// Returns the new keyboard with specified rows.
func NewKeyboard(rows ...ButtonRow) Keyboard {
2024-03-29 14:30:48 +03:00
ret := Keyboard{}
for _, row := range rows {
if row != nil && len(row) > 0 {
ret.Rows = append(ret.Rows, row)
}
}
return ret
2023-08-15 16:02:14 +03:00
}
func (kbd Keyboard) RowNum() int {
2023-12-12 19:32:30 +03:00
return len(kbd.Rows)
}
func (kbd *Keyboard) RemoveRow(i int) {
if i<0 || i > len(kbd.Rows) - 1 {
return
}
kbd.Rows = append(kbd.Rows[:i], kbd.Rows[i+1:]...)
}
// Adds a new button row to the current keyboard.
func (kbd Keyboard) Row(btns ...Button) Keyboard {
// For empty row. We do not need that.
if len(btns) < 1 {
return kbd
}
2024-03-29 14:30:48 +03:00
retBtns := make([]Button, 0, len(btns))
for _, btn := range btns {
2024-03-29 14:30:48 +03:00
if !btn.Valid {
continue
}
retBtns = append(retBtns, btn)
}
// Add only if there is something to add.
if len(retBtns) > 0 {
kbd.Rows = append(kbd.Rows, retBtns)
}
return kbd
}
2023-10-02 21:45:21 +03:00
// Adds buttons as one column list.
func (kbd Keyboard) List(btns ...Button) Keyboard {
2023-10-02 21:45:21 +03:00
for _, btn := range btns {
2024-03-29 14:30:48 +03:00
if !btn.Valid {
continue
}
2023-10-02 21:45:21 +03:00
kbd.Rows = append(kbd.Rows, ButtonRow{btn})
}
return kbd
}
// Set the default action when no button provides
// key to the data we got.
func (kbd Keyboard) WithAction(a Action) Keyboard {
kbd.Action = a
return kbd
}
// Returns the map of buttons. Where the key
// is button data and the value is Action.
func (kbd Keyboard) ButtonMap() ButtonMap {
2024-03-29 14:30:48 +03:00
return kbd.MakeButtonMap()
}
// Returns the map of buttons on the most fresh version of the keyboard.
func (kbd Keyboard) MakeButtonMap() ButtonMap {
ret := make(ButtonMap)
for _, vi := range kbd.Rows {
for _, vj := range vi {
ret[vj.Key()] = vj
}
}
return ret
}
// Convert the keyboard to the more specific inline one.
func (kbd Keyboard) Inline() Inline {
ret := Inline{}
ret.Keyboard = kbd
return ret
}
// Convert the keyboard to the more specific reply one.
2024-03-29 14:30:48 +03:00
// By default OneTime = true.
func (kbd Keyboard) Reply() Reply {
2024-03-29 14:30:48 +03:00
ret := Reply{}
ret.Keyboard = kbd
// it is used more often than not once.
ret.OneTime = true
return ret
}