diff --git a/cmd/test/main.go b/cmd/test/main.go index dd73e3d..e1dce6b 100644 --- a/cmd/test/main.go +++ b/cmd/test/main.go @@ -52,7 +52,7 @@ func ExtractSessionData(c *tg.Context) *SessionData { } var ( - startScreenButton = tg.NewButton("Home").Go("/") + homeButton = tg.NewButton("Home").Go("/") backButton = tg.NewButton("Back").Go("..") backKeyboard = tg.NewKeyboard().Row( backButton, @@ -70,7 +70,7 @@ var ( c.Sendf("%d", d.Counter) }), ).Row( - startScreenButton, + backButton, ) navKeyboard = tg.NewKeyboard().Row( @@ -97,12 +97,7 @@ var ( ) }), ).Row( - startScreenButton, - ).Reply() - - // The keyboard to return to the start screen. - navToStartKeyboard = tg.NewKeyboard().Row( - startScreenButton, + backButton, ).Reply() ) @@ -190,6 +185,10 @@ WithInitFunc(func(c *tg.Context) { ), ), )).WithCommands( + tg.NewCommand("info"). + ActionFunc(func(c *tg.Context){ + c.SendfHTML(`cockcock die`) + }), tg.NewCommand("start"). Desc( "start or restart the bot or move to the start screen", @@ -201,17 +200,16 @@ WithInitFunc(func(c *tg.Context) { }), tg.NewCommand("read"). Desc("reads a string and sends it back"). - WidgetFunc(func(c *tg.Context) { - c.Sendf("Type text and I will send it back to you") - for u := range c.Input() { - if u.Message == nil { - continue - } - c.Sendf("You typed %q", u.Message.Text) - break - } - c.Sendf("Done") - }), + WithWidget( + tg.NewTextMessageRead( + tg.Func(func(c *tg.Context){ + c.Sendf("Type a string and it will send it back") + }), + tg.Func(func(c *tg.Context){ + c.Sendf("You typed %q", c.Message.Text) + }), + ), + ), tg.NewCommand("image"). Desc("sends a sample image"). ActionFunc(func(c *tg.Context) { diff --git a/tg/read.go b/tg/read.go new file mode 100644 index 0000000..e221646 --- /dev/null +++ b/tg/read.go @@ -0,0 +1,52 @@ +package tg + +// The type to descsribe one line reading widget. +type UpdateRead struct { + Pre Action + Filterer Filterer + Post Widget +} + +func (rd *UpdateRead) Filter(u *Update, msgs MessageMap) bool { + if rd.Filterer != nil { + return rd.Filterer.Filter(u, msgs) + } + + return false +} + +// Returns new empty update reader. +func NewUpdateRead(filter Filterer, post Widget) *UpdateRead { + ret := &UpdateRead{} + ret.Filterer = filter + ret.Post = post + return ret +} + +func (rd *UpdateRead) WithPre(a Action) *UpdateRead { + rd.Pre = a + return rd +} + +func NewTextMessageRead(pre Action, post Widget) *UpdateRead { + ret := NewUpdateRead( + FilterFunc(func(u *Update, _ MessageMap) bool { + return u.Message == nil + }), + post, + ).WithPre(pre) + return ret +} + +func (rd *UpdateRead) Serve(c *Context) { + c.Run(rd.Pre, c.Update) + for u := range c.Input() { + if rd.Filter(u, nil) { + continue + } + c.RunWidget(rd.Post, u) + break + } +} + + diff --git a/tg/widget.go b/tg/widget.go index 30c274d..9a4cfd2 100644 --- a/tg/widget.go +++ b/tg/widget.go @@ -36,6 +36,13 @@ type Filterer interface { Filter(*Update, MessageMap) bool } +type FilterFunc func(*Update, MessageMap) bool +func (f FilterFunc) Filter( + u *Update, msgs MessageMap, +) bool { + return f(u, msgs) +} + // General type function for faster typing. type Func func(*Context) func (f Func) Act(c *Context) { @@ -224,6 +231,13 @@ func (widget *ReplyKeyboardWidget) SendConfig( sid SessionId, bot *Bot, ) (*SendConfig) { + if widget == nil { + msgConfig := tgbotapi.NewMessage(sid.ToApi(), ">") + msgConfig.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true) + return &SendConfig{ + Message: &msgConfig, + } + } var text string if widget.Text != "" { text = widget.Text