diff --git a/flake.nix b/flake.nix index a2032b1..fe075a8 100644 --- a/flake.nix +++ b/flake.nix @@ -23,7 +23,7 @@ hardeningDisable = ["fortify"]; buildInputs = with pkgs; [ sqlite - sqlitebrowser + sqlite-web go gofumpt golangci-lint diff --git a/internals/discord/bot/events/messages.go b/internals/discord/bot/events/messages.go index 0fe9e11..e072875 100644 --- a/internals/discord/bot/events/messages.go +++ b/internals/discord/bot/events/messages.go @@ -328,6 +328,22 @@ func (h MessageDelete) Serve(s *dgo.Session, ev *dgo.MessageDelete) { ) } + for _, m := range append(tmsgs, msg) { + go func(m guilddb.Message) { + err := h.db.MessageDeleteFromChannel(guilddb.NewChannel(m.GuildID, m.ID, lang.EN)) + if err != nil && !e.Is(err, guilddb.ErrNoAffect) { + everr.AddData("ThreadID", m.GuildID).Log(log) + return + } + + err = h.db.ChannelDelete(guilddb.NewChannel(m.GuildID, m.ID, lang.EN)) + if err != nil && !e.Is(err, guilddb.ErrNoAffect) { + everr.AddData("ThreadID", m.GuildID).Log(log) + return + } + }(m) + } + if err := h.db.MessageDelete(guilddb.NewMessage(msg.GuildID, msg.ChannelID, msg.ID, lang.EN)); err != nil { everr.Wrapf("Failed to delete message from database", err).Log(log).Send(s, msg.ChannelID) } diff --git a/internals/guilddb/guilddb.go b/internals/guilddb/guilddb.go index fe47c2b..a2bb41d 100644 --- a/internals/guilddb/guilddb.go +++ b/internals/guilddb/guilddb.go @@ -1,9 +1,8 @@ package guilddb import ( - "errors" - "dislate/internals/translator/lang" + "errors" ) type Guild[C any] struct { @@ -62,7 +61,10 @@ type GuildDB[C any] interface { // and Message.Language. // // Will return ErrNotFound if no message is found or ErrInternal. - MessageWithOriginByLang(guildID, originChannelId, originId string, language lang.Language) (Message, error) + MessageWithOriginByLang( + guildID, originChannelId, originId string, + language lang.Language, + ) (Message, error) // Inserts a new Message object in the database. // // Message.ChannelID and Message.ID must be a unique pair and not already @@ -85,6 +87,11 @@ type GuildDB[C any] interface { // // Will return ErrNoAffect if no object was deleted or ErrInternal. MessageDelete(m Message) error + // Deletes all messages in a Channel in the database. Channel.ID is used to find + // the correct messages. + // + // Will return ErrNoAffect if no object was deleted or ErrInternal. + MessageDeleteFromChannel(c Channel) error // Selects and returns a Channel from the database, based on the // ID provided. // diff --git a/internals/guilddb/sqlite.go b/internals/guilddb/sqlite.go index 98f9bcb..069d8e4 100644 --- a/internals/guilddb/sqlite.go +++ b/internals/guilddb/sqlite.go @@ -2,14 +2,13 @@ package guilddb import ( "database/sql" + "dislate/internals/translator/lang" "encoding/json" "errors" "fmt" "slices" "strings" - "dislate/internals/translator/lang" - _ "github.com/tursodatabase/go-libsql" ) @@ -180,6 +179,20 @@ func (db *SQLiteDB[C]) MessageDelete(m Message) error { return nil } +func (db *SQLiteDB[C]) MessageDeleteFromChannel(c Channel) error { + r, err := db.sql.Exec(` + DELETE FROM messages + WHERE "GuildID" = $1 AND "ChannelID" = $2 + `, c.GuildID, c.ID) + if err != nil && !errors.Is(err, ErrNoAffect) { + return errors.Join(ErrInternal, err) + } else if rows, _ := r.RowsAffected(); rows == 0 { + return ErrNoAffect + } + + return nil +} + func (db *SQLiteDB[C]) selectMessage(query string, args ...any) (Message, error) { var m Message err := db.sql.QueryRow(fmt.Sprintf(`