|
|
@ -5,23 +5,37 @@ import ( |
|
|
|
"strings" |
|
|
|
|
|
|
|
log "github.com/Sirupsen/logrus" |
|
|
|
"github.com/matrix-org/go-neb/matrix" |
|
|
|
"github.com/matrix-org/go-neb/types" |
|
|
|
"github.com/matrix-org/gomatrix" |
|
|
|
) |
|
|
|
|
|
|
|
// ServiceType of the Slack API service
|
|
|
|
const ServiceType = "slackapi" |
|
|
|
|
|
|
|
// Service contains the Config fields for the Slack API service.
|
|
|
|
//
|
|
|
|
// This service will send HTML formatted messages into a room when an outgoing slack webhook
|
|
|
|
// hits WebhookURL.
|
|
|
|
//
|
|
|
|
// Example JSON request:
|
|
|
|
// {
|
|
|
|
// "room_id": "!someroomid:some.domain.com",
|
|
|
|
// "message_type": "m.text"
|
|
|
|
// }
|
|
|
|
type Service struct { |
|
|
|
types.DefaultService |
|
|
|
webhookEndpointURL string |
|
|
|
// The URL which should be given to an outgoing slack webhook - Populated by Go-NEB after Service registration.
|
|
|
|
WebhookURL string `json:"webhook_url"` |
|
|
|
WebhookURL string `json:"webhook_url"` |
|
|
|
RoomID string `json:"room_id"` |
|
|
|
MessageType string `json:"message_type"` |
|
|
|
} |
|
|
|
|
|
|
|
func (s *Service) OnReceiveWebhook(w http.ResponseWriter, req *http.Request, cli *matrix.Client) { |
|
|
|
// OnReceiveWebhook receives requests from a slack outgoing webhook and possibly sends requests
|
|
|
|
// to Matrix as a result.
|
|
|
|
//
|
|
|
|
// This requires that the WebhookURL is given to an outgoing slack webhook (see https://api.slack.com/outgoing-webhooks)
|
|
|
|
func (s *Service) OnReceiveWebhook(w http.ResponseWriter, req *http.Request, cli *gomatrix.Client) { |
|
|
|
segments := strings.Split(req.URL.Path, "/") |
|
|
|
|
|
|
|
if len(segments) < 2 { |
|
|
@ -37,7 +51,7 @@ func (s *Service) OnReceiveWebhook(w http.ResponseWriter, req *http.Request, cli |
|
|
|
|
|
|
|
slackMessage, err := getSlackMessage(*req) |
|
|
|
if err != nil { |
|
|
|
log.WithFields(log.Fields{"slackMessage":slackMessage, log.ErrorKey:err}).Error("Slack message error") |
|
|
|
log.WithFields(log.Fields{"slackMessage": slackMessage, log.ErrorKey: err}).Error("Slack message error") |
|
|
|
w.WriteHeader(500) |
|
|
|
return |
|
|
|
} |
|
|
@ -56,9 +70,9 @@ func (s *Service) OnReceiveWebhook(w http.ResponseWriter, req *http.Request, cli |
|
|
|
} |
|
|
|
|
|
|
|
// Register joins the configured room and sets the public WebhookURL
|
|
|
|
func (s *Service) Register(oldService types.Service, client *matrix.Client) error { |
|
|
|
func (s *Service) Register(oldService types.Service, client *gomatrix.Client) error { |
|
|
|
s.WebhookURL = s.webhookEndpointURL |
|
|
|
if _, err := client.JoinRoom(s.RoomID, "", ""); err != nil { |
|
|
|
if _, err := client.JoinRoom(s.RoomID, "", nil); err != nil { |
|
|
|
log.WithFields(log.Fields{ |
|
|
|
log.ErrorKey: err, |
|
|
|
"room_id": s.RoomID, |
|
|
@ -71,7 +85,7 @@ func (s *Service) Register(oldService types.Service, client *matrix.Client) erro |
|
|
|
func init() { |
|
|
|
types.RegisterService(func(serviceID, serviceUserID, webhookEndpointURL string) types.Service { |
|
|
|
return &Service{ |
|
|
|
DefaultService: types.NewDefaultService(serviceID, serviceUserID, ServiceType), |
|
|
|
DefaultService: types.NewDefaultService(serviceID, serviceUserID, ServiceType), |
|
|
|
webhookEndpointURL: webhookEndpointURL, |
|
|
|
} |
|
|
|
}) |
|
|
|