Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 8f45f605875dc6fc8edce054ad3310aa78269237 Author: Wim <wim@42.be> Date: Sat Aug 12 14:51:41 2017 +0000 Allow a webhookurl per channel (discord). #239 diff --git a/bridge/api/api.go b/bridge/api/api.go index 26ff332..196be18 100644 --- a/bridge/api/api.go +++ b/bridge/api/api.go @@ -617 +617 @@ func (b *Api) Disconnect() error {   return nil    } -func (b *Api) JoinChannel(channel string) error { +func (b *Api) JoinChannel(channel config.ChannelInfo) error {   return nil    } diff --git a/bridge/bridge.go b/bridge/bridge.go index 8e0fe06..2fe0f07 100644 --- a/bridge/bridge.go +++ b/bridge/bridge.go @@ -217 +217 @@ import (  type Bridger interface {   Send(msg config.Message) error   Connect() error - JoinChannel(channel string) error + JoinChannel(channel config.ChannelInfo) error   Disconnect() error  }   @@ -9216 +9210 @@ func (b *Bridge) JoinChannels() error {  }    func (b *Bridge) joinChannels(channels map[string]config.ChannelInfo, exists map[string]bool) error { - mychannel := ""   for ID, channel := range channels {   if !exists[ID] { - mychannel = channel.Name   log.Infof("%s: joining %s (%s)", b.Account, channel.Name, ID) - if b.Protocol == "irc" && channel.Options.Key != "" { - log.Debugf("using key %s for channel %s", channel.Options.Key, channel.Name) - mychannel = mychannel + " " + channel.Options.Key - } - err := b.JoinChannel(mychannel) + err := b.JoinChannel(channel)   if err != nil {   return err   } diff --git a/bridge/config/config.go b/bridge/config/config.go index a90cb9a..ae93791 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -857 +858 @@ type Protocol struct {  }    type ChannelOptions struct { - Key string // irc + Key string // irc + WebhookURL string // discord  }    type Bridge struct { diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index 4b32565..2868eeb 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -1017 +1018 @@ import (  )    type bdiscord struct { - c *discordgo.Session - Config *config.Protocol - Remote chan config.Message - Account string - Channels []*discordgo.Channel - Nick string - UseChannelID bool - userMemberMap map[string]*discordgo.Member - guildID string - webhookID string - webhookToken string + c *discordgo.Session + Config *config.Protocol + Remote chan config.Message + Account string + Channels []*discordgo.Channel + Nick string + UseChannelID bool + userMemberMap map[string]*discordgo.Member + guildID string + webhookID string + webhookToken string + channelInfoMap map[string]*config.ChannelInfo   sync.RWMutex  }   @@ -3711 +3810 @@ func New(cfg config.Protocol, account string, c chan config.Message) *bdiscord {   b.Remote = c   b.Account = account   b.userMemberMap = make(map[string]*discordgo.Member) + b.channelInfoMap = make(map[string]*config.ChannelInfo)   if b.Config.WebhookURL != "" {   flog.Debug("Configuring Discord Incoming Webhook") - webhookURLSplit := strings.Split(b.Config.WebhookURL, "/") - b.webhookToken = webhookURLSplit[len(webhookURLSplit)-1] - b.webhookID = webhookURLSplit[len(webhookURLSplit)-2] + b.webhookToken, b.webhookID = b.splitURL(b.Config.WebhookURL)   }   return b  } @@ -998 +999 @@ func (b *bdiscord) Disconnect() error {   return nil  }   -func (b *bdiscord) JoinChannel(channel string) error { - idcheck := strings.Split(channel, "ID:") +func (b *bdiscord) JoinChannel(channel config.ChannelInfo) error { + b.channelInfoMap[channel.ID] = &channel + idcheck := strings.Split(channel.Name, "ID:")   if len(idcheck) > 1 {   b.UseChannelID = true   } @@ -11714 +11823 @@ func (b *bdiscord) Send(msg config.Message) error {   if msg.Event == config.EVENT_USER_ACTION {   msg.Text = "_" + msg.Text + "_"   } - if b.Config.WebhookURL == "" { + + wID := b.webhookID + wToken := b.webhookToken + if ci, ok := b.channelInfoMap[msg.Channel+msg.Account]; ok { + if ci.Options.WebhookURL != "" { + wID, wToken = b.splitURL(ci.Options.WebhookURL) + } + } + + if wID == "" {   flog.Debugf("Broadcasting using token (API)")   b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)   } else { - flog.Debugf("Broadcasting using Webhook") + flog.Debugf("Broadcasting using Webhook %#v %#v", wID, wToken)   b.c.WebhookExecute( - b.webhookID, - b.webhookToken, + wID, + wToken,   true,   &discordgo.WebhookParams{   Content: msg.Text, @@ -1537 +1637 @@ func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat   return   }   // if using webhooks, do not relay if it's ours - if b.Config.WebhookURL != "" && m.Author.Bot && m.Author.ID == b.webhookID { + if b.useWebhook() && m.Author.Bot && b.isWebhookID(m.Author.ID) {   return   }   @@ -3103 +32035 @@ func (b *bdiscord) stripCustomoji(text string) string {   re := regexp.MustCompile("<(:.*?:)[0-9]+>")   return re.ReplaceAllString(text, `$1`)  } + +// splitURL splits a webhookURL and returns the id and token +func (b *bdiscord) splitURL(url string) (string, string) { + webhookURLSplit := strings.Split(url, "/") + return webhookURLSplit[len(webhookURLSplit)-2], webhookURLSplit[len(webhookURLSplit)-1] +} + +// useWebhook returns true if we have a webhook defined somewhere +func (b *bdiscord) useWebhook() bool { + if b.Config.WebhookURL != "" { + return true + } + for _, channel := range b.channelInfoMap { + if channel.Options.WebhookURL != "" { + return true + } + } + return false +} + +// isWebhookID returns true if the specified id is used in a defined webhook +func (b *bdiscord) isWebhookID(id string) bool { + for _, channel := range b.channelInfoMap { + if channel.Options.WebhookURL != "" { + wID, _ := b.splitURL(channel.Options.WebhookURL) + if wID == id { + return true + } + } + } + return false +} diff --git a/bridge/gitter/gitter.go b/bridge/gitter/gitter.go index 0b8667e..f234b6b 100644 --- a/bridge/gitter/gitter.go +++ b/bridge/gitter/gitter.go @@ -5110 +5110 @@ func (b *Bgitter) Disconnect() error {    }   -func (b *Bgitter) JoinChannel(channel string) error { - roomID, err := b.c.GetRoomId(channel) +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) + 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 { diff --git a/bridge/irc/irc.go b/bridge/irc/irc.go index aa46a6f..6e5839b 100644 --- a/bridge/irc/irc.go +++ b/bridge/irc/irc.go @@ -1178 +11713 @@ func (b *Birc) Disconnect() error {   return nil  }   -func (b *Birc) JoinChannel(channel string) error { - b.i.Join(channel) +func (b *Birc) JoinChannel(channel config.ChannelInfo) error { + if channel.Options.Key != "" { + flog.Debugf("using key %s for channel %s", channel.Options.Key, channel.Name) + b.i.Join(channel.Name + " " + channel.Options.Key) + } else { + b.i.Join(channel.Name) + }   return nil  }   diff --git a/bridge/matrix/matrix.go b/bridge/matrix/matrix.go index 0635985..6cf6a56 100644 --- a/bridge/matrix/matrix.go +++ b/bridge/matrix/matrix.go @@ -6313 +6313 @@ func (b *Bmatrix) Disconnect() error {   return nil  }   -func (b *Bmatrix) JoinChannel(channel string) error { - resp, err := b.mc.JoinRoom(channel, "", nil) +func (b *Bmatrix) JoinChannel(channel config.ChannelInfo) error { + resp, err := b.mc.JoinRoom(channel.Name, "", nil)   if err != nil {   return err   }   b.Lock() - b.RoomMap[resp.RoomID] = channel + b.RoomMap[resp.RoomID] = channel.Name   b.Unlock()   return err  } diff --git a/bridge/mattermost/mattermost.go b/bridge/mattermost/mattermost.go index 7e3e7e2..54a7eff 100644 --- a/bridge/mattermost/mattermost.go +++ b/bridge/mattermost/mattermost.go @@ -10810 +10810 @@ func (b *Bmattermost) Disconnect() error {   return nil  }   -func (b *Bmattermost) JoinChannel(channel string) error { +func (b *Bmattermost) JoinChannel(channel config.ChannelInfo) error {   // we can only join channels using the API   if b.Config.WebhookURL == "" && b.Config.WebhookBindAddress == "" { - return b.mc.JoinChannel(b.mc.GetChannelId(channel, "")) + return b.mc.JoinChannel(b.mc.GetChannelId(channel.Name, ""))   }   return nil  } diff --git a/bridge/rocketchat/rocketchat.go b/bridge/rocketchat/rocketchat.go index 1b731f9..3223a78 100644 --- a/bridge/rocketchat/rocketchat.go +++ b/bridge/rocketchat/rocketchat.go @@ -537 +537 @@ func (b *Brocketchat) Disconnect() error {    }   -func (b *Brocketchat) JoinChannel(channel string) error { +func (b *Brocketchat) JoinChannel(channel config.ChannelInfo) error {   return nil  }   diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index 4c72a90..f16aa05 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -10814 +10814 @@ func (b *Bslack) Disconnect() error {    }   -func (b *Bslack) JoinChannel(channel string) error { +func (b *Bslack) JoinChannel(channel config.ChannelInfo) error {   // we can only join channels using the API   if b.Config.WebhookURL == "" && b.Config.WebhookBindAddress == "" {   if strings.HasPrefix(b.Config.Token, "xoxb") {   // TODO check if bot has already joined channel   return nil   } - _, err := b.sc.JoinChannel(channel) + _, err := b.sc.JoinChannel(channel.Name)   if err != nil {   if err.Error() != "name_taken" {   return err diff --git a/bridge/steam/steam.go b/bridge/steam/steam.go index ad4b198..aa125e4 100644 --- a/bridge/steam/steam.go +++ b/bridge/steam/steam.go @@ -608 +608 @@ func (b *Bsteam) Disconnect() error {    }   -func (b *Bsteam) JoinChannel(channel string) error { - id, err := steamid.NewId(channel) +func (b *Bsteam) JoinChannel(channel config.ChannelInfo) error { + id, err := steamid.NewId(channel.Name)   if err != nil {   return err   } diff --git a/bridge/telegram/telegram.go b/bridge/telegram/telegram.go index 4bfbf50..77704ab 100644 --- a/bridge/telegram/telegram.go +++ b/bridge/telegram/telegram.go @@ -537 +537 @@ func (b *Btelegram) Disconnect() error {    }   -func (b *Btelegram) JoinChannel(channel string) error { +func (b *Btelegram) JoinChannel(channel config.ChannelInfo) error {   return nil  }   diff --git a/bridge/xmpp/xmpp.go b/bridge/xmpp/xmpp.go index dfc2967..56773ef 100644 --- a/bridge/xmpp/xmpp.go +++ b/bridge/xmpp/xmpp.go @@ -748 +748 @@ func (b *Bxmpp) Disconnect() error {   return nil  }   -func (b *Bxmpp) JoinChannel(channel string) error { - b.xc.JoinMUCNoHistory(channel+"@"+b.Config.Muc, b.Config.Nick) +func (b *Bxmpp) JoinChannel(channel config.ChannelInfo) error { + b.xc.JoinMUCNoHistory(channel.Name+"@"+b.Config.Muc, b.Config.Nick)   return nil  }   diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index e31c23e..9d15efb 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -4486 +4487 @@ ShowEmbeds=false  UseUserName=false    #Specify WebhookURL. If given, will relay messages using the Webhook, which gives a better look to messages. +#This only works if you have one discord channel, if you have multiple discord channels you'll have to specify it in the gateway config  #OPTIONAL (default empty)  WebhookURL="Yourwebhooktokenhere"   @@ -8336 +83414 @@ enable=true #OPTIONAL - your irc channel key key="yourkey"   + [[gateway.inout]] + account="discord.game" + channel="mygreatgame" + + #OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel) + [gateway.inout.options] + webhookurl=""https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y" + #API example #[[gateway.inout]] #account="api.local"