fix thread replies in matrix
This commit is contained in:
@@ -7,7 +7,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"maunium.net/go/mautrix/event"
|
"maunium.net/go/mautrix/event"
|
||||||
"maunium.net/go/mautrix/format"
|
|
||||||
"maunium.net/go/mautrix/id"
|
"maunium.net/go/mautrix/id"
|
||||||
|
|
||||||
"gitlab.com/etke.cc/postmoogle/utils"
|
"gitlab.com/etke.cc/postmoogle/utils"
|
||||||
@@ -372,37 +371,10 @@ func (b *Bot) runSend(ctx context.Context) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(ctx, evt.RoomID, "cannot send email to %s: %v", to, err)
|
b.Error(ctx, evt.RoomID, "cannot send email to %s: %v", to, err)
|
||||||
} else {
|
} else {
|
||||||
b.saveSentMetadata(ctx, email, &cfg)
|
b.saveSentMetadata(ctx, evt.ID, email, &cfg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(tos) > 1 {
|
if len(tos) > 1 {
|
||||||
b.SendNotice(ctx, evt.RoomID, "All emails were sent.")
|
b.SendNotice(ctx, evt.RoomID, "All emails were sent.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// saveSentMetadata used to save metadata from !pm sent event to a separate notice message
|
|
||||||
// because that metadata is needed to determine email thread relations
|
|
||||||
func (b *Bot) saveSentMetadata(ctx context.Context, email *utils.Email, cfg *roomSettings) {
|
|
||||||
evt := eventFromContext(ctx)
|
|
||||||
threadID := utils.EventParent(evt.ID, evt.Content.AsMessage())
|
|
||||||
content := email.Content(threadID, cfg.ContentOptions())
|
|
||||||
notice := format.RenderMarkdown("Email has been sent to "+email.To, true, true)
|
|
||||||
notice.MsgType = event.MsgNotice
|
|
||||||
msgContent, ok := content.Parsed.(event.MessageEventContent)
|
|
||||||
if !ok {
|
|
||||||
b.Error(ctx, evt.RoomID, "cannot parse message")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
msgContent.Body = notice.Body
|
|
||||||
msgContent.FormattedBody = notice.FormattedBody
|
|
||||||
content.Parsed = msgContent
|
|
||||||
msgID, err := b.lp.Send(evt.RoomID, &content)
|
|
||||||
if err != nil {
|
|
||||||
b.Error(ctx, evt.RoomID, "cannot parse message")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if threadID != "" {
|
|
||||||
b.setThreadID(evt.RoomID, utils.MessageID(msgID, b.domains[0]), threadID)
|
|
||||||
}
|
|
||||||
b.setLastEventID(evt.RoomID, threadID, msgID)
|
|
||||||
}
|
|
||||||
|
|||||||
74
bot/email.go
74
bot/email.go
@@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"maunium.net/go/mautrix/crypto"
|
"maunium.net/go/mautrix/crypto"
|
||||||
"maunium.net/go/mautrix/event"
|
"maunium.net/go/mautrix/event"
|
||||||
|
"maunium.net/go/mautrix/format"
|
||||||
"maunium.net/go/mautrix/id"
|
"maunium.net/go/mautrix/id"
|
||||||
|
|
||||||
"gitlab.com/etke.cc/postmoogle/utils"
|
"gitlab.com/etke.cc/postmoogle/utils"
|
||||||
@@ -103,8 +104,11 @@ func (b *Bot) IncomingEmail(ctx context.Context, email *utils.Email) error {
|
|||||||
if serr != nil {
|
if serr != nil {
|
||||||
return utils.UnwrapError(serr)
|
return utils.UnwrapError(serr)
|
||||||
}
|
}
|
||||||
|
if threadID == "" {
|
||||||
|
threadID = eventID
|
||||||
|
}
|
||||||
|
|
||||||
b.setThreadID(roomID, email.MessageID, eventID)
|
b.setThreadID(roomID, email.MessageID, threadID)
|
||||||
b.setLastEventID(roomID, threadID, eventID)
|
b.setLastEventID(roomID, threadID, eventID)
|
||||||
threadID = eventID
|
threadID = eventID
|
||||||
|
|
||||||
@@ -117,6 +121,7 @@ func (b *Bot) IncomingEmail(ctx context.Context, email *utils.Email) error {
|
|||||||
|
|
||||||
type parentEmail struct {
|
type parentEmail struct {
|
||||||
MessageID string
|
MessageID string
|
||||||
|
ThreadID id.EventID
|
||||||
From string
|
From string
|
||||||
To string
|
To string
|
||||||
InReplyTo string
|
InReplyTo string
|
||||||
@@ -124,28 +129,25 @@ type parentEmail struct {
|
|||||||
Subject string
|
Subject string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bot) getParentEvent(evt *event.Event) *event.Event {
|
func (b *Bot) getParentEvent(evt *event.Event) (id.EventID, *event.Event) {
|
||||||
content := evt.Content.AsMessage()
|
content := evt.Content.AsMessage()
|
||||||
parentID := utils.EventParent(evt.ID, content)
|
threadID := utils.EventParent(evt.ID, content)
|
||||||
if parentID == evt.ID {
|
if threadID == evt.ID {
|
||||||
return evt
|
return threadID, evt
|
||||||
}
|
}
|
||||||
parentID = b.getLastEventID(evt.RoomID, parentID)
|
lastEventID := b.getLastEventID(evt.RoomID, threadID)
|
||||||
parentEvt, err := b.lp.GetClient().GetEvent(evt.RoomID, parentID)
|
if lastEventID == evt.ID {
|
||||||
|
return threadID, evt
|
||||||
|
}
|
||||||
|
parentEvt, err := b.lp.GetClient().GetEvent(evt.RoomID, lastEventID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.log.Error("cannot get parent event: %v", err)
|
b.log.Error("cannot get parent event: %v", err)
|
||||||
return nil
|
return threadID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if !b.lp.GetStore().IsEncrypted(evt.RoomID) {
|
if !b.lp.GetStore().IsEncrypted(evt.RoomID) {
|
||||||
if parentEvt.Content.Parsed == nil {
|
utils.ParseContent(parentEvt, event.EventMessage)
|
||||||
perr := parentEvt.Content.ParseRaw(event.EventMessage)
|
return threadID, parentEvt
|
||||||
if perr != nil {
|
|
||||||
b.log.Error("cannot parse event content: %v", perr)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return parentEvt
|
|
||||||
}
|
}
|
||||||
|
|
||||||
utils.ParseContent(parentEvt, event.EventEncrypted)
|
utils.ParseContent(parentEvt, event.EventEncrypted)
|
||||||
@@ -153,20 +155,18 @@ func (b *Bot) getParentEvent(evt *event.Event) *event.Event {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if err != crypto.IncorrectEncryptedContentType || err != crypto.UnsupportedAlgorithm {
|
if err != crypto.IncorrectEncryptedContentType || err != crypto.UnsupportedAlgorithm {
|
||||||
b.log.Error("cannot decrypt parent event: %v", err)
|
b.log.Error("cannot decrypt parent event: %v", err)
|
||||||
return nil
|
return threadID, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if decrypted != nil {
|
|
||||||
parentEvt.Content = decrypted.Content
|
|
||||||
}
|
|
||||||
|
|
||||||
utils.ParseContent(parentEvt, event.EventMessage)
|
utils.ParseContent(decrypted, event.EventMessage)
|
||||||
return parentEvt
|
return threadID, decrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bot) getParentEmail(evt *event.Event) parentEmail {
|
func (b *Bot) getParentEmail(evt *event.Event) parentEmail {
|
||||||
var parent parentEmail
|
var parent parentEmail
|
||||||
parentEvt := b.getParentEvent(evt)
|
threadID, parentEvt := b.getParentEvent(evt)
|
||||||
|
parent.ThreadID = threadID
|
||||||
if parentEvt == nil {
|
if parentEvt == nil {
|
||||||
return parent
|
return parent
|
||||||
}
|
}
|
||||||
@@ -225,6 +225,7 @@ func (b *Bot) SendEmailReply(ctx context.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meta.ThreadID = b.getThreadID(evt.RoomID, meta.InReplyTo, meta.References)
|
||||||
content := evt.Content.AsMessage()
|
content := evt.Content.AsMessage()
|
||||||
if meta.Subject == "" {
|
if meta.Subject == "" {
|
||||||
meta.Subject = strings.SplitN(content.Body, "\n", 1)[0]
|
meta.Subject = strings.SplitN(content.Body, "\n", 1)[0]
|
||||||
@@ -242,7 +243,32 @@ func (b *Bot) SendEmailReply(ctx context.Context) {
|
|||||||
b.Error(ctx, evt.RoomID, "cannot send email: %v", err)
|
b.Error(ctx, evt.RoomID, "cannot send email: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
b.saveSentMetadata(ctx, email, &cfg)
|
b.saveSentMetadata(ctx, meta.ThreadID, email, &cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// saveSentMetadata used to save metadata from !pm sent and thread reply events to a separate notice message
|
||||||
|
// because that metadata is needed to determine email thread relations
|
||||||
|
func (b *Bot) saveSentMetadata(ctx context.Context, threadID id.EventID, email *utils.Email, cfg *roomSettings) {
|
||||||
|
evt := eventFromContext(ctx)
|
||||||
|
content := email.Content(threadID, cfg.ContentOptions())
|
||||||
|
notice := format.RenderMarkdown("Email has been sent to "+email.To, true, true)
|
||||||
|
notice.MsgType = event.MsgNotice
|
||||||
|
msgContent, ok := content.Parsed.(event.MessageEventContent)
|
||||||
|
if !ok {
|
||||||
|
b.Error(ctx, evt.RoomID, "cannot parse message")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
msgContent.Body = notice.Body
|
||||||
|
msgContent.FormattedBody = notice.FormattedBody
|
||||||
|
content.Parsed = msgContent
|
||||||
|
msgID, err := b.lp.Send(evt.RoomID, &content)
|
||||||
|
if err != nil {
|
||||||
|
b.Error(ctx, evt.RoomID, "cannot send notice: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b.setThreadID(evt.RoomID, utils.MessageID(evt.ID, b.domains[0]), threadID)
|
||||||
|
b.setThreadID(evt.RoomID, utils.MessageID(msgID, b.domains[0]), threadID)
|
||||||
|
b.setLastEventID(evt.RoomID, threadID, msgID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bot) sendFiles(ctx context.Context, roomID id.RoomID, files []*utils.File, noThreads bool, parentID id.EventID) {
|
func (b *Bot) sendFiles(ctx context.Context, roomID id.RoomID, files []*utils.File, noThreads bool, parentID id.EventID) {
|
||||||
|
|||||||
Reference in New Issue
Block a user