2021-04-25 17:58:33 +00:00
|
|
|
package tasks
|
2020-06-20 18:16:27 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/go-pg/pg/v10"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/tribalwarshelp/shared/models"
|
2021-04-25 17:58:33 +00:00
|
|
|
"time"
|
2020-06-20 18:16:27 +00:00
|
|
|
)
|
|
|
|
|
2021-04-25 17:58:33 +00:00
|
|
|
type taskUpdateServerHistory struct {
|
|
|
|
*task
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *taskUpdateServerHistory) execute(timezone string, server *models.Server) error {
|
|
|
|
if err := t.validatePayload(server); err != nil {
|
|
|
|
log.Debug(err)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
location, err := t.loadLocation(timezone)
|
|
|
|
if err != nil {
|
|
|
|
err = errors.Wrap(err, "taskUpdateServerHistory.execute")
|
|
|
|
log.Error(err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
entry := log.WithField("key", server.Key)
|
2021-04-27 18:06:38 +00:00
|
|
|
entry.Infof("taskUpdateServerHistory.execute: %s: update of the history has started...", server.Key)
|
2021-04-25 17:58:33 +00:00
|
|
|
err = (&workerUpdateServerHistory{
|
|
|
|
db: t.db.WithParam("SERVER", pg.Safe(server.Key)),
|
|
|
|
server: server,
|
|
|
|
location: location,
|
|
|
|
}).update()
|
|
|
|
if err != nil {
|
|
|
|
err = errors.Wrap(err, "taskUpdateServerHistory.execute")
|
|
|
|
entry.Error(err)
|
|
|
|
return err
|
|
|
|
}
|
2021-04-27 18:06:38 +00:00
|
|
|
entry.Infof("taskUpdateServerHistory.execute: %s: history has been updated", server.Key)
|
2021-04-25 17:58:33 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *taskUpdateServerHistory) validatePayload(server *models.Server) error {
|
|
|
|
if server == nil {
|
|
|
|
return errors.Errorf("taskUpdateServerHistory.validatePayload: Expected *models.Server, got nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type workerUpdateServerHistory struct {
|
2020-12-31 13:33:56 +00:00
|
|
|
db *pg.DB
|
|
|
|
server *models.Server
|
|
|
|
location *time.Location
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
|
|
|
|
2021-04-25 17:58:33 +00:00
|
|
|
func (w *workerUpdateServerHistory) update() error {
|
|
|
|
var players []*models.Player
|
2021-01-15 17:25:13 +00:00
|
|
|
if err := w.db.Model(&players).Where("exists = true").Select(); err != nil {
|
2021-04-25 17:58:33 +00:00
|
|
|
return errors.Wrap(err, "couldn't load players")
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
2020-06-25 12:58:12 +00:00
|
|
|
|
2021-01-15 17:25:13 +00:00
|
|
|
now := time.Now().In(w.location)
|
2020-12-31 13:33:56 +00:00
|
|
|
createDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
|
2021-04-25 17:58:33 +00:00
|
|
|
var ph []*models.PlayerHistory
|
2020-06-20 18:16:27 +00:00
|
|
|
for _, player := range players {
|
|
|
|
ph = append(ph, &models.PlayerHistory{
|
|
|
|
OpponentsDefeated: player.OpponentsDefeated,
|
|
|
|
PlayerID: player.ID,
|
|
|
|
TotalVillages: player.TotalVillages,
|
|
|
|
Points: player.Points,
|
|
|
|
Rank: player.Rank,
|
|
|
|
TribeID: player.TribeID,
|
2020-07-15 08:19:11 +00:00
|
|
|
CreateDate: createDate,
|
2020-06-20 18:16:27 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-04-25 17:58:33 +00:00
|
|
|
var tribes []*models.Tribe
|
2021-01-15 17:25:13 +00:00
|
|
|
if err := w.db.Model(&tribes).Where("exists = true").Select(); err != nil {
|
2021-04-25 17:58:33 +00:00
|
|
|
return errors.Wrap(err, "couldn't load tribes")
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
2021-04-25 17:58:33 +00:00
|
|
|
var th []*models.TribeHistory
|
2020-06-20 18:16:27 +00:00
|
|
|
for _, tribe := range tribes {
|
|
|
|
th = append(th, &models.TribeHistory{
|
|
|
|
OpponentsDefeated: tribe.OpponentsDefeated,
|
|
|
|
TribeID: tribe.ID,
|
|
|
|
TotalMembers: tribe.TotalMembers,
|
|
|
|
TotalVillages: tribe.TotalVillages,
|
|
|
|
Points: tribe.Points,
|
|
|
|
AllPoints: tribe.AllPoints,
|
|
|
|
Rank: tribe.Rank,
|
2020-06-21 09:27:56 +00:00
|
|
|
Dominance: tribe.Dominance,
|
2020-07-15 08:19:11 +00:00
|
|
|
CreateDate: createDate,
|
2020-06-20 18:16:27 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-01-15 17:25:13 +00:00
|
|
|
tx, err := w.db.Begin()
|
2020-06-20 18:16:27 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2021-04-27 18:06:38 +00:00
|
|
|
defer func(s *models.Server) {
|
|
|
|
if err := tx.Close(); err != nil {
|
|
|
|
log.Warn(errors.Wrapf(err, "%s: Couldn't rollback the transaction", s.Key))
|
|
|
|
}
|
|
|
|
}(w.server)
|
2020-06-20 18:16:27 +00:00
|
|
|
|
|
|
|
if len(ph) > 0 {
|
2021-01-15 17:25:13 +00:00
|
|
|
if _, err := w.db.Model(&ph).Insert(); err != nil {
|
2021-04-25 17:58:33 +00:00
|
|
|
return errors.Wrap(err, "couldn't insert players history")
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(th) > 0 {
|
2021-01-15 17:25:13 +00:00
|
|
|
if _, err := w.db.Model(&th).Insert(); err != nil {
|
2021-04-25 17:58:33 +00:00
|
|
|
return errors.Wrap(err, "couldn't insert tribes history")
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-15 17:25:13 +00:00
|
|
|
if _, err := tx.Model(w.server).
|
2020-06-20 18:16:27 +00:00
|
|
|
Set("history_updated_at = ?", time.Now()).
|
|
|
|
WherePK().
|
|
|
|
Returning("*").
|
|
|
|
Update(); err != nil {
|
2021-04-25 17:58:33 +00:00
|
|
|
return errors.Wrap(err, "couldn't update server")
|
2020-06-20 18:16:27 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return tx.Commit()
|
|
|
|
}
|