feat: support for deleting threads from messages

This commit is contained in:
Guz
2024-09-03 16:38:10 -03:00
parent 97c53c4cc7
commit decc8fa733
4 changed files with 42 additions and 6 deletions

View File

@@ -23,7 +23,7 @@
hardeningDisable = ["fortify"];
buildInputs = with pkgs; [
sqlite
sqlitebrowser
sqlite-web
go
gofumpt
golangci-lint

View File

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

View File

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

View File

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