Skip to content

Commit

Permalink
Added menu example
Browse files Browse the repository at this point in the history
  • Loading branch information
mymmrac committed Aug 1, 2023
1 parent ee83ced commit 8c9c0f1
Show file tree
Hide file tree
Showing 5 changed files with 195 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ More examples can be seen here:
- [Message entities](examples/message_entity/main.go)
- [Multi bot webhook](examples/multi_bot_webhook/main.go)
- [Retry caller](examples/retry_caller/main.go)
- [Menu bot](examples/menu_bot/main.go)

</details>

Expand Down
34 changes: 34 additions & 0 deletions examples/menu_bot/build_local.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//go:build !release

package main

import (
"context"
"log"

"github.com/fasthttp/router"
"github.com/mymmrac/telego"
"github.com/valyala/fasthttp"
"golang.ngrok.com/ngrok"
"golang.ngrok.com/ngrok/config"
)

func Webhook(ctx context.Context, bot *telego.Bot, secret string) (telego.WebhookServer, string) {
tun, err := ngrok.Listen(ctx, config.HTTPEndpoint(config.WithForwardsTo(":8080")))
if err != nil {
log.Fatalf("Ngrok listen: %s", err)
}

srv := &fasthttp.Server{}
return telego.FuncWebhookServer{
Server: telego.FastHTTPWebhookServer{
Logger: bot.Logger(),
Server: srv,
Router: router.New(),
SecretToken: secret,
},
StartFunc: func(_ string) error {
return srv.Serve(tun)
},
}, tun.URL()
}
20 changes: 20 additions & 0 deletions examples/menu_bot/build_release.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//go:build release

package main

import (
"context"

"github.com/fasthttp/router"
"github.com/mymmrac/telego"
"github.com/valyala/fasthttp"
)

func Webhook(_ context.Context, bot *telego.Bot, secret string) (telego.WebhookServer, string) {
return telego.FastHTTPWebhookServer{
Logger: bot.Logger(),
Server: &fasthttp.Server{},
Router: router.New(),
SecretToken: secret,
}, "https://example.org"
}
57 changes: 57 additions & 0 deletions examples/menu_bot/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package main

import (
"log"

"github.com/mymmrac/telego"
th "github.com/mymmrac/telego/telegohandler"
tu "github.com/mymmrac/telego/telegoutil"
)

func RegisterHandlers(bh *th.BotHandler) {
bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
_, err := bot.SendMessage(tu.Message(tu.ID(message.Chat.ID), "Menu").
WithReplyMarkup(tu.Keyboard(
tu.KeyboardRow(
tu.KeyboardButton("Sub menu 1"),
tu.KeyboardButton("Sub menu 2"),
),
tu.KeyboardRow(
tu.KeyboardButton("Sub menu 3"),
),
).WithResizeKeyboard()))
if err != nil {
log.Printf("Error on start: %s", err)
}
}, th.Union(th.CommandEqual("start"), th.TextEqual("Back")))

subMenu := bh.Group(th.TextPrefix("Sub menu"))
subMenu.Use(func(bot *telego.Bot, update telego.Update, next th.Handler) {
log.Println("Sub menu group")
next(bot, update)
})

subMenu.HandleMessage(func(bot *telego.Bot, message telego.Message) {
_, err := bot.SendMessage(tu.Message(tu.ID(message.Chat.ID), "Sub menu 1 content").
WithReplyMarkup(tu.Keyboard(tu.KeyboardRow(tu.KeyboardButton("Back"))).WithResizeKeyboard()))
if err != nil {
log.Printf("Error on sub menu 1: %s", err)
}
}, th.TextSuffix("1"))

subMenu.HandleMessage(func(bot *telego.Bot, message telego.Message) {
_, err := bot.SendMessage(tu.Message(tu.ID(message.Chat.ID), "Sub menu 2 content").
WithReplyMarkup(tu.Keyboard(tu.KeyboardRow(tu.KeyboardButton("Back"))).WithResizeKeyboard()))
if err != nil {
log.Printf("Error on sub menu 2: %s", err)
}
}, th.TextSuffix("2"))

subMenu.HandleMessage(func(bot *telego.Bot, message telego.Message) {
_, err := bot.SendMessage(tu.Message(tu.ID(message.Chat.ID), "Sub menu 3 content").
WithReplyMarkup(tu.Keyboard(tu.KeyboardRow(tu.KeyboardButton("Back"))).WithResizeKeyboard()))
if err != nil {
log.Printf("Error on sub menu 3: %s", err)
}
}, th.TextSuffix("3"))
}
83 changes: 83 additions & 0 deletions examples/menu_bot/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package main

import (
"context"
"crypto/sha256"
"encoding/hex"
"log"
"os"
"os/signal"
"syscall"
"time"

"github.com/mymmrac/telego"
th "github.com/mymmrac/telego/telegohandler"
tu "github.com/mymmrac/telego/telegoutil"
)

func main() {
botToken := os.Getenv("TOKEN")

// Note: Please keep in mind that default logger may expose sensitive information, use in development only
bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
if err != nil {
log.Fatalf("Create bot: %s", err)
}

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

// Note: Creating a secret token like this is not secure,
// but at least better than having a plain bot token as is in requests
secretBytes := sha256.Sum256([]byte(botToken))
secret := hex.EncodeToString(secretBytes[:])

srv, url := Webhook(ctx, bot, secret)

updates, err := bot.UpdatesViaWebhook(
"/bot",
telego.WithWebhookServer(srv),
telego.WithWebhookSet(tu.Webhook(url+"/bot").WithSecretToken(secret)),
telego.WithWebhookContext(ctx),
)
if err != nil {
log.Fatalf("Updates via webhoo: %s", err)
}

bh, err := th.NewBotHandler(bot, updates, th.WithDone(ctx.Done()), th.WithStopTimeout(time.Second*10))
if err != nil {
log.Fatalf("Bot handler: %s", err)
}

RegisterHandlers(bh)

done := make(chan struct{}, 1)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

go func() {
<-sigs
log.Println("Stopping...")

err = bot.StopWebhook()
if err != nil {
log.Println("Failed to stop webhook properly:", err)
}
bh.Stop()

done <- struct{}{}
}()

go bh.Start()
log.Println("Handling updates...")

go func() {
err = bot.StartWebhook(":443")
if err != nil {
log.Fatalf("Failed to start webhook: %s", err)
}
}()

<-done
log.Println("Done")
}

0 comments on commit 8c9c0f1

Please sign in to comment.