洞察探索如何利用兼容微信生态的小程序容器,实现跨平台开发,助力金融和车联网行业的数字化转型。
1214
2022-10-27
margelet - 一个用于构建Telegram 机器人的框架
Margelet
Telegram Bot Framework for Go is based on telegram-bot-api
It uses Redis to store it's states, configs and so on.
Any low-level interactions with Telegram Bot API(downloading files, keyboards and so on) should be performed through telegram-bot-api.
Margelet is just a thin layer, that allows you to solve basic bot tasks quickly and easy.
Installation
go get github.com/zhulik/margelet
Simple usage
package mainimport ( "github.com/zhulik/margelet")func main() { bot, err := margelet.NewMargelet("
Out of the box, margelet supports only /help command, it responds something like this
/help - Show bot help
Concept
Margelet is based on some concepts:
Message handlersCommand handlersSession handlersChat configsInline handlers
Message handlers
Message handler is a struct that implements Handler interface. It receives all chat messages dependant on bot's Privacy mode. It doesn't receive commands.
Simple example:
package margelet_testimport ( "../margelet")// EchoHandler is simple handler exampletype EchoHandler struct {}// Response send message back to authorfunc (handler EchoHandler) HandleMessage(m margelet.Message) error { _, err := m.QuickSend(m.Message().Text) return err}
This handler will repeat any user's message back to chat.
Message helpers can be added to margelet with AddMessageHandler function:
bot, err := margelet.NewMargelet("
Command handlers
Command handler is struct that implements CommandHandler interface. CommandHandler can be subscribed on any command you need and will receive all message messages with this command, only if there is no active session with this user in this chat
Simple example:
package margeletimport ( "fmt" "strings")// HelpHandler Default handler for /help command. Margelet will add this automaticallytype HelpHandler struct { Margelet *Margelet}// HandleCommand sends default help messagefunc (handler HelpHandler) HandleCommand(message Message) error { lines := []string{} for command, h := range handler.Margelet.CommandHandlers { lines = append(lines, fmt.Sprintf("/%s - %s", command, h.handler.HelpMessage())) } for command, h := range handler.Margelet.SessionHandlers { lines = append(lines, fmt.Sprintf("/%s - %s", command, h.handler.HelpMessage())) } _, err := message.QuickSend(strings.Join(lines, "\n")) return err}// HelpMessage return help string for HelpHandlerfunc (handler HelpHandler) HelpMessage() string { return "Show bot help"}
Command handlers can be added to margelet with AddCommandHandler function:
bot, err := margelet.NewMargelet("
Session handlers
Session here is an interactive dialog with user, like @BotFather does. User runs session with a command and then response to bot's questions until bot collects all needed information. It can be used for bot configuration, for example.
Session handlers API is still developing
Session handler is struct that implements SessionHandler interface. Simple example:
package margelet_testimport ( "fmt" "strconv" "../margelet" "gopkg.in/telegram-bot-api.v4")// SumSession - simple example session, that can sum numberstype SumSession struct {}// HandleResponse - Handlers user responsefunc (s SumSession) HandleSession(session margelet.Session) error { switch len(session.Responses()) { case 0: session.QuickReply("Hello, please, write one number per message, after some iterations write 'end'.") default: if session.Message().Text == "end" { var sum int for _, m := range session.Responses() { n, _ := strconv.Atoi(m.Text) sum += n } session.QuickReply(fmt.Sprintf("Your sum: %d", sum)) session.Finish() return nil } _, err := strconv.Atoi(session.Message().Text) if err != nil { session.QuickReply("Sorry, not a number") return err } } return nil}// CancelResponse - Chance to clean up everythingfunc (s SumSession) CancelSession(session margelet.Session) { //Clean up all variables only used in the session}func (session SumSession) response(bot margelet.MargeletAPI, message *tgbotapi.Message, msg tgbotapi.MessageConfig) { msg.ChatID = message.Chat.ID msg.ReplyToMessageID = message.MessageID msg.ReplyMarkup = tgbotapi.ForceReply{ForceReply: true, Selective: true} bot.Send(msg)}// HelpMessage return help string for SumSessionfunc (session SumSession) HelpMessage() string { return "Sum your numbers and print result"}
Session handlers can be added to margelet with AddSessionHandler function:
bot, err := margelet.NewMargelet("
On each user response it receives all previous user responses, so you can restore session state. HandleResponse return values it important:
first(bool), means that margelet should finish session, so return true if you receive all needed info from user, false otherwisesecond(err), means that bot cannot handle user's message. This message will not be added to session dialog history. Return any error if you can handle user's message and return nil if message is accepted.
Inline handlers
Inline handler is struct that implements InlineHandler interface. InlineHandler can be subscribed on any inline queries.
Simple example:
package margelet_testimport ( "github.com/zhulik/margelet" "gopkg.in/telegram-bot-api.v4")type InlineImage struct {}func (handler InlineImage) HandleInline(bot margelet.MargeletAPI, query *tgbotapi.InlineQuery) error { testPhotoQuery := tgbotapi.NewInlineQueryResultPhoto(query.ID, "https://telegram.org/img/t_logo.png") testPhotoQuery.ThumbURL = "https://telegram.org/img/t_logo.png" config := tgbotapi.InlineConfig{ InlineQueryID: query.ID, CacheTime: 2, IsPersonal: false, Results: []interface{}{testPhotoQuery}, NextOffset: "", } bot.AnswerInlineQuery(config) return nil}
Inline handler can be added to margelet by InlineHandler assignment:
bot, err := margelet.NewMargelet("
Callback handlers
Callback handler is struct that implements CallbackHandler interface. CallbackHandler can be subscribed on any callback queries.
Simple example:
package margelet_testimport ( "../margelet" "gopkg.in/telegram-bot-api.v4")type CallbackMessage struct {}func (handler CallbackMessage) HandleCallback(query margelet.CallbackQuery) error { config := tgbotapi.CallbackConfig{ CallbackQueryID: query.Query().ID, Text: "Done!", ShowAlert: false, } query.Bot().AnswerCallbackQuery(config) return nil}
Callback handler can be added to margelet by CallbackHandler assignment:
bot, err := margelet.NewMargelet("
Chat configs
Bots can store any config string(you can use serialized JSON) for any chat. It can be used for storing user's configurations and other user-related information. Simple example:
bot, err := margelet.NewMargelet("
Chat config repository can be accessed from session handlers.
Example project
Simple and clean example project can be found here. It provides command handling and session configuration.
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~