add achievements
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Timofey.Kovalev
2021-06-22 02:34:22 +03:00
parent 3302634f61
commit 4d5b25a761
4 changed files with 249 additions and 96 deletions

View File

@ -68,7 +68,11 @@ type Player struct {
level int
}
func fetchPlayer(r *sql.Rows, p *Player) error {
type scannable interface {
Scan(dest ...interface{}) error
}
func fetchPlayer(r scannable, p *Player) error {
var (
err error
lastOnline string
@ -119,73 +123,56 @@ func (db *dbLayer) getPlayers(ctx context.Context) ([]Player, error) {
func (db *dbLayer) getPlayerByID(ctx context.Context, id string) (*Player, error) {
query := "SELECT id, name, last_login, online_duration, deaths, level FROM players WHERE id = $1"
rows, err := db.db.QueryContext(ctx, query, id)
if err != nil {
row := db.db.QueryRowContext(ctx, query, id)
if err := row.Err(); err != nil {
return nil, errors.Wrapf(err, "Failed to run db query [%s]", query)
}
defer rows.Close()
var p Player
if rows.Next() {
var p Player
err = fetchPlayer(rows, &p)
if err != nil {
return nil, err
}
return &p, nil
err := fetchPlayer(row, &p)
if err != nil {
return nil, err
}
return nil, nil
return &p, nil
}
func (db *dbLayer) getPlayerByName(ctx context.Context, name string) (*Player, error) {
query := "SELECT id, name, last_login, online_duration, deaths, level FROM players WHERE name = $1 LIMIT 1"
rows, err := db.db.QueryContext(ctx, query, name)
if err != nil {
row := db.db.QueryRowContext(ctx, query, name)
if err := row.Err(); err != nil {
return nil, errors.Wrapf(err, "Failed to run db query [%s]", query)
}
defer rows.Close()
var p Player
if rows.Next() {
var p Player
err = fetchPlayer(rows, &p)
if err != nil {
return nil, err
}
return &p, nil
err := fetchPlayer(row, &p)
if err != nil {
return nil, err
}
return nil, nil
return &p, nil
}
func (db *dbLayer) getKillsByOPlayerID(ctx context.Context, playerID string) (int, error) {
func (db *dbLayer) getKillsByPlayerID(ctx context.Context, playerID string) (int, error) {
query := "SELECT SUM(count) FROM killings WHERE player_id = $1 GROUP BY player_id"
rows, err := db.db.QueryContext(ctx, query, playerID)
if err != nil {
row := db.db.QueryRowContext(ctx, query, playerID)
if err := row.Err(); err != nil {
return 0, errors.Wrapf(err, "Failed to run db query [%s]", query)
}
defer rows.Close()
var killsNum int
if rows.Next() {
var killsNum int
err = rows.Scan(&killsNum)
if err != nil {
return 0, errors.Wrap(err, "Failed to fetch data base")
}
return killsNum, nil
err := row.Scan(&killsNum)
if err != nil {
return 0, errors.Wrap(err, "Failed to fetch data base")
}
return 0, nil
return killsNum, nil
}
func (db *dbLayer) createPlayer(ctx context.Context, name string, lastOnline time.Time) (*Player, error) {