1

我想使用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)
})
4

1 回答 1

2

某个地方的某个人声明了一个派生自的新类型这一事实messengerbot.MessageReceivedHandler不会也不应该对机器人库本身产生任何影响。

您需要的是在构造点设置机器人的处理程序,通过自己实例化它,或者稍后通过执行

bot.MessageReceived = func(bot *MessengerBot, evt Event, opts MessageOpts, msg ReceivedMessage) {
  log.Println("works!", msg)
}

PS如果您还没有,您可能想查看go 的导览,因为您似乎错过了使用 go 的一些基本概念。

于 2017-01-29T10:18:14.563 回答