diff options
| author | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
| commit | e9c24f4af7ed56760f6db7941827d09f6db9020b (patch) | |
| tree | 62128c43b883ce5e3148113350978755779bb5de /teleirc/matterbridge/bridge/gitter | |
| parent | 58d5e7cfda4781d8a57ec52aefd02983835c301a (diff) | |
add matterbridge
Diffstat (limited to 'teleirc/matterbridge/bridge/gitter')
| -rw-r--r-- | teleirc/matterbridge/bridge/gitter/gitter.go | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/teleirc/matterbridge/bridge/gitter/gitter.go b/teleirc/matterbridge/bridge/gitter/gitter.go new file mode 100644 index 0000000..486fe43 --- /dev/null +++ b/teleirc/matterbridge/bridge/gitter/gitter.go @@ -0,0 +1,182 @@ +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 +} |
