mirror of
https://github.com/42wim/matterbridge.git
synced 2024-12-17 22:42:01 -08:00
discord: support sending files with just a URL
previously, the code assumed each file had a Data, and crashed if this was not present. now, we detect this condition, and send the URL instead. the discord client will display URLs in a message of their own as inline embeds, without any special behavior needed on our part. this commit makes the same changes to the webhook and non-webhook code.
This commit is contained in:
parent
e168a89632
commit
707a74ba0e
@ -380,7 +380,27 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
|
|||||||
// handleUploadFile handles native upload of files
|
// handleUploadFile handles native upload of files
|
||||||
func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (string, error) {
|
func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (string, error) {
|
||||||
for _, f := range msg.Extra["file"] {
|
for _, f := range msg.Extra["file"] {
|
||||||
|
var err error
|
||||||
fi := f.(config.FileInfo)
|
fi := f.(config.FileInfo)
|
||||||
|
|
||||||
|
if fi.URL != "" {
|
||||||
|
err = b.handleUploadFileFromURL(msg, channelID, &fi)
|
||||||
|
} else if fi.Data != nil {
|
||||||
|
err = b.handleUploadFileFromData(msg, channelID, &fi)
|
||||||
|
} else {
|
||||||
|
b.Log.Errorf("Attachment %#v for message %#v had neither Data nor URL", fi, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("Could not send attachment %#v for message %#v: %s", fi, msg, err)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bdiscord) handleUploadFileFromData(msg *config.Message, channelID string, fi *config.FileInfo) error {
|
||||||
file := discordgo.File{
|
file := discordgo.File{
|
||||||
Name: fi.Name,
|
Name: fi.Name,
|
||||||
ContentType: "",
|
ContentType: "",
|
||||||
@ -393,13 +413,18 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
|
|||||||
}
|
}
|
||||||
res, err := b.c.ChannelMessageSendComplex(channelID, &m)
|
res, err := b.c.ChannelMessageSendComplex(channelID, &m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("file upload failed: %s", err)
|
return fmt.Errorf("file upload failed: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// link file_upload_nativeID (file ID from the original bridge) to our upload id
|
// link file_upload_nativeID (file ID from the original bridge) to our upload id
|
||||||
// so that we can remove this later when it eg needs to be deleted
|
// so that we can remove this later when it eg needs to be deleted
|
||||||
b.cache.Add(cFileUpload+fi.NativeID, res.ID)
|
b.cache.Add(cFileUpload+fi.NativeID, res.ID)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", nil
|
func (b *Bdiscord) handleUploadFileFromURL(msg *config.Message, channelID string, fi *config.FileInfo) error {
|
||||||
|
_, err := b.c.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{
|
||||||
|
Content: fi.URL,
|
||||||
|
AllowedMentions: b.getAllowedMentions(),
|
||||||
|
})
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,26 @@ func (b *Bdiscord) webhookSendTextOnly(msg *config.Message, channelID string) (s
|
|||||||
func (b *Bdiscord) webhookSendFilesOnly(msg *config.Message, channelID string) error {
|
func (b *Bdiscord) webhookSendFilesOnly(msg *config.Message, channelID string) error {
|
||||||
for _, f := range msg.Extra["file"] {
|
for _, f := range msg.Extra["file"] {
|
||||||
fi := f.(config.FileInfo) //nolint:forcetypeassert
|
fi := f.(config.FileInfo) //nolint:forcetypeassert
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if fi.URL != "" {
|
||||||
|
err = b.webhookSendFileFromURL(msg, channelID, &fi)
|
||||||
|
} else if fi.Data != nil {
|
||||||
|
err = b.webhookSendFileFromData(msg, channelID, &fi)
|
||||||
|
} else {
|
||||||
|
b.Log.Errorf("Attachment %#v for message %#v had neither Data nor URL", fi, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("Could not send attachment %#v for message %#v: %s", fi, msg, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bdiscord) webhookSendFileFromData(msg *config.Message, channelID string, fi *config.FileInfo) error {
|
||||||
file := discordgo.File{
|
file := discordgo.File{
|
||||||
Name: fi.Name,
|
Name: fi.Name,
|
||||||
ContentType: "",
|
ContentType: "",
|
||||||
@ -88,12 +108,22 @@ func (b *Bdiscord) webhookSendFilesOnly(msg *config.Message, channelID string) e
|
|||||||
AllowedMentions: b.getAllowedMentions(),
|
AllowedMentions: b.getAllowedMentions(),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
|
||||||
b.Log.Errorf("Could not send file %#v for message %#v: %s", file, msg, err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return nil
|
func (b *Bdiscord) webhookSendFileFromURL(msg *config.Message, channelID string, fi *config.FileInfo) error {
|
||||||
|
// discord client will display any file url as an inline embed,
|
||||||
|
// without us having to do anything special.
|
||||||
|
_, err := b.transmitter.Send(
|
||||||
|
channelID,
|
||||||
|
&discordgo.WebhookParams{
|
||||||
|
Content: fi.URL,
|
||||||
|
Username: msg.Username,
|
||||||
|
AvatarURL: msg.Avatar,
|
||||||
|
AllowedMentions: b.getAllowedMentions(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// webhookSend send one or more message via webhook, taking care of file
|
// webhookSend send one or more message via webhook, taking care of file
|
||||||
|
Loading…
Reference in New Issue
Block a user