我想使用ippy04/messengerbot库为facebook messenger构建机器人。
为了接收新消息,库使用了一个我无法解决的构造。在相关library source file中定义了以下函数类型(但没有正文):
type MessageReceivedHandler func(*MessengerBot, Event, MessageOpts, ReceivedMessage)
这种类型然后gets attached到实际的机器人:
type MessengerBot struct {
MessageReceived MessageReceivedHandler
}
稍后在代码it gets called中这样:
if bot.MessageReceived != nil {
go bot.MessageReceived(bot, entry.Event, message.MessageOpts, *message.Message)
}
现在看来我需要在我自己的包中扩展MessageReceivedHandler
实际的body实现。我试了几件事。
继SO thread后,我做了这个:
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)
})
答案 0 :(得分:2)
事实上,某个人声称从int peekc(FILE *fp) {
int c = getc(fp);
if (c != EOF)
ungetc(c, fp);
return c;
}
void rcomment(int c, FILE *fp) {
int d;
if (c == '/') {
if ((d = getc(fp)) == '*') {
incomment(fp);
} else
if (d == '/') {
while ((c = getc(fp)) != EOF && c != '\n') {
if (c == '\\' && peekc(fp) == '\n') {
putchar(getc(fp));
}
}
putchar('\n');
} else {
putchar(c);
ungetc(d, fp);
}
} else
if (c == '\'' || c == '"') {
echo_quote(c, fp);
} else {
putchar(c);
}
}
派生的新类型不会也不会对机器人库本身产生任何影响。
你需要的是在构造点设置机器人的处理程序,通过自己实例化,或者稍后通过
实例化messengerbot.MessageReceivedHandler
P.S。如果你还没有,你可能想查看tour of go,因为你似乎错过了使用go的一些基本概念。