71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
|
package gitter
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/mrexodia/wray"
|
||
|
)
|
||
|
|
||
|
type Faye struct {
|
||
|
endpoint string
|
||
|
Event chan Event
|
||
|
client *wray.FayeClient
|
||
|
gitter *Gitter
|
||
|
}
|
||
|
|
||
|
func (gitter *Gitter) Faye(roomID string) *Faye {
|
||
|
wray.RegisterTransports([]wray.Transport{
|
||
|
&wray.HttpTransport{
|
||
|
SendHook: func(data map[string]interface{}) {
|
||
|
if channel, ok := data["channel"]; ok && channel == "/meta/handshake" {
|
||
|
data["ext"] = map[string]interface{}{"token": gitter.config.token}
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
})
|
||
|
return &Faye{
|
||
|
endpoint: "/api/v1/rooms/" + roomID + "/chatMessages",
|
||
|
Event: make(chan Event),
|
||
|
client: wray.NewFayeClient(fayeBaseURL),
|
||
|
gitter: gitter,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (faye *Faye) Listen() {
|
||
|
defer faye.destroy()
|
||
|
|
||
|
faye.client.Subscribe(faye.endpoint, false, func(message wray.Message) {
|
||
|
dataBytes, err := json.Marshal(message.Data["model"])
|
||
|
if err != nil {
|
||
|
fmt.Printf("JSON Marshal error: %v\n", err)
|
||
|
return
|
||
|
}
|
||
|
var gitterMessage Message
|
||
|
err = json.Unmarshal(dataBytes, &gitterMessage)
|
||
|
if err != nil {
|
||
|
fmt.Printf("JSON Unmarshal error: %v\n", err)
|
||
|
return
|
||
|
}
|
||
|
faye.Event <- Event{
|
||
|
Data: &MessageReceived{
|
||
|
Message: gitterMessage,
|
||
|
},
|
||
|
}
|
||
|
})
|
||
|
|
||
|
//TODO: this might be needed in the future
|
||
|
/*go func() {
|
||
|
for {
|
||
|
faye.client.Publish("/api/v1/ping2", map[string]interface{}{"reason": "ping"})
|
||
|
time.Sleep(60 * time.Second)
|
||
|
}
|
||
|
}()*/
|
||
|
|
||
|
faye.client.Listen()
|
||
|
}
|
||
|
|
||
|
func (faye *Faye) destroy() {
|
||
|
close(faye.Event)
|
||
|
}
|