feat(messages,events): message deleting support
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user