Files
stinkinator/playerService.go

55 lines
1.4 KiB
Go

package main
import "fmt"
type PlayerService struct {
db *DB
}
type PlayerServiceQuery struct {
Name *string `db:"name"`
ID *int64 `db:"id"`
}
func (ps *PlayerService) Query(query PlayerServiceQuery) (Player, error) {
player := Player{}
sqlQuery := "SELECT id, name, guild FROM player"
whereQuery := BuildWhereQuery(query)
if whereQuery != "" {
sqlQuery += " " + whereQuery
}
err := ps.db.readConn.QueryRow(sqlQuery).Scan(&player.ID, &player.Name, &player.Guild.ID)
if err != nil {
return player, fmt.Errorf("failed getting player for query %q: %v", sqlQuery, err)
}
return player, nil
}
func (ps *PlayerService) Create(name string, guild Guild) (Player, error) {
player := Player{}
res, err := ps.db.writeConn.Exec("insert into player (name, guild) values (?, ?)", name, guild.ID)
if err != nil {
return player, fmt.Errorf("failed to insert player: %v", err)
}
id, err := res.LastInsertId()
if err != nil {
return player, fmt.Errorf("failed to get last insert id: %v", err)
}
return ps.Query(PlayerServiceQuery{ID: &id})
}
func (ps *PlayerService) GetOrCreate(name string, guild Guild) (Player, error) {
player := Player{}
player, err := ps.Query(PlayerServiceQuery{Name: &name})
if err != nil {
player, err = ps.Create(name, guild)
if err != nil {
return player, fmt.Errorf("failed creating player: %v", err)
}
}
return player, nil
}