forked from jshiffer/matterbridge
Add webhook posting mode for discord. (#204)
Using it implies to configure a Webhook on discord and set the parameter : - WebhookURL (New parameter, discord-specific) Discord API does not allow to change the name of the user posting, but webhooks does. This makes the relay much more elegant, even if we might lose some more advanced features. Signed-off-by: saury07 <sacha.aury@gmail.com>
This commit is contained in:
parent
1b837b3dc7
commit
c17512b7ab
@ -77,6 +77,7 @@ type Protocol struct {
|
|||||||
UseSASL bool // IRC
|
UseSASL bool // IRC
|
||||||
UseTLS bool // IRC
|
UseTLS bool // IRC
|
||||||
UseFirstName bool // telegram
|
UseFirstName bool // telegram
|
||||||
|
WebhookURL string // discord
|
||||||
}
|
}
|
||||||
|
|
||||||
type ChannelOptions struct {
|
type ChannelOptions struct {
|
||||||
|
@ -19,6 +19,8 @@ type bdiscord struct {
|
|||||||
UseChannelID bool
|
UseChannelID bool
|
||||||
userMemberMap map[string]*discordgo.Member
|
userMemberMap map[string]*discordgo.Member
|
||||||
guildID string
|
guildID string
|
||||||
|
webhookID string
|
||||||
|
webhookToken string
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,6 +37,12 @@ func New(cfg config.Protocol, account string, c chan config.Message) *bdiscord {
|
|||||||
b.Remote = c
|
b.Remote = c
|
||||||
b.Account = account
|
b.Account = account
|
||||||
b.userMemberMap = make(map[string]*discordgo.Member)
|
b.userMemberMap = make(map[string]*discordgo.Member)
|
||||||
|
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]
|
||||||
|
}
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +109,21 @@ func (b *bdiscord) Send(msg config.Message) error {
|
|||||||
flog.Errorf("Could not find channelID for %v", msg.Channel)
|
flog.Errorf("Could not find channelID for %v", msg.Channel)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
|
if b.Config.WebhookURL == ""{
|
||||||
|
flog.Debugf("Broadcasting using API")
|
||||||
|
b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
|
||||||
|
} else {
|
||||||
|
flog.Debugf("Broadcasting using Webhook")
|
||||||
|
b.c.WebhookExecute(
|
||||||
|
b.webhookID,
|
||||||
|
b.webhookToken,
|
||||||
|
true,
|
||||||
|
&discordgo.WebhookParams{
|
||||||
|
Content: msg.Text,
|
||||||
|
Username: msg.Username,
|
||||||
|
AvatarURL: msg.Avatar,
|
||||||
|
})
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,6 +144,10 @@ func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
|
|||||||
if m.Author.Username == b.Nick {
|
if m.Author.Username == b.Nick {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// if using webhooks, do not relay if it's ours
|
||||||
|
if b.Config.WebhookURL != "" && m.Author.Bot && m.Author.ID == b.webhookID {
|
||||||
|
return
|
||||||
|
}
|
||||||
if len(m.Attachments) > 0 {
|
if len(m.Attachments) > 0 {
|
||||||
for _, attach := range m.Attachments {
|
for _, attach := range m.Attachments {
|
||||||
m.Content = m.Content + "\n" + attach.URL
|
m.Content = m.Content + "\n" + attach.URL
|
||||||
|
@ -454,6 +454,10 @@ Server="yourservername"
|
|||||||
#OPTIONAL (default false)
|
#OPTIONAL (default false)
|
||||||
ShowEmbeds=false
|
ShowEmbeds=false
|
||||||
|
|
||||||
|
#Specify WebhookURL. If given, will relay messages using the Webhook, which gives a better look to messages.
|
||||||
|
#OPTIONAL (default empty)
|
||||||
|
WebhookURL="Yourwebhooktokenhere"
|
||||||
|
|
||||||
#Disable sending of edits to other bridges
|
#Disable sending of edits to other bridges
|
||||||
#OPTIONAL (default false)
|
#OPTIONAL (default false)
|
||||||
EditDisable=false
|
EditDisable=false
|
||||||
|
Loading…
Reference in New Issue
Block a user