-
-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
195 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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")) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") | ||
} |