2017-01-29 1 views
1

ippy04/messengerbot 사용자에게 facebook 메신저 용 로봇을 구축하고 싶습니다.golang에서 본문없이 기능을 확장하는 방법

새 메시지를 받기 위해 라이브러리는 머리를 감쌀 수없는 구조를 사용합니다. 다음 함수 유형은 관련 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을 확장해야 할 것 같습니다. 나는 몇 가지 시도했다.

내가 이런 짓을 또 다른 SO thread 다음

:

import "github.com/ippy04/messengerbot" 
type myMRH messengerbot.MessageReceivedHandler 
func (mr myMRH) HRM() { 
    log.Println("works!") 
} 

...하지만 그 코드는 절대 호출되지됩니다.

또한 나는 (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) 
}) 

을 같은 bot.MessageReceived을 확장하려하지만 그때 나는 어디에 그들이 enot 라이브러리에 의해 노출 아칸소 이후에서 필요한 기능 변수를 얻는 아무 생각이 없습니다.

그 구현 방법에 대한 아이디어는 MessageReceivedHandler입니까?

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) 
}) 

답변

2

사람이 어딘가에 messengerbot.MessageReceivedHandler에서 파생 된 새로운 유형을 선언했다는 사실은하지 않습니다하고해야하지 : 여기 @mykola의 답변에 따라


내 문제에 대한 완벽한 솔루션입니다 봇 라이브러리 자체에 영향을 미칩니다. 당신이 필요로하는 무엇

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

P.S.을 수행하여 나중에 직접 인스턴스화, 또는에 의해 어느 건설 지점에서 봇의 핸들러를 설정하는 것입니다 tour of go을 아직 확인하지 않았 으면 확인하십시오. 이동에 대한 기본 개념을 놓치고있는 것처럼 보입니다.

+0

포인터 주셔서 감사합니다. 나는 그것을 이미 시도했지만 함수 매개 변수를 채우기 위해 필요한 변수에 액세스 할 수 없음을 발견했습니다. 내 주요 질문에 추가하겠습니다. 여행은 물론 갔다. 그러나 그것은 얼마 전에 있었다.) 내가 새롭게 할 것이다라고 생각해라. 사실 내 문제에 대한 힌트를 찾기 위해 어제 그것을 살펴 봤지만 사건에 맞는 것을 만들 수 없었다. 인터페이스에 대한 장이 여기에 적용되지 않은 것 같습니다. – perelin

+0

변수는 라이브러리에 의해 콜백으로 전송됩니다. 예제를 확장하여 명확하게했습니다. –

+0

알았어요. 추가해야 할 것은 라이브러리 패키지에서 유형을 가져 오는 것뿐이었습니다. 고마워! – perelin

관련 문제