123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package tg
- import (
- //tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
- )
- // The general keyboard type used both in Reply and Inline.
- type Keyboard struct {
- // The action is called if there is no
- // defined action for the button.
- Action Action
- Rows []ButtonRow
- buttonMap ButtonMap
- }
- // Returns the new keyboard with specified rows.
- func NewKeyboard(rows ...ButtonRow) Keyboard {
- ret := &Keyboard{}
- for _, row := range rows {
- if row != nil && len(row) > 0 {
- ret.Rows = append(ret.Rows, row)
- }
- }
- return ret
- }
- func (kbd Keyboard) RowNum() int {
- 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
- }
- retBtns := []*Button{}
- for _, btn := range btns {
- if btn == nil {
- 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
- }
- // Adds buttons as one column list.
- func (kbd Keyboard) List(btns ...Button) Keyboard {
- for _, btn := range btns {
- if btn == nil {
- continue
- }
- 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 {
- if kbd.buttonMap == nil {
- kbd.buttonMap = kbd.MakeButtonMap()
- }
- return kbd.buttonMap
- }
- // 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
- }
- }
- kbd.buttonMap = ret
- 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.
- func (kbd Keyboard) Reply() Reply {
- ret := &Reply{}
- ret.Keyboard = kbd
- // it is used more often than not once.
- ret.OneTime = true
- return ret
- }
|