diff --git a/bot/email.go b/bot/email.go index 10f1a84..6b391af 100644 --- a/bot/email.go +++ b/bot/email.go @@ -171,7 +171,7 @@ func (b *Bot) sendFiles(ctx context.Context, roomID id.RoomID, files []*utils.Fi continue } _, err = b.lp.Send(roomID, &event.MessageEventContent{ - MsgType: event.MsgFile, + MsgType: file.MsgType, Body: req.FileName, URL: resp.ContentURI.CUString(), RelatesTo: utils.RelatesTo(!noThreads, parentID), diff --git a/go.mod b/go.mod index ac9c322..774895f 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( git.sr.ht/~xn/cache/v2 v2.0.0 github.com/emersion/go-msgauth v0.6.6 github.com/emersion/go-smtp v0.15.0 + github.com/gabriel-vasile/mimetype v1.4.1 github.com/getsentry/sentry-go v0.13.0 github.com/jhillyerd/enmime v0.10.0 github.com/lib/pq v1.10.6 diff --git a/go.sum b/go.sum index b2de36c..3fba51f 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ github.com/emersion/go-smtp v0.15.0 h1:3+hMGMGrqP/lqd7qoxZc1hTU8LY8gHV9RFGWlqSDm github.com/emersion/go-smtp v0.15.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= +github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= +github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= github.com/getsentry/sentry-go v0.13.0 h1:20dgTiUSfxRB/EhMPtxcL9ZEbM1ZdR+W/7f7NWD+xWo= github.com/getsentry/sentry-go v0.13.0/go.mod h1:EOsfu5ZdvKPfeHYV6pTVQnsjfp30+XA7//UooKNumH0= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= @@ -95,6 +97,7 @@ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5 golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20210501142056-aec3718b3fa0/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -102,11 +105,13 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= diff --git a/smtp/msasession.go b/smtp/msasession.go index 762a6ca..746568a 100644 --- a/smtp/msasession.go +++ b/smtp/msasession.go @@ -54,7 +54,7 @@ func (s *msasession) parseAttachments(parts []*enmime.Part) []*utils.File { for _, err := range attachment.Errors { s.log.Warn("attachment error: %v", err) } - file := utils.NewFile(attachment.FileName, attachment.ContentType, attachment.Content) + file := utils.NewFile(attachment.FileName, attachment.Content) files = append(files, file) } diff --git a/utils/file.go b/utils/file.go index 25c6a98..06a14fe 100644 --- a/utils/file.go +++ b/utils/file.go @@ -2,25 +2,32 @@ package utils import ( "bytes" + "strings" + "github.com/gabriel-vasile/mimetype" "maunium.net/go/mautrix" + "maunium.net/go/mautrix/event" ) type File struct { Name string Type string + MsgType event.MessageType Length int Content []byte } -func NewFile(name, contentType string, content []byte) *File { +func NewFile(name string, content []byte) *File { file := &File{ Name: name, - Type: contentType, Content: content, } file.Length = len(content) + mtype := mimetype.Detect(content) + file.Type = mtype.String() + file.MsgType = mimeMsgType(file.Type) + return file } @@ -33,3 +40,23 @@ func (f *File) Convert() mautrix.ReqUploadMedia { FileName: f.Name, } } + +func mimeMsgType(mime string) event.MessageType { + if mime == "" { + return event.MsgFile + } + if !strings.Contains(mime, "/") { + return event.MsgFile + } + msection := strings.SplitN(mime, "/", 1)[0] + switch msection { + case "image": + return event.MsgImage + case "video": + return event.MsgVideo + case "audio": + return event.MsgAudio + default: + return event.MsgFile + } +}