add logout time and refactor
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Timofey.Kovalev
2021-06-22 20:20:09 +03:00
parent f3b56bb7b7
commit 34c5271a62
3 changed files with 31 additions and 16 deletions

View File

@ -62,7 +62,8 @@ func (db *dbLayer) execInTransaction(ctx context.Context, query string, args ...
type Player struct { type Player struct {
id string id string
name string name string
lastOnline time.Time lastLogin time.Time
lastLogout time.Time
onlineDuration time.Duration onlineDuration time.Duration
deaths int deaths int
level int level int
@ -75,18 +76,26 @@ type scannable interface {
func fetchPlayer(r scannable, p *Player) error { func fetchPlayer(r scannable, p *Player) error {
var ( var (
err error err error
lastOnline string lastLogin string
lastLogout *string
onlineDuration int onlineDuration int
) )
err = r.Scan(&p.id, &p.name, &lastOnline, &onlineDuration, &p.deaths, &p.level) err = r.Scan(&p.id, &p.name, &lastLogin, &onlineDuration, &p.deaths, &p.level, &lastLogout)
if err != nil { if err != nil {
return errors.Wrap(err, "Failed to fetch data base") return errors.Wrap(err, "Failed to fetch data base")
} }
p.lastOnline, err = time.Parse(time.RFC3339, lastOnline) p.lastLogin, err = time.Parse(time.RFC3339, lastLogin)
if err != nil { if err != nil {
return errors.Wrapf(err, "Failed to parse date [%s]", lastOnline) return errors.Wrapf(err, "Failed to parse date [%s]", lastLogin)
}
if lastLogout != nil {
p.lastLogout, err = time.Parse(time.RFC3339, lastLogin)
if err != nil {
return errors.Wrapf(err, "Failed to parse date [%s]", lastLogout)
}
} }
p.onlineDuration = time.Second * time.Duration(onlineDuration) p.onlineDuration = time.Second * time.Duration(onlineDuration)
@ -97,7 +106,7 @@ func fetchPlayer(r scannable, p *Player) error {
func (db *dbLayer) getPlayers(ctx context.Context) ([]Player, error) { func (db *dbLayer) getPlayers(ctx context.Context) ([]Player, error) {
var players []Player var players []Player
query := "SELECT id, name, last_login, online_duration, deaths, level FROM players" query := "SELECT id, name, last_login, online_duration, deaths, level, last_logout FROM players"
rows, err := db.db.QueryContext(ctx, query) rows, err := db.db.QueryContext(ctx, query)
if err != nil { if err != nil {
@ -121,7 +130,7 @@ func (db *dbLayer) getPlayers(ctx context.Context) ([]Player, error) {
} }
func (db *dbLayer) getPlayerByID(ctx context.Context, id string) (*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" query := "SELECT id, name, last_login, online_duration, deaths, level, last_logout FROM players WHERE id = $1"
row := db.db.QueryRowContext(ctx, query, id) row := db.db.QueryRowContext(ctx, query, id)
if err := row.Err(); err != nil { if err := row.Err(); err != nil {
@ -140,7 +149,7 @@ func (db *dbLayer) getPlayerByID(ctx context.Context, id string) (*Player, error
} }
func (db *dbLayer) getPlayerByName(ctx context.Context, name string) (*Player, error) { 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" query := "SELECT id, name, last_login, online_duration, deaths, level, last_logout FROM players WHERE name = $1 LIMIT 1"
row := db.db.QueryRowContext(ctx, query, name) row := db.db.QueryRowContext(ctx, query, name)
if err := row.Err(); err != nil { if err := row.Err(); err != nil {
@ -175,10 +184,10 @@ func (db *dbLayer) getKillsByPlayerID(ctx context.Context, playerID string) (int
return killsNum, nil return killsNum, nil
} }
func (db *dbLayer) createPlayer(ctx context.Context, name string, lastOnline time.Time) (*Player, error) { func (db *dbLayer) createPlayer(ctx context.Context, name string, lastLogin time.Time) (*Player, error) {
id := uuid() id := uuid()
err := db.execInTransaction(ctx, "INSERT INTO players (id, name, last_login) VALUES ($1, $2, $3)", id, name, lastOnline.Format(time.RFC3339)) err := db.execInTransaction(ctx, "INSERT INTO players (id, name, last_login) VALUES ($1, $2, $3)", id, name, lastLogin.Format(time.RFC3339))
if err != nil { if err != nil {
return nil, err return nil, err
@ -187,7 +196,7 @@ func (db *dbLayer) createPlayer(ctx context.Context, name string, lastOnline tim
return &Player{ return &Player{
id: id, id: id,
name: name, name: name,
lastOnline: lastOnline, lastLogin: lastLogin,
}, nil }, nil
} }

View File

@ -117,7 +117,7 @@ func (c *quitCommand) run(ctx context.Context) {
return return
} }
err = db.increasePlayerOnlineDuration(ctx, p.id, time.Now().Sub(p.lastOnline)) err = db.increasePlayerOnlineDuration(ctx, p.id, time.Now().Sub(p.lastLogin))
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return

View File

@ -70,6 +70,7 @@ const (
emojiDeaths = "\xF0\x9F\x92\x80" emojiDeaths = "\xF0\x9F\x92\x80"
emojiTime = "\xF0\x9F\x95\x90" emojiTime = "\xF0\x9F\x95\x90"
emojiGun = "\xF0\x9F\x94\xAB" emojiGun = "\xF0\x9F\x94\xAB"
emojiCheck = "\xE2\x9C\x85"
) )
func (p *playerInfo) updatePlayerInfo(ctx context.Context) error { func (p *playerInfo) updatePlayerInfo(ctx context.Context) error {
@ -89,9 +90,9 @@ func (p *playerInfo) updatePlayerInfo(ctx context.Context) error {
return err return err
} }
access := "\xE2\x9D\x8C offLine" access := "\x1F\x53\x04 offLine"
if p.isOnline { if p.isOnline {
access = "\xE2\x9C\x85 onLine" access = "\x1F\x7E\x02 onLine"
} }
level := "-" level := "-"
@ -111,6 +112,11 @@ func (p *playerInfo) updatePlayerInfo(ctx context.Context) error {
lines = append(lines, fmt.Sprintf("%s Смертей: *%d*", emojiDeaths, player.deaths)) lines = append(lines, fmt.Sprintf("%s Смертей: *%d*", emojiDeaths, player.deaths))
lines = append(lines, fmt.Sprintf("%s Фрагов: *%d*", emojiGun, kills)) lines = append(lines, fmt.Sprintf("%s Фрагов: *%d*", emojiGun, kills))
lines = append(lines, fmt.Sprintf("%s Время в игре: *%s*", emojiTime, d.Format(units))) lines = append(lines, fmt.Sprintf("%s Время в игре: *%s*", emojiTime, d.Format(units)))
if !player.lastLogout.IsZero() && !p.isOnline {
lines = append(lines, fmt.Sprintf("%s Был в сети: *%s*", emojiCheck, player.lastLogout.Format("02 Jan 15:04")))
}
lines = append(lines, "-----") lines = append(lines, "-----")
emojiAch := make([]string, 0, len(p.achievements)) emojiAch := make([]string, 0, len(p.achievements))