feat: support for deleting threads from messages
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
hardeningDisable = ["fortify"];
|
||||
buildInputs = with pkgs; [
|
||||
sqlite
|
||||
sqlitebrowser
|
||||
sqlite-web
|
||||
go
|
||||
gofumpt
|
||||
golangci-lint
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
//
|
||||
|
||||
@@ -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(`
|
||||
|
||||
Reference in New Issue
Block a user