attachments.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package bridge
  2. import (
  3. "bytes"
  4. "image"
  5. "io/ioutil"
  6. "net/http"
  7. "strings"
  8. "github.com/bwmarrin/discordgo"
  9. "maunium.net/go/mautrix/appservice"
  10. "maunium.net/go/mautrix/event"
  11. "maunium.net/go/mautrix/id"
  12. )
  13. func (p *Portal) downloadDiscordAttachment(url string) ([]byte, error) {
  14. // We might want to make this save to disk in the future. Discord defaults
  15. // to 8mb for all attachments to a messages for non-nitro users and
  16. // non-boosted servers.
  17. //
  18. // If the user has nitro classic, their limit goes up to 50mb but if a user
  19. // has regular nitro the limit is increased to 100mb.
  20. //
  21. // Servers boosted to level 2 will have the limit bumped to 50mb.
  22. req, err := http.NewRequest(http.MethodGet, url, nil)
  23. if err != nil {
  24. return nil, err
  25. }
  26. req.Header.Set("User-Agent", discordgo.DroidBrowserUserAgent)
  27. resp, err := http.DefaultClient.Do(req)
  28. if err != nil {
  29. return nil, err
  30. }
  31. defer resp.Body.Close()
  32. return ioutil.ReadAll(resp.Body)
  33. }
  34. func (p *Portal) downloadMatrixAttachment(eventID id.EventID, content *event.MessageEventContent) ([]byte, error) {
  35. var file *event.EncryptedFileInfo
  36. rawMXC := content.URL
  37. if content.File != nil {
  38. file = content.File
  39. rawMXC = file.URL
  40. }
  41. mxc, err := rawMXC.Parse()
  42. if err != nil {
  43. p.log.Errorln("Malformed content URL in %s: %v", eventID, err)
  44. return nil, err
  45. }
  46. data, err := p.MainIntent().DownloadBytes(mxc)
  47. if err != nil {
  48. p.log.Errorfln("Failed to download media in %s: %v", eventID, err)
  49. return nil, err
  50. }
  51. if file != nil {
  52. data, err = file.Decrypt(data)
  53. if err != nil {
  54. p.log.Errorfln("Failed to decrypt media in %s: %v", eventID, err)
  55. return nil, err
  56. }
  57. }
  58. return data, nil
  59. }
  60. func (p *Portal) uploadMatrixAttachment(intent *appservice.IntentAPI, data []byte, content *event.MessageEventContent) error {
  61. uploaded, err := intent.UploadBytes(data, content.Info.MimeType)
  62. if err != nil {
  63. return err
  64. }
  65. content.URL = uploaded.ContentURI.CUString()
  66. content.Info.Size = len(data)
  67. if content.Info.Width == 0 && content.Info.Height == 0 && strings.HasPrefix(content.Info.MimeType, "image/") {
  68. cfg, _, _ := image.DecodeConfig(bytes.NewReader(data))
  69. content.Info.Width = cfg.Width
  70. content.Info.Height = cfg.Height
  71. }
  72. return nil
  73. }