add logout time and refactor
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
31
dataBase.go
31
dataBase.go
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
Reference in New Issue
Block a user