use proper thread IDs on metadata save and error reporting
This commit is contained in:
@@ -93,6 +93,11 @@ func New(
|
|||||||
// Error message to the log and matrix room
|
// Error message to the log and matrix room
|
||||||
func (b *Bot) Error(ctx context.Context, message string, args ...interface{}) {
|
func (b *Bot) Error(ctx context.Context, message string, args ...interface{}) {
|
||||||
evt := eventFromContext(ctx)
|
evt := eventFromContext(ctx)
|
||||||
|
threadID := threadIDFromContext(ctx)
|
||||||
|
if threadID == "" {
|
||||||
|
threadID = linkpearl.EventParent(evt.ID, evt.Content.AsMessage())
|
||||||
|
}
|
||||||
|
|
||||||
err := fmt.Errorf(message, args...)
|
err := fmt.Errorf(message, args...)
|
||||||
b.log.Error().Err(err).Msg(err.Error())
|
b.log.Error().Err(err).Msg(err.Error())
|
||||||
if evt == nil {
|
if evt == nil {
|
||||||
@@ -105,7 +110,7 @@ func (b *Bot) Error(ctx context.Context, message string, args ...interface{}) {
|
|||||||
noThreads = cfg.NoThreads()
|
noThreads = cfg.NoThreads()
|
||||||
}
|
}
|
||||||
|
|
||||||
b.lp.SendNotice(evt.RoomID, "ERROR: "+err.Error(), utils.RelatesTo(!noThreads, evt.ID))
|
b.lp.SendNotice(evt.RoomID, "ERROR: "+err.Error(), utils.RelatesTo(!noThreads, threadID))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start performs matrix /sync
|
// Start performs matrix /sync
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import (
|
|||||||
|
|
||||||
"github.com/getsentry/sentry-go"
|
"github.com/getsentry/sentry-go"
|
||||||
"maunium.net/go/mautrix/event"
|
"maunium.net/go/mautrix/event"
|
||||||
|
"maunium.net/go/mautrix/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ctxkey int
|
type ctxkey int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ctxEvent ctxkey = iota
|
ctxEvent ctxkey = iota
|
||||||
|
ctxThreadID ctxkey = iota
|
||||||
)
|
)
|
||||||
|
|
||||||
func newContext(evt *event.Event) context.Context {
|
func newContext(evt *event.Event) context.Context {
|
||||||
@@ -49,3 +51,21 @@ func eventToContext(ctx context.Context, evt *event.Event) context.Context {
|
|||||||
|
|
||||||
return ctx
|
return ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func threadIDToContext(ctx context.Context, threadID id.EventID) context.Context {
|
||||||
|
return context.WithValue(ctx, ctxThreadID, threadID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func threadIDFromContext(ctx context.Context) id.EventID {
|
||||||
|
v := ctx.Value(ctxThreadID)
|
||||||
|
if v == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
threadID, ok := v.(id.EventID)
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return threadID
|
||||||
|
}
|
||||||
|
|||||||
15
bot/email.go
15
bot/email.go
@@ -133,6 +133,7 @@ func (b *Bot) IncomingEmail(ctx context.Context, email *email.Email) error {
|
|||||||
threadID = b.getThreadID(roomID, email.InReplyTo, email.References)
|
threadID = b.getThreadID(roomID, email.InReplyTo, email.References)
|
||||||
if threadID != "" {
|
if threadID != "" {
|
||||||
newThread = false
|
newThread = false
|
||||||
|
ctx = threadIDToContext(ctx, threadID)
|
||||||
b.setThreadID(roomID, email.MessageID, threadID)
|
b.setThreadID(roomID, email.MessageID, threadID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -147,6 +148,7 @@ func (b *Bot) IncomingEmail(ctx context.Context, email *email.Email) error {
|
|||||||
}
|
}
|
||||||
if threadID == "" {
|
if threadID == "" {
|
||||||
threadID = eventID
|
threadID = eventID
|
||||||
|
ctx = threadIDToContext(ctx, threadID)
|
||||||
}
|
}
|
||||||
|
|
||||||
b.setThreadID(roomID, email.MessageID, threadID)
|
b.setThreadID(roomID, email.MessageID, threadID)
|
||||||
@@ -179,6 +181,12 @@ func (b *Bot) sendAutoreply(roomID id.RoomID, threadID id.EventID) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
threadEvt, err := b.lp.GetClient().GetEvent(roomID, threadID)
|
||||||
|
if err != nil {
|
||||||
|
b.log.Error().Err(err).Msg("cannot get thread event for autoreply")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
evt := &event.Event{
|
evt := &event.Event{
|
||||||
ID: threadID + "-autoreply",
|
ID: threadID + "-autoreply",
|
||||||
RoomID: roomID,
|
RoomID: roomID,
|
||||||
@@ -228,7 +236,7 @@ func (b *Bot) sendAutoreply(roomID id.RoomID, threadID id.EventID) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var queued bool
|
var queued bool
|
||||||
ctx := newContext(evt)
|
ctx := newContext(threadEvt)
|
||||||
recipients := meta.Recipients
|
recipients := meta.Recipients
|
||||||
for _, to := range recipients {
|
for _, to := range recipients {
|
||||||
queued, err = b.Sendmail(evt.ID, meta.From, to, data)
|
queued, err = b.Sendmail(evt.ID, meta.From, to, data)
|
||||||
@@ -282,6 +290,7 @@ func (b *Bot) SendEmailReply(ctx context.Context) {
|
|||||||
|
|
||||||
if meta.ThreadID == "" {
|
if meta.ThreadID == "" {
|
||||||
meta.ThreadID = b.getThreadID(evt.RoomID, meta.InReplyTo, meta.References)
|
meta.ThreadID = b.getThreadID(evt.RoomID, meta.InReplyTo, meta.References)
|
||||||
|
ctx = threadIDToContext(ctx, meta.ThreadID)
|
||||||
}
|
}
|
||||||
content := evt.Content.AsMessage()
|
content := evt.Content.AsMessage()
|
||||||
if meta.Subject == "" {
|
if meta.Subject == "" {
|
||||||
@@ -306,7 +315,7 @@ func (b *Bot) SendEmailReply(ctx context.Context) {
|
|||||||
eml := email.New(meta.MessageID, meta.InReplyTo, meta.References, meta.Subject, meta.From, meta.To, meta.RcptTo, meta.CC, body, htmlBody, nil, nil)
|
eml := email.New(meta.MessageID, meta.InReplyTo, meta.References, meta.Subject, meta.From, meta.To, meta.RcptTo, meta.CC, body, htmlBody, nil, nil)
|
||||||
data := eml.Compose(b.cfg.GetBot().DKIMPrivateKey())
|
data := eml.Compose(b.cfg.GetBot().DKIMPrivateKey())
|
||||||
if data == "" {
|
if data == "" {
|
||||||
b.lp.SendNotice(evt.RoomID, "email body is empty", utils.RelatesTo(!cfg.NoThreads(), evt.ID))
|
b.lp.SendNotice(evt.RoomID, "email body is empty", utils.RelatesTo(!cfg.NoThreads(), meta.ThreadID))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,7 +520,7 @@ func (b *Bot) saveSentMetadata(ctx context.Context, queued bool, threadID id.Eve
|
|||||||
msgContent.MsgType = event.MsgNotice
|
msgContent.MsgType = event.MsgNotice
|
||||||
msgContent.Body = notice.Body
|
msgContent.Body = notice.Body
|
||||||
msgContent.FormattedBody = notice.FormattedBody
|
msgContent.FormattedBody = notice.FormattedBody
|
||||||
msgContent.RelatesTo = utils.RelatesTo(!cfg.NoThreads(), evt.ID)
|
msgContent.RelatesTo = utils.RelatesTo(!cfg.NoThreads(), threadID)
|
||||||
content.Parsed = msgContent
|
content.Parsed = msgContent
|
||||||
msgID, err := b.lp.Send(evt.RoomID, content)
|
msgID, err := b.lp.Send(evt.RoomID, content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user