Remove gitter bridge (#2035)
See https://blog.gitter.im/2023/02/13/gitter-has-fully-migrated-to-matrix/
This commit is contained in:
parent
574f25337d
commit
89b0d362d2
@ -401,7 +401,6 @@ Matterbridge wouldn't exist without these libraries:
|
||||
|
||||
- discord - <https://github.com/bwmarrin/discordgo>
|
||||
- echo - <https://github.com/labstack/echo>
|
||||
- gitter - <https://github.com/sromku/go-gitter>
|
||||
- gops - <https://github.com/google/gops>
|
||||
- gozulipbot - <https://github.com/ifo/gozulipbot>
|
||||
- gumble - <https://github.com/layeh/gumble>
|
||||
|
@ -1,182 +0,0 @@
|
||||
package bgitter
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/42wim/go-gitter"
|
||||
"github.com/42wim/matterbridge/bridge"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
)
|
||||
|
||||
type Bgitter struct {
|
||||
c *gitter.Gitter
|
||||
User *gitter.User
|
||||
Users []gitter.User
|
||||
Rooms []gitter.Room
|
||||
*bridge.Config
|
||||
}
|
||||
|
||||
func New(cfg *bridge.Config) bridge.Bridger {
|
||||
return &Bgitter{Config: cfg}
|
||||
}
|
||||
|
||||
func (b *Bgitter) Connect() error {
|
||||
var err error
|
||||
b.Log.Info("Connecting")
|
||||
b.c = gitter.New(b.GetString("Token"))
|
||||
b.User, err = b.c.GetUser()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.Rooms, err = b.c.GetRooms()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.Log.Info("Connection succeeded")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bgitter) Disconnect() error {
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (b *Bgitter) JoinChannel(channel config.ChannelInfo) error {
|
||||
roomID, err := b.c.GetRoomId(channel.Name)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not find roomID for %v. Please create the room on gitter.im", channel.Name)
|
||||
}
|
||||
room, err := b.c.GetRoom(roomID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.Rooms = append(b.Rooms, *room)
|
||||
user, err := b.c.GetUser()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = b.c.JoinRoom(roomID, user.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
users, _ := b.c.GetUsersInRoom(roomID)
|
||||
b.Users = append(b.Users, users...)
|
||||
stream := b.c.Stream(roomID)
|
||||
go b.c.Listen(stream)
|
||||
|
||||
go func(stream *gitter.Stream, room string) {
|
||||
for event := range stream.Event {
|
||||
switch ev := event.Data.(type) {
|
||||
case *gitter.MessageReceived:
|
||||
// ignore message sent from ourselves
|
||||
if ev.Message.From.ID != b.User.ID {
|
||||
b.Log.Debugf("<= Sending message from %s on %s to gateway", ev.Message.From.Username, b.Account)
|
||||
rmsg := config.Message{Username: ev.Message.From.Username, Text: ev.Message.Text, Channel: room,
|
||||
Account: b.Account, Avatar: b.getAvatar(ev.Message.From.Username), UserID: ev.Message.From.ID,
|
||||
ID: ev.Message.ID}
|
||||
if strings.HasPrefix(ev.Message.Text, "@"+ev.Message.From.Username) {
|
||||
rmsg.Event = config.EventUserAction
|
||||
rmsg.Text = strings.Replace(rmsg.Text, "@"+ev.Message.From.Username+" ", "", -1)
|
||||
}
|
||||
b.Log.Debugf("<= Message is %#v", rmsg)
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
case *gitter.GitterConnectionClosed:
|
||||
b.Log.Errorf("connection with gitter closed for room %s", room)
|
||||
}
|
||||
}
|
||||
}(stream, room.URI)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bgitter) Send(msg config.Message) (string, error) {
|
||||
b.Log.Debugf("=> Receiving %#v", msg)
|
||||
roomID := b.getRoomID(msg.Channel)
|
||||
if roomID == "" {
|
||||
b.Log.Errorf("Could not find roomID for %v", msg.Channel)
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Delete message
|
||||
if msg.Event == config.EventMsgDelete {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
// gitter has no delete message api so we edit message to ""
|
||||
_, err := b.c.UpdateMessage(roomID, msg.ID, "")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Upload a file (in gitter case send the upload URL because gitter has no native upload support)
|
||||
if msg.Extra != nil {
|
||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||
b.c.SendMessage(roomID, rmsg.Username+rmsg.Text)
|
||||
}
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
return b.handleUploadFile(&msg, roomID)
|
||||
}
|
||||
}
|
||||
|
||||
// Edit message
|
||||
if msg.ID != "" {
|
||||
b.Log.Debugf("updating message with id %s", msg.ID)
|
||||
_, err := b.c.UpdateMessage(roomID, msg.ID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Post normal message
|
||||
resp, err := b.c.SendMessage(roomID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.ID, nil
|
||||
}
|
||||
|
||||
func (b *Bgitter) getRoomID(channel string) string {
|
||||
for _, v := range b.Rooms {
|
||||
if v.URI == channel {
|
||||
return v.ID
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (b *Bgitter) getAvatar(user string) string {
|
||||
var avatar string
|
||||
if b.Users != nil {
|
||||
for _, u := range b.Users {
|
||||
if user == u.Username {
|
||||
return u.AvatarURLSmall
|
||||
}
|
||||
}
|
||||
}
|
||||
return avatar
|
||||
}
|
||||
|
||||
func (b *Bgitter) handleUploadFile(msg *config.Message, roomID string) (string, error) {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
if fi.Comment != "" {
|
||||
msg.Text += fi.Comment + ": "
|
||||
}
|
||||
if fi.URL != "" {
|
||||
msg.Text = fi.URL
|
||||
if fi.Comment != "" {
|
||||
msg.Text = fi.Comment + ": " + fi.URL
|
||||
}
|
||||
}
|
||||
_, err := b.c.SendMessage(roomID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
// +build !nogitter
|
||||
|
||||
package bridgemap
|
||||
|
||||
import (
|
||||
bgitter "github.com/42wim/matterbridge/bridge/gitter"
|
||||
)
|
||||
|
||||
func init() {
|
||||
FullMap["gitter"] = bgitter.New
|
||||
}
|
@ -18,8 +18,6 @@ var testconfig = []byte(`
|
||||
server=""
|
||||
[mattermost.test]
|
||||
server=""
|
||||
[gitter.42wim]
|
||||
server=""
|
||||
[discord.test]
|
||||
server=""
|
||||
[slack.test]
|
||||
@ -33,11 +31,6 @@ server=""
|
||||
account = "irc.freenode"
|
||||
channel = "#wimtesting"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="gitter.42wim"
|
||||
channel="42wim/testroom"
|
||||
#channel="matterbridge/Lobby"
|
||||
|
||||
[[gateway.inout]]
|
||||
account = "discord.test"
|
||||
channel = "general"
|
||||
@ -52,8 +45,6 @@ var testconfig2 = []byte(`
|
||||
server=""
|
||||
[mattermost.test]
|
||||
server=""
|
||||
[gitter.42wim]
|
||||
server=""
|
||||
[discord.test]
|
||||
server=""
|
||||
[slack.test]
|
||||
@ -67,10 +58,6 @@ server=""
|
||||
account = "irc.freenode"
|
||||
channel = "#wimtesting"
|
||||
|
||||
[[gateway.in]]
|
||||
account="gitter.42wim"
|
||||
channel="42wim/testroom"
|
||||
|
||||
[[gateway.inout]]
|
||||
account = "discord.test"
|
||||
channel = "general"
|
||||
@ -86,10 +73,6 @@ server=""
|
||||
account = "irc.freenode"
|
||||
channel = "#wimtesting2"
|
||||
|
||||
[[gateway.out]]
|
||||
account="gitter.42wim"
|
||||
channel="42wim/testroom"
|
||||
|
||||
[[gateway.out]]
|
||||
account = "discord.test"
|
||||
channel = "general2"
|
||||
@ -184,31 +167,18 @@ func maketestRouter(input []byte) *Router {
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func TestNewRouter(t *testing.T) {
|
||||
r := maketestRouter(testconfig)
|
||||
assert.Equal(t, 1, len(r.Gateways))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge1"].Bridges))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge1"].Channels))
|
||||
r = maketestRouter(testconfig2)
|
||||
assert.Equal(t, 2, len(r.Gateways))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge2"].Bridges))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge2"].Channels))
|
||||
assert.Equal(t, &config.ChannelInfo{
|
||||
Name: "42wim/testroom",
|
||||
Direction: "out",
|
||||
ID: "42wim/testroomgitter.42wim",
|
||||
Account: "gitter.42wim",
|
||||
SameChannel: map[string]bool{"bridge2": false},
|
||||
}, r.Gateways["bridge2"].Channels["42wim/testroomgitter.42wim"])
|
||||
assert.Equal(t, &config.ChannelInfo{
|
||||
Name: "42wim/testroom",
|
||||
Direction: "in",
|
||||
ID: "42wim/testroomgitter.42wim",
|
||||
Account: "gitter.42wim",
|
||||
SameChannel: map[string]bool{"bridge1": false},
|
||||
}, r.Gateways["bridge1"].Channels["42wim/testroomgitter.42wim"])
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge1"].Bridges))
|
||||
assert.Equal(t, 2, len(r.Gateways["bridge2"].Bridges))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge1"].Channels))
|
||||
assert.Equal(t, 2, len(r.Gateways["bridge2"].Channels))
|
||||
assert.Equal(t, &config.ChannelInfo{
|
||||
Name: "general",
|
||||
Direction: "inout",
|
||||
@ -241,8 +211,6 @@ func TestGetDestChannel(t *testing.T) {
|
||||
SameChannel: map[string]bool{"bridge1": false},
|
||||
Options: config.ChannelOptions{Key: ""},
|
||||
}}, r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
case "gitter.42wim":
|
||||
assert.Equal(t, []config.ChannelInfo(nil), r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
case "irc.freenode":
|
||||
assert.Equal(t, []config.ChannelInfo(nil), r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
}
|
||||
@ -420,6 +388,7 @@ func (s *ignoreTestSuite) SetupSuite() {
|
||||
logger.SetOutput(ioutil.Discard)
|
||||
s.gw = &Gateway{logger: logrus.NewEntry(logger)}
|
||||
}
|
||||
|
||||
func (s *ignoreTestSuite) TestIgnoreTextEmpty() {
|
||||
extraFile := make(map[string][]interface{})
|
||||
extraAttach := make(map[string][]interface{})
|
||||
@ -461,7 +430,6 @@ func (s *ignoreTestSuite) TestIgnoreTextEmpty() {
|
||||
output := s.gw.ignoreTextEmpty(testcase.input)
|
||||
s.Assert().Equalf(testcase.output, output, "case '%s' failed", testname)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *ignoreTestSuite) TestIgnoreTexts() {
|
||||
|
3
go.mod
3
go.mod
@ -1,7 +1,6 @@
|
||||
module github.com/42wim/matterbridge
|
||||
|
||||
require (
|
||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557
|
||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
|
||||
github.com/Benau/tgsconverter v0.0.0-20210809170556-99f4a4f6337f
|
||||
github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560
|
||||
@ -100,8 +99,6 @@ require (
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/monaco-io/request v1.0.5 // indirect
|
||||
github.com/mreiferson/go-httpclient v0.0.0-20201222173833-5e475fde3a4d // indirect
|
||||
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff // indirect
|
||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||
github.com/pborman/uuid v1.2.1 // indirect
|
||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||
|
10
go.sum
10
go.sum
@ -64,8 +64,6 @@ filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5E
|
||||
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
|
||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||
git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557 h1:IZtuWGfzQnKnCSu+vl8WGLhpVQ5Uvy3rlSwqXSg+sQg=
|
||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557/go.mod h1:jL0YSXMs/txjtGJ4PWrmETOk6KUHMDPMshgQZlTeB3Y=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
|
||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||
@ -771,7 +769,6 @@ github.com/gopackage/ddp v0.0.3/go.mod h1:3hUXYG6C/6JsoxKsQaK7st09+GP9RZBFPzyAlU
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20210621113107-84c6004145de/go.mod h1:MtKwTfDNYAP5EtbQSMYjTSqvj1aXJKQRASWq3bwaP+g=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20220221023154-0b2280d3ff96 h1:QJq7UBOuoynsywLk+aC75rC2Cbi2+lQRDaLaizhA+fA=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20220221023154-0b2280d3ff96/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
|
||||
@ -958,7 +955,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
@ -1209,10 +1205,6 @@ github.com/monaco-io/request v1.0.5/go.mod h1:EmggwHktBsbJmCgwZXqy7o0H1NNsAstQBW
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||
github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
|
||||
github.com/mreiferson/go-httpclient v0.0.0-20201222173833-5e475fde3a4d h1:tLWCMSjfL8XyZwpu1RzI2UpJSPbZCOZ6DVHQFnlpL7A=
|
||||
github.com/mreiferson/go-httpclient v0.0.0-20201222173833-5e475fde3a4d/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
|
||||
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff h1:HLGD5/9UxxfEuO9DtP8gnTmNtMxbPyhYltfxsITel8g=
|
||||
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff/go.mod h1:B8jLfIIPn2sKyWr0D7cL2v7tnrDD5z291s2Zypdu89E=
|
||||
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
|
||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
||||
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
|
||||
@ -1522,11 +1514,9 @@ github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7i
|
||||
github.com/slack-go/slack v0.12.1 h1:X97b9g2hnITDtNsNe5GkGx6O2/Sz/uC20ejRZN6QxOw=
|
||||
github.com/slack-go/slack v0.12.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
|
||||
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
|
||||
github.com/snowflakedb/glog v0.0.0-20180824191149-f5055e6f21ce/go.mod h1:EB/w24pR5VKI60ecFnKqXzxX3dOorz1rnVicQTQrGM0=
|
||||
|
@ -513,86 +513,9 @@ ShowTopicChange=false
|
||||
|
||||
###################################################################
|
||||
#Gitter section
|
||||
#Best to make a dedicated gitter account for the bot.
|
||||
#Gitter has been moved to matrix - see https://github.com/42wim/matterbridge/issues/1969 how to migrate
|
||||
###################################################################
|
||||
|
||||
[gitter]
|
||||
|
||||
#You can configure multiple servers "[gitter.name]" or "[gitter.name2]"
|
||||
#In this example we use [gitter.myproject]
|
||||
#REQUIRED
|
||||
[gitter.myproject]
|
||||
#Token to connect with Gitter API
|
||||
#You can get your token by going to https://developer.gitter.im/docs/welcome and SIGN IN
|
||||
#REQUIRED
|
||||
Token="Yourtokenhere"
|
||||
|
||||
## RELOADABLE SETTINGS
|
||||
## Settings below can be reloaded by editing the file
|
||||
|
||||
#Nicks you want to ignore.
|
||||
#Regular expressions supported
|
||||
#Messages from those users will not be sent to other bridges.
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#Extractnicks is used to for example rewrite messages from other relaybots
|
||||
#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
|
||||
#some examples:
|
||||
#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
|
||||
#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
|
||||
#you can use multiple entries for multiplebots
|
||||
#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
|
||||
#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
|
||||
#OPTIONAL (default empty)
|
||||
ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
|
||||
|
||||
#extra label that can be used in the RemoteNickFormat
|
||||
#optional (default empty)
|
||||
Label=""
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#See [general] config section for default options
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Currently works for messages from the following bridges: irc, mattermost, mumble, slack, discord
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
#Enable to show topic changes from other bridges
|
||||
#Only works hiding/show topic changes from slack bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowTopicChange=false
|
||||
|
||||
###################################################################
|
||||
#
|
||||
# Keybase
|
||||
|
3
vendor/github.com/42wim/go-gitter/.gitignore
generated
vendored
3
vendor/github.com/42wim/go-gitter/.gitignore
generated
vendored
@ -1,3 +0,0 @@
|
||||
.idea
|
||||
/test
|
||||
app.yaml
|
201
vendor/github.com/42wim/go-gitter/LICENSE
generated
vendored
201
vendor/github.com/42wim/go-gitter/LICENSE
generated
vendored
@ -1,201 +0,0 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright {yyyy} {name of copyright owner}
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
154
vendor/github.com/42wim/go-gitter/README.md
generated
vendored
154
vendor/github.com/42wim/go-gitter/README.md
generated
vendored
@ -1,154 +0,0 @@
|
||||
# gitter
|
||||
Gitter API in Go
|
||||
https://developer.gitter.im
|
||||
|
||||
#### Install
|
||||
|
||||
`go get github.com/sromku/go-gitter`
|
||||
|
||||
- [Initialize](#initialize)
|
||||
- [Users](#users)
|
||||
- [Rooms](#rooms)
|
||||
- [Messages](#messages)
|
||||
- [Stream](#stream)
|
||||
- [Faye (Experimental)](#faye-experimental)
|
||||
- [Debug](#debug)
|
||||
- [App Engine](#app-engine)
|
||||
|
||||
##### Initialize
|
||||
``` Go
|
||||
api := gitter.New("YOUR_ACCESS_TOKEN")
|
||||
```
|
||||
|
||||
##### Users
|
||||
|
||||
- Get current user
|
||||
|
||||
``` Go
|
||||
user, err := api.GetUser()
|
||||
```
|
||||
|
||||
##### Rooms
|
||||
|
||||
- Get all rooms
|
||||
``` Go
|
||||
rooms, err := api.GetRooms()
|
||||
```
|
||||
|
||||
- Get room by id
|
||||
``` Go
|
||||
room, err := api.GetRoom("roomID")
|
||||
```
|
||||
|
||||
- Get rooms of some user
|
||||
``` Go
|
||||
rooms, err := api.GetRooms("userID")
|
||||
```
|
||||
|
||||
- Join room
|
||||
``` Go
|
||||
room, err := api.JoinRoom("roomID", "userID")
|
||||
```
|
||||
|
||||
- Leave room
|
||||
``` Go
|
||||
room, err := api.LeaveRoom("roomID", "userID")
|
||||
```
|
||||
|
||||
- Get room id
|
||||
``` Go
|
||||
id, err := api.GetRoomId("room/uri")
|
||||
```
|
||||
|
||||
- Search gitter rooms
|
||||
``` Go
|
||||
rooms, err := api.SearchRooms("search/string")
|
||||
```
|
||||
##### Messages
|
||||
|
||||
- Get messages of room
|
||||
``` Go
|
||||
messages, err := api.GetMessages("roomID", nil)
|
||||
```
|
||||
|
||||
- Get one message
|
||||
``` Go
|
||||
message, err := api.GetMessage("roomID", "messageID")
|
||||
```
|
||||
|
||||
- Send message
|
||||
``` Go
|
||||
err := api.SendMessage("roomID", "free chat text")
|
||||
```
|
||||
|
||||
##### Stream
|
||||
|
||||
Create stream to the room and start listening to incoming messages
|
||||
|
||||
``` Go
|
||||
stream := api.Stream(room.Id)
|
||||
go api.Listen(stream)
|
||||
|
||||
for {
|
||||
event := <-stream.Event
|
||||
switch ev := event.Data.(type) {
|
||||
case *gitter.MessageReceived:
|
||||
fmt.Println(ev.Message.From.Username + ": " + ev.Message.Text)
|
||||
case *gitter.GitterConnectionClosed:
|
||||
// connection was closed
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Close stream connection
|
||||
|
||||
``` Go
|
||||
stream.Close()
|
||||
```
|
||||
|
||||
##### Faye (Experimental)
|
||||
|
||||
``` Go
|
||||
faye := api.Faye(room.ID)
|
||||
go faye.Listen()
|
||||
|
||||
for {
|
||||
event := <-faye.Event
|
||||
switch ev := event.Data.(type) {
|
||||
case *gitter.MessageReceived:
|
||||
fmt.Println(ev.Message.From.Username + ": " + ev.Message.Text)
|
||||
case *gitter.GitterConnectionClosed: //this one is never called in Faye
|
||||
// connection was closed
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### Debug
|
||||
|
||||
You can print the internal errors by enabling debug to true
|
||||
|
||||
``` Go
|
||||
api.SetDebug(true, nil)
|
||||
```
|
||||
|
||||
You can also define your own `io.Writer` in case you want to persist the logs somewhere.
|
||||
For example keeping the errors on file
|
||||
|
||||
``` Go
|
||||
logFile, err := os.Create("gitter.log")
|
||||
api.SetDebug(true, logFile)
|
||||
```
|
||||
|
||||
##### App Engine
|
||||
|
||||
Initialize app engine client and continue as usual
|
||||
|
||||
``` Go
|
||||
c := appengine.NewContext(r)
|
||||
client := urlfetch.Client(c)
|
||||
|
||||
api := gitter.New("YOUR_ACCESS_TOKEN")
|
||||
api.SetClient(client)
|
||||
```
|
||||
|
||||
[Documentation](https://godoc.org/github.com/sromku/go-gitter)
|
70
vendor/github.com/42wim/go-gitter/faye.go
generated
vendored
70
vendor/github.com/42wim/go-gitter/faye.go
generated
vendored
@ -1,70 +0,0 @@
|
||||
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)
|
||||
}
|
527
vendor/github.com/42wim/go-gitter/gitter.go
generated
vendored
527
vendor/github.com/42wim/go-gitter/gitter.go
generated
vendored
@ -1,527 +0,0 @@
|
||||
// Package gitter is a Go client library for the Gitter API.
|
||||
//
|
||||
// Author: sromku
|
||||
package gitter
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/mreiferson/go-httpclient"
|
||||
)
|
||||
|
||||
var (
|
||||
apiBaseURL = "https://api.gitter.im/v1/"
|
||||
streamBaseURL = "https://stream.gitter.im/v1/"
|
||||
fayeBaseURL = "https://ws.gitter.im/faye"
|
||||
)
|
||||
|
||||
type Gitter struct {
|
||||
config struct {
|
||||
apiBaseURL string
|
||||
streamBaseURL string
|
||||
token string
|
||||
client *http.Client
|
||||
}
|
||||
debug bool
|
||||
logWriter io.Writer
|
||||
}
|
||||
|
||||
// New initializes the Gitter API client
|
||||
//
|
||||
// For example:
|
||||
// api := gitter.New("YOUR_ACCESS_TOKEN")
|
||||
func New(token string) *Gitter {
|
||||
|
||||
transport := &httpclient.Transport{
|
||||
ConnectTimeout: 5 * time.Second,
|
||||
ReadWriteTimeout: 40 * time.Second,
|
||||
}
|
||||
defer transport.Close()
|
||||
|
||||
s := &Gitter{}
|
||||
s.config.apiBaseURL = apiBaseURL
|
||||
s.config.streamBaseURL = streamBaseURL
|
||||
s.config.token = token
|
||||
s.config.client = &http.Client{
|
||||
Transport: transport,
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// SetClient sets a custom http client. Can be useful in App Engine case.
|
||||
func (gitter *Gitter) SetClient(client *http.Client) {
|
||||
gitter.config.client = client
|
||||
}
|
||||
|
||||
// GetUser returns the current user
|
||||
func (gitter *Gitter) GetUser() (*User, error) {
|
||||
|
||||
var users []User
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "user")
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &users)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(users) > 0 {
|
||||
return &users[0], nil
|
||||
}
|
||||
|
||||
err = APIError{What: "Failed to retrieve current user"}
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// GetUserRooms returns a list of Rooms the user is part of
|
||||
func (gitter *Gitter) GetUserRooms(userID string) ([]Room, error) {
|
||||
|
||||
var rooms []Room
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "user/" + userID + "/rooms")
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &rooms)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rooms, nil
|
||||
}
|
||||
|
||||
// GetRooms returns a list of rooms the current user is in
|
||||
func (gitter *Gitter) GetRooms() ([]Room, error) {
|
||||
|
||||
var rooms []Room
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms")
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &rooms)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rooms, nil
|
||||
}
|
||||
|
||||
// GetUsersInRoom returns the users in the room with the passed id
|
||||
func (gitter *Gitter) GetUsersInRoom(roomID string) ([]User, error) {
|
||||
var users []User
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms/" + roomID + "/users")
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &users)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
return users, nil
|
||||
}
|
||||
|
||||
// GetRoom returns a room with the passed id
|
||||
func (gitter *Gitter) GetRoom(roomID string) (*Room, error) {
|
||||
|
||||
var room Room
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms/" + roomID)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &room)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &room, nil
|
||||
}
|
||||
|
||||
// GetMessages returns a list of messages in a room.
|
||||
// Pagination is optional. You can pass nil or specific pagination params.
|
||||
func (gitter *Gitter) GetMessages(roomID string, params *Pagination) ([]Message, error) {
|
||||
|
||||
var messages []Message
|
||||
url := gitter.config.apiBaseURL + "rooms/" + roomID + "/chatMessages"
|
||||
if params != nil {
|
||||
url += "?" + params.encode()
|
||||
}
|
||||
response, err := gitter.get(url)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &messages)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return messages, nil
|
||||
}
|
||||
|
||||
// GetMessage returns a message in a room.
|
||||
func (gitter *Gitter) GetMessage(roomID, messageID string) (*Message, error) {
|
||||
|
||||
var message Message
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms/" + roomID + "/chatMessages/" + messageID)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &message)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &message, nil
|
||||
}
|
||||
|
||||
// SendMessage sends a message to a room
|
||||
func (gitter *Gitter) SendMessage(roomID, text string) (*Message, error) {
|
||||
|
||||
message := Message{Text: text}
|
||||
body, _ := json.Marshal(message)
|
||||
response, err := gitter.post(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages", body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &message)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &message, nil
|
||||
}
|
||||
|
||||
// UpdateMessage updates a message in a room
|
||||
func (gitter *Gitter) UpdateMessage(roomID, msgID, text string) (*Message, error) {
|
||||
|
||||
message := Message{Text: text}
|
||||
body, _ := json.Marshal(message)
|
||||
response, err := gitter.put(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages/"+msgID, body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &message)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &message, nil
|
||||
}
|
||||
|
||||
// JoinRoom joins a room
|
||||
func (gitter *Gitter) JoinRoom(roomID, userID string) (*Room, error) {
|
||||
|
||||
message := Room{ID: roomID}
|
||||
body, _ := json.Marshal(message)
|
||||
response, err := gitter.post(gitter.config.apiBaseURL+"user/"+userID+"/rooms", body)
|
||||
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var room Room
|
||||
err = json.Unmarshal(response, &room)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &room, nil
|
||||
}
|
||||
|
||||
// LeaveRoom removes a user from the room
|
||||
func (gitter *Gitter) LeaveRoom(roomID, userID string) error {
|
||||
|
||||
_, err := gitter.delete(gitter.config.apiBaseURL + "rooms/" + roomID + "/users/" + userID)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetDebug traces errors if it's set to true.
|
||||
func (gitter *Gitter) SetDebug(debug bool, logWriter io.Writer) {
|
||||
gitter.debug = debug
|
||||
gitter.logWriter = logWriter
|
||||
}
|
||||
|
||||
// SearchRooms queries the Rooms resources of gitter API
|
||||
func (gitter *Gitter) SearchRooms(room string) ([]Room, error) {
|
||||
|
||||
var rooms struct {
|
||||
Results []Room `json:"results"`
|
||||
}
|
||||
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms?q=" + room)
|
||||
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &rooms)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
return rooms.Results, nil
|
||||
}
|
||||
|
||||
// GetRoomId returns the room ID of a given URI
|
||||
func (gitter *Gitter) GetRoomId(uri string) (string, error) {
|
||||
|
||||
rooms, err := gitter.SearchRooms(uri)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
for _, element := range rooms {
|
||||
if element.URI == uri {
|
||||
return element.ID, nil
|
||||
}
|
||||
}
|
||||
return "", APIError{What: "Room not found."}
|
||||
}
|
||||
|
||||
// Pagination params
|
||||
type Pagination struct {
|
||||
|
||||
// Skip n messages
|
||||
Skip int
|
||||
|
||||
// Get messages before beforeId
|
||||
BeforeID string
|
||||
|
||||
// Get messages after afterId
|
||||
AfterID string
|
||||
|
||||
// Maximum number of messages to return
|
||||
Limit int
|
||||
|
||||
// Search query
|
||||
Query string
|
||||
}
|
||||
|
||||
func (messageParams *Pagination) encode() string {
|
||||
values := url.Values{}
|
||||
|
||||
if messageParams.AfterID != "" {
|
||||
values.Add("afterId", messageParams.AfterID)
|
||||
}
|
||||
|
||||
if messageParams.BeforeID != "" {
|
||||
values.Add("beforeId", messageParams.BeforeID)
|
||||
}
|
||||
|
||||
if messageParams.Skip > 0 {
|
||||
values.Add("skip", strconv.Itoa(messageParams.Skip))
|
||||
}
|
||||
|
||||
if messageParams.Limit > 0 {
|
||||
values.Add("limit", strconv.Itoa(messageParams.Limit))
|
||||
}
|
||||
|
||||
return values.Encode()
|
||||
}
|
||||
|
||||
func (gitter *Gitter) getResponse(url string, stream *Stream) (*http.Response, error) {
|
||||
r, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
r.Header.Set("Content-Type", "application/json")
|
||||
r.Header.Set("Accept", "application/json")
|
||||
r.Header.Set("Authorization", "Bearer "+gitter.config.token)
|
||||
if stream != nil {
|
||||
stream.streamConnection.request = r
|
||||
}
|
||||
response, err := gitter.config.client.Do(r)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) get(url string) ([]byte, error) {
|
||||
resp, err := gitter.getResponse(url, nil)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) post(url string, body []byte) ([]byte, error) {
|
||||
r, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r.Header.Set("Content-Type", "application/json")
|
||||
r.Header.Set("Accept", "application/json")
|
||||
r.Header.Set("Authorization", "Bearer "+gitter.config.token)
|
||||
|
||||
resp, err := gitter.config.client.Do(r)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) put(url string, body []byte) ([]byte, error) {
|
||||
r, err := http.NewRequest("PUT", url, bytes.NewBuffer(body))
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r.Header.Set("Content-Type", "application/json")
|
||||
r.Header.Set("Accept", "application/json")
|
||||
r.Header.Set("Authorization", "Bearer "+gitter.config.token)
|
||||
|
||||
resp, err := gitter.config.client.Do(r)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) delete(url string) ([]byte, error) {
|
||||
r, err := http.NewRequest("delete", url, nil)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r.Header.Set("Content-Type", "application/json")
|
||||
r.Header.Set("Accept", "application/json")
|
||||
r.Header.Set("Authorization", "Bearer "+gitter.config.token)
|
||||
|
||||
resp, err := gitter.config.client.Do(r)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) log(a interface{}) {
|
||||
if gitter.debug {
|
||||
log.Println(a)
|
||||
if gitter.logWriter != nil {
|
||||
timestamp := time.Now().Format(time.RFC3339)
|
||||
msg := fmt.Sprintf("%v: %v", timestamp, a)
|
||||
fmt.Fprintln(gitter.logWriter, msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// APIError holds data of errors returned from the API.
|
||||
type APIError struct {
|
||||
What string
|
||||
}
|
||||
|
||||
func (e APIError) Error() string {
|
||||
return fmt.Sprintf("%v", e.What)
|
||||
}
|
142
vendor/github.com/42wim/go-gitter/model.go
generated
vendored
142
vendor/github.com/42wim/go-gitter/model.go
generated
vendored
@ -1,142 +0,0 @@
|
||||
package gitter
|
||||
|
||||
import "time"
|
||||
|
||||
// A Room in Gitter can represent a GitHub Organization, a GitHub Repository, a Gitter Channel or a One-to-one conversation.
|
||||
// In the case of the Organizations and Repositories, the access control policies are inherited from GitHub.
|
||||
type Room struct {
|
||||
|
||||
// Room ID
|
||||
ID string `json:"id"`
|
||||
|
||||
// Room name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Room topic. (default: GitHub repo description)
|
||||
Topic string `json:"topic"`
|
||||
|
||||
// Room URI on Gitter
|
||||
URI string `json:"uri"`
|
||||
|
||||
// Indicates if the room is a one-to-one chat
|
||||
OneToOne bool `json:"oneToOne"`
|
||||
|
||||
// Count of users in the room
|
||||
UserCount int `json:"userCount"`
|
||||
|
||||
// Number of unread messages for the current user
|
||||
UnreadItems int `json:"unreadItems"`
|
||||
|
||||
// Number of unread mentions for the current user
|
||||
Mentions int `json:"mentions"`
|
||||
|
||||
// Last time the current user accessed the room in ISO format
|
||||
LastAccessTime time.Time `json:"lastAccessTime"`
|
||||
|
||||
// Indicates if the current user has disabled notifications
|
||||
Lurk bool `json:"lurk"`
|
||||
|
||||
// Path to the room on gitter
|
||||
URL string `json:"url"`
|
||||
|
||||
// Type of the room
|
||||
// - ORG: A room that represents a GitHub Organization.
|
||||
// - REPO: A room that represents a GitHub Repository.
|
||||
< |