From 641e7ebdbf5f4f07dfa77ac2853b3db645f43ebb Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L. de Mello" Date: Wed, 28 Aug 2024 14:11:09 -0300 Subject: [PATCH] feat(messages,events): message deleting support --- internals/discord/bot/errors/errors.go | 18 +++++ internals/discord/bot/events.go | 1 + internals/discord/bot/events/messages.go | 89 +++++++++++++++++++++++- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/internals/discord/bot/errors/errors.go b/internals/discord/bot/errors/errors.go index eda0523..e039b87 100644 --- a/internals/discord/bot/errors/errors.go +++ b/internals/discord/bot/errors/errors.go @@ -51,11 +51,29 @@ func (err defaultError) Reply(s *dgo.Session, m *dgo.Message) { } } +func (err defaultError) Send(s *dgo.Session, channelID string) { + _, erro := s.ChannelMessageSend( + channelID, + fmt.Sprintf("Error: %s\nSee logs for more details", err.err), + ) + if erro != nil { + _, _ = s.ChannelMessageSend( + channelID, + fmt.Sprintf("Failed to send error message (somehow), due to:\n%s", erro.Error()), + ) + } +} + func (err defaultError) LogReply(l *slog.Logger, s *dgo.Session, m *dgo.Message) { err.Reply(s, m) err.Log(l) } +func (err defaultError) LogSend(l *slog.Logger, s *dgo.Session, channelID string) { + err.Send(s, channelID) + err.Log(l) +} + func (err defaultError) Error() string { s := make([]string, len(err.args)) for i, a := range err.args { diff --git a/internals/discord/bot/events.go b/internals/discord/bot/events.go index 88ac8c8..a2ccd14 100644 --- a/internals/discord/bot/events.go +++ b/internals/discord/bot/events.go @@ -7,6 +7,7 @@ func (b *Bot) registerEventHandlers() { events.NewGuildCreate(b.logger, b.db).Serve, events.NewMessageCreate(b.db, b.translator).Serve, events.NewMessageEdit(b.db, b.translator).Serve, + events.NewMessageDelete(b.db).Serve, events.NewReady(b.logger, b.db).Serve, events.NewThreadCreate(b.db, b.translator).Serve, } diff --git a/internals/discord/bot/events/messages.go b/internals/discord/bot/events/messages.go index a6fe4fb..02ed197 100644 --- a/internals/discord/bot/events/messages.go +++ b/internals/discord/bot/events/messages.go @@ -146,7 +146,7 @@ func (h MessageEdit) Serve(s *dgo.Session, ev *dgo.MessageUpdate) { log := gconf.GetLogger(ev.Message.GuildID, s, h.db) - msg, err := getMessage(h.db, ev.Message, lang.EN) + msg, err := h.db.Message(ev.Message.GuildID, ev.Message.ChannelID, ev.Message.ID) if e.Is(err, guilddb.ErrNotFound) { log.Debug("Message is not in database, ignoring.", slog.String("guild", ev.Message.GuildID), @@ -224,6 +224,93 @@ func (h MessageEdit) Serve(s *dgo.Session, ev *dgo.MessageUpdate) { } } +type MessageDelete struct { + db gconf.DB +} + +func NewMessageDelete(db gconf.DB) MessageDelete { + return MessageDelete{db} +} + +func (h MessageDelete) Serve(s *dgo.Session, ev *dgo.MessageDelete) { + log := gconf.GetLogger(ev.Message.GuildID, s, h.db) + + msg, err := h.db.Message(ev.Message.GuildID, ev.Message.ChannelID, ev.Message.ID) + if e.Is(err, guilddb.ErrNotFound) { + log.Debug("Message is not in database, ignoring.", + slog.String("guild", ev.Message.GuildID), + slog.String("channel", ev.Message.ChannelID), + ) + return + } else if err != nil { + errors.NewErrDatabase( + slog.String("guild", ev.Message.GuildID), + slog.String("channel", ev.Message.ChannelID), + slog.String("err", err.Error()), + ).LogReply(log, s, ev.Message) + return + } + + var originChannelID, originID string + if msg.OriginID != nil && msg.OriginChannelID != nil { + oMsg, err := h.db.Message(ev.Message.GuildID, *msg.OriginChannelID, *msg.OriginID) + if err != nil { + originChannelID, originID = *msg.OriginChannelID, *msg.OriginID + } else { + msg, originChannelID, originID = oMsg, oMsg.ChannelID, oMsg.ID + } + } else { + originChannelID, originID = msg.ChannelID, msg.ID + } + + tmsgs, err := h.db.MessagesWithOrigin(msg.GuildID, originChannelID, originID) + if e.Is(err, guilddb.ErrNotFound) { + log.Debug("No translated message found, ignoring.", + slog.String("guild", ev.GuildID), + slog.String("channel", ev.ChannelID), + ) + return + } else if err != nil { + errors.NewErrDatabase( + slog.String("guild", ev.GuildID), + slog.String("channel", ev.ChannelID), + slog.String("err", err.Error()), + ).LogReply(log, s, ev.Message) + return + } + + for _, m := range tmsgs { + if m.ID == msg.ID && m.GuildID == msg.GuildID { + continue + } + go func(m guilddb.Message) { + if err := s.ChannelMessageDelete(m.ChannelID, m.ID); err != nil { + log.Warn("Failed to delete message", + slog.String("channel", m.ChannelID), + slog.String("message", m.ID), + slog.String("err", err.Error()), + ) + } + }(m) + } + + if err := s.ChannelMessageDelete(msg.ChannelID, msg.ID); err != nil { + log.Warn("Failed to delete message", + slog.String("channel", msg.ChannelID), + slog.String("message", msg.ID), + slog.String("err", err.Error()), + ) + } + + if err := h.db.MessageDelete(guilddb.NewMessage(msg.GuildID, msg.ChannelID, msg.ID, lang.EN)); err != nil { + errors.NewErrDatabase( + slog.String("channel", msg.ChannelID), + slog.String("message", msg.ID), + slog.String("err", err.Error()), + ).LogSend(log, s, msg.ChannelID) + } +} + func getUserWebhook(s *dgo.Session, channelID string, user *dgo.User) (*dgo.Webhook, error) { whName := "DISLATE_USER_WEBHOOK_" + user.ID