feat: too much to explain. Who Cares?

This commit is contained in:
Andrey Parhomenko 2023-12-12 19:32:30 +03:00
parent 085d4cf77c
commit 97b1bec13b
7 changed files with 81 additions and 15 deletions

View file

@ -2,6 +2,9 @@ package tg
import ( import (
apix "github.com/go-telegram-bot-api/telegram-bot-api/v5" apix "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"fmt"
"crypto/rand"
"encoding/base64"
) )
// The type wraps Telegram API's button to provide Action functionality. // The type wraps Telegram API's button to provide Action functionality.
@ -29,12 +32,22 @@ func (btnMap ButtonMap) LocationButton() *Button {
type ButtonRow []*Button type ButtonRow []*Button
// Returns new button with the specified text and no action. // Returns new button with the specified text and no action.
func NewButton(text string) *Button { func NewButton(format string, v ...any) *Button {
return &Button{ return &Button{
Text: text, Text: fmt.Sprintf(format, v...),
} }
} }
// Randomize buttons data to make the key unique.
func (btn *Button) Rand() *Button {
rData := make([]byte, 8)
rand.Read(rData)
data := make([]byte, base64.StdEncoding.EncodedLen(len(rData)))
base64.StdEncoding.Encode(data, rData)
btn.Data = string(data)
return btn
}
// Set the URL for the button. Only for inline buttons. // Set the URL for the button. Only for inline buttons.
func (btn *Button) WithUrl(url string) *Button { func (btn *Button) WithUrl(url string) *Button {
btn.Url = url btn.Url = url

View file

@ -8,6 +8,27 @@ import (
//"path" //"path"
) )
func Go(pth Path) UI {
return UI{
GoWidget(pth),
}
}
type GoWidget string
// Implementing the Server interface.
func (widget GoWidget) Serve(c *Context) {
c.input.Close()
c.Go(Path(widget))
}
func (widget GoWidget) Render(c *Context) UI {
return UI{widget}
}
func (widget GoWidget) Filter(u *Update) bool {
return true
}
// General context for a specific user. // General context for a specific user.
// Is always the same and is not reached // Is always the same and is not reached
// inside end function-handlers. // inside end function-handlers.

View file

@ -13,8 +13,14 @@ type Inline struct {
func (kbd *Inline) ToApi() tgbotapi.InlineKeyboardMarkup { func (kbd *Inline) ToApi() tgbotapi.InlineKeyboardMarkup {
rows := [][]tgbotapi.InlineKeyboardButton{} rows := [][]tgbotapi.InlineKeyboardButton{}
for _, row := range kbd.Rows { for _, row := range kbd.Rows {
if row == nil {
continue
}
buttons := []tgbotapi.InlineKeyboardButton{} buttons := []tgbotapi.InlineKeyboardButton{}
for _, button := range row { for _, button := range row {
if button == nil {
continue
}
buttons = append(buttons, button.ToTelegramInline()) buttons = append(buttons, button.ToTelegramInline())
} }
rows = append(rows, buttons) rows = append(rows, buttons)
@ -40,12 +46,24 @@ func (compo *InlineCompo) SendConfig(
} }
func (compo *InlineCompo) Update(c *Context) { func (compo *InlineCompo) Update(c *Context) {
edit := tgbotapi.NewEditMessageTextAndMarkup( var edit tgbotapi.Chattable
c.Session.Id.ToApi(), markup := compo.Inline.ToApi()
compo.Message.MessageID, ln := len(markup.InlineKeyboard)
compo.Text, c.Sendf("%d shit", ln)
compo.Inline.ToApi(), 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) msg, _ := c.Bot.Api.Send(edit)
compo.Message = &msg compo.Message = &msg
} }
@ -66,6 +84,7 @@ func (compo *InlineCompo) Filter(u *Update) bool {
// Implementing the Server interface. // Implementing the Server interface.
func (widget *InlineCompo) Serve(c *Context) { func (widget *InlineCompo) Serve(c *Context) {
btns := widget.ButtonMap()
for u := range c.Input() { for u := range c.Input() {
var act Action var act Action
cb := tgbotapi.NewCallback( cb := tgbotapi.NewCallback(
@ -80,7 +99,6 @@ func (widget *InlineCompo) Serve(c *Context) {
continue continue
} }
btns := widget.ButtonMap()
btn, ok := btns[data] btn, ok := btns[data]
if !ok { if !ok {
continue continue

View file

@ -24,6 +24,17 @@ func NewKeyboard(rows ...ButtonRow) *Keyboard {
return ret 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. // Adds a new button row to the current keyboard.
func (kbd *Keyboard) Row(btns ...*Button) *Keyboard { func (kbd *Keyboard) Row(btns ...*Button) *Keyboard {
// For empty row. We do not need that. // For empty row. We do not need that.
@ -70,9 +81,6 @@ func (kbd *Keyboard) ActionFunc(fn ActionFunc) *Keyboard {
// Returns the map of buttons. Used to define the Action. // Returns the map of buttons. Used to define the Action.
func (kbd Keyboard) ButtonMap() ButtonMap { func (kbd Keyboard) ButtonMap() ButtonMap {
if kbd.buttonMap != nil {
return kbd.buttonMap
}
ret := make(ButtonMap) ret := make(ButtonMap)
for _, vi := range kbd.Rows { for _, vi := range kbd.Rows {
for _, vj := range vi { for _, vj := range vi {

View file

@ -4,6 +4,7 @@ import (
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
//"strings" //"strings"
re "regexp" re "regexp"
"fmt"
) )
type Message = tgbotapi.Message type Message = tgbotapi.Message
@ -42,9 +43,9 @@ func (compo *MessageCompo) SetMessage(msg *Message) {
} }
// Return new message with the specified text. // Return new message with the specified text.
func NewMessage(text string) *MessageCompo { func NewMessage(format string, v ...any) *MessageCompo {
ret := &MessageCompo{} ret := &MessageCompo{}
ret.Text = text ret.Text = fmt.Sprintf(format, v...)
ret.ParseMode = tgbotapi.ModeMarkdown ret.ParseMode = tgbotapi.ModeMarkdown
return ret return ret
} }

View file

@ -36,8 +36,14 @@ func (kbd *Reply) ToApi() any {
rows := [][]tgbotapi.KeyboardButton{} rows := [][]tgbotapi.KeyboardButton{}
for _, row := range kbd.Rows { for _, row := range kbd.Rows {
if row == nil {
continue
}
buttons := []tgbotapi.KeyboardButton{} buttons := []tgbotapi.KeyboardButton{}
for _, button := range row { for _, button := range row {
if button == nil {
continue
}
buttons = append(buttons, button.ToTelegram()) buttons = append(buttons, button.ToTelegram())
} }
rows = append(rows, buttons) rows = append(rows, buttons)

1
ui.go
View file

@ -1,6 +1,5 @@
package tg package tg
// The type describes dynamic screen widget // The type describes dynamic screen widget
// That can have multiple UI components. // That can have multiple UI components.
type Widget interface { type Widget interface {