我想使用ippy04/messengerbot库为 facebook messenger 构建一个机器人。
为了接收新消息,图书馆使用了一个我无法理解的结构。在相关库源文件中定义了以下函数类型(但没有主体):
type MessageReceivedHandler func(*MessengerBot, Event, MessageOpts, ReceivedMessage)
然后这种类型会附加到实际的机器人:
type MessengerBot struct {
MessageReceived MessageReceivedHandler
}
稍后在代码中它被这样调用:
if bot.MessageReceived != nil {
go bot.MessageReceived(bot, entry.Event, message.MessageOpts, *message.Message)
}
现在看来我需要MessageReceivedHandler
在我自己的包中扩展一个实际的主体实现。我尝试了几件事。
在另一个SO 线程之后,我这样做了:
import "github.com/ippy04/messengerbot"
type myMRH messengerbot.MessageReceivedHandler
func (mr myMRH) HRM() {
log.Println("works!")
}
...但该代码永远不会被调用。
我也尝试bot.MessageReceived
像这样扩展(我正在使用 GinGonic)
router.POST("/webhook", func(c *gin.Context) {
bot := messengerbot.NewMessengerBot(os.Getenv("FB_PAGE_ACCESS_TOKEN"), os.Getenv("FB_MESSENGER_VERIFY_TOKEN"))
bot.Debug = true
bot.MessageReceived = func(*MessengerBot, Event, MessageOpts, ReceivedMessage) {
log.Println("works!")
}
bot.Handler(c.Writer, c.Request)
})
但是我不知道从哪里获得必要的函数变量,因为它们没有被库公开。
关于如何实施的任何想法MessageReceivedHandler
?
根据@mykola 的回答,这里是我的问题的完整解决方案:
router.POST("/webhook", func(c *gin.Context) {
bot := messengerbot.NewMessengerBot(os.Getenv("FB_PAGE_ACCESS_TOKEN"), os.Getenv("FB_MESSENGER_VERIFY_TOKEN"))
bot.Debug = true
bot.MessageReceived = func(bot *messengerbot.MessengerBot, evt messengerbot.Event, opts messengerbot.MessageOpts, msg messengerbot.ReceivedMessage) {
log.Println(msg.Message.Text)
}
bot.Handler(c.Writer, c.Request)
})