Added arguments to screen change making it easier to define widget behaviour both for screens and commands.
This commit is contained in:
parent
d500d84de6
commit
5e1faf0c44
2 changed files with 16 additions and 13 deletions
|
@ -27,6 +27,9 @@ func NewMutateMessageWidget(fn func(string) string) *MutateMessageWidget {
|
|||
}
|
||||
|
||||
func (w *MutateMessageWidget) Serve(c *tg.Context, updates chan *tg.Update) error {
|
||||
for _, arg := range c.Args {
|
||||
c.Sendf("%v", arg)
|
||||
}
|
||||
for u := range updates {
|
||||
if u.Message == nil {
|
||||
continue
|
||||
|
@ -65,7 +68,9 @@ var (
|
|||
Row(
|
||||
tg.NewButton("Inc/Dec").ScreenChange("start/inc-dec"),
|
||||
).Row(
|
||||
tg.NewButton("Upper case").ScreenChange("start/upper-case"),
|
||||
tg.NewButton("Upper case").ActionFunc(func(c *tg.Context){
|
||||
c.ChangeScreen("start/upper-case", "this shit", "works")
|
||||
}),
|
||||
tg.NewButton("Lower case").ScreenChange("start/lower-case"),
|
||||
).Row(
|
||||
tg.NewButton("Send location").ScreenChange("start/send-location"),
|
||||
|
@ -109,7 +114,6 @@ var beh = tg.NewBehaviour().
|
|||
WithInitFunc(func(c *tg.Context) {
|
||||
// The session initialization.
|
||||
c.Session.Data = &SessionData{}
|
||||
|
||||
}).WithScreens(
|
||||
tg.NewScreen("start", tg.NewPage(
|
||||
"The bot started!",
|
||||
|
@ -175,6 +179,7 @@ var beh = tg.NewBehaviour().
|
|||
tg.NewCommand("start").
|
||||
Desc("start or restart the bot or move to the start screen").
|
||||
ActionFunc(func(c *tg.Context){
|
||||
c.Sendf("Your username is %q", c.Message.From.UserName)
|
||||
c.ChangeScreen("start")
|
||||
}),
|
||||
tg.NewCommand("hello").
|
||||
|
|
|
@ -86,8 +86,9 @@ type Context struct {
|
|||
// The update that called the Context usage.
|
||||
*Update
|
||||
// Used as way to provide outer values redirection
|
||||
// into widgets and actions
|
||||
Arg any
|
||||
// into widgets and actions. It is like arguments
|
||||
// for REST API request etc.
|
||||
Args []any
|
||||
}
|
||||
|
||||
// Customized actions for the bot.
|
||||
|
@ -117,18 +118,11 @@ func (sc ScreenChange) Act(c *Context) {
|
|||
type C = Context
|
||||
|
||||
// Changes screen of user to the Id one.
|
||||
func (c *Context) ChangeScreen(screenId ScreenId) error {
|
||||
func (c *Context) ChangeScreen(screenId ScreenId, args ...any) error {
|
||||
if !c.Bot.behaviour.ScreenExist(screenId) {
|
||||
return ScreenNotExistErr
|
||||
}
|
||||
|
||||
// Stop the reading by sending the nil,
|
||||
// since we change the screen and
|
||||
// current goroutine needs to be stopped.
|
||||
// if c.readingUpdate {
|
||||
// c.Updates <- nil
|
||||
// }
|
||||
|
||||
// Getting the screen and changing to
|
||||
// then executing its widget.
|
||||
screen := c.Bot.behaviour.Screens[screenId]
|
||||
|
@ -143,7 +137,11 @@ func (c *Context) ChangeScreen(screenId ScreenId) error {
|
|||
if screen.Widget != nil {
|
||||
// Running the widget if the screen has one.
|
||||
go func() {
|
||||
screen.Widget.Serve(c, c.skippedUpdates)
|
||||
screen.Widget.Serve(&Context{
|
||||
context: c.context,
|
||||
Update: c.Update,
|
||||
Args: args,
|
||||
}, c.skippedUpdates)
|
||||
}()
|
||||
} else {
|
||||
panic("no widget defined for the screen")
|
||||
|
|
Loading…
Reference in a new issue