forked from lug/matterbridge
		
	
		
			
				
	
	
		
			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)
 | 
						|
}
 |