pepebot/models/mysql/badword.go

147 lines
2.7 KiB
Go

package mysql
import (
"database/sql"
"errors"
"strconv"
"quenten.nl/pepebot/models"
)
type BadwordModel struct {
DB *sql.DB
}
func (m *BadwordModel) GetWord(word string, serverID string) (*models.Badword, error) {
stmt := `SELECT id, word, serverid, lastsaid FROM badwords
WHERE word = ? AND serverid = ?`
row := m.DB.QueryRow(stmt, word, serverID)
bw := &models.Badword{}
err := row.Scan(&bw.ID, &bw.Word, &bw.ServerID, &bw.LastSaid)
if err != nil {
if errors.Is(err, sql.ErrNoRows){
return nil, models.ErrNoRecord
}else{
return nil, err
}
}
return bw, nil
}
func (m *BadwordModel) AllWords() (map[string][]string, error) {
stmt := `SELECT word, serverid FROM badwords`
rows, err := m.DB.Query(stmt)
if err != nil {
return nil, err
}
defer rows.Close()
type tmp struct{
word string
serverid string
}
tmp2 := []*tmp{}
for rows.Next() {
t := &tmp{}
err = rows.Scan(&t.word, &t.serverid)
if err != nil {
return nil, err
}
tmp2 = append(tmp2, t)
}
if err = rows.Err(); err != nil{
return nil, err
}
finaltmp := make(map[string][]string)
for i := 0; i < len(tmp2); i++ {
finaltmp[tmp2[i].serverid] = append(finaltmp[tmp2[i].serverid], tmp2[i].word)
}
return finaltmp, nil
}
func (m *BadwordModel) InsertNewWord(word string, serverid string) (int, error) {
stmt := `INSERT INTO badwords (word, serverid, lastsaid)
VALUES (?, ?, UTC_TIMESTAMP())`
id1, err := strconv.Atoi(serverid)
if err != nil {
return 0, err
}
result, err := m.DB.Exec(stmt, word, id1)
if err != nil {
return 0, err
}
id, err := result.LastInsertId()
if err != nil {
return 0, err
}
return int(id), nil
}
func (m *BadwordModel) RemoveWord(word string, serverid string) (error) {
allwords, err := m.AllWords()
if err != nil {
return err
}
found := false
for i := 0; i < len(allwords[serverid]); i++ {
if allwords[serverid][i] == word {
found = true
break
}
}
if !found {
return errors.New("that word doesn't exist")
}
stmt := `DELETE FROM badwords WHERE word = ? AND serverid = ?`
result, err := m.DB.Exec(stmt, word, serverid)
if err != nil {
return err
}
if r, _ := result.RowsAffected(); r == 0 || r > 1 {
return errors.New("an unknown error occured")
}
return nil
}
func (m *BadwordModel) UpdateLastSaid(word string, serverid string) (int, error) {
stmt := `SELECT id FROM badwords WHERE
word = ? AND serverid = ?`
row := m.DB.QueryRow(stmt, word, serverid)
id := 0
row.Scan(&id)
stmt = `UPDATE badwords SET lastsaid = UTC_TIMESTAMP() WHERE id = ?`
result, err := m.DB.Exec(stmt, id)
if err != nil {
return 0, err
}
id2, err := result.LastInsertId()
if err != nil {
return 0, nil
}
return int(id2), nil
}