feat(messages,events): message deleting support

This commit is contained in:
Gustavo "Guz" L. de Mello
2024-08-28 14:11:09 -03:00
parent 0d6684666e
commit 641e7ebdbf
3 changed files with 107 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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,
}

View File

@@ -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