cron saves and calculates player.daily_growth

This commit is contained in:
Dawid Wysokiński 2020-06-22 13:48:44 +02:00 committed by Kichiyaki
parent e9ecec51e8
commit 829c45db31
3 changed files with 58 additions and 15 deletions

View File

@ -60,6 +60,18 @@ const (
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION check_daily_growth()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.exist = false THEN
NEW.daily_growth = 0;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
`
serverPGTriggers = `
DROP TRIGGER IF EXISTS ?0_tribe_changes ON ?0.players;
@ -68,6 +80,12 @@ const (
ON ?0.players
FOR EACH ROW
EXECUTE PROCEDURE ?0.log_tribe_change();
DROP TRIGGER IF EXISTS ?0_check_daily_growth ON ?0.players;
CREATE TRIGGER ?0_check_daily_growth
BEFORE UPDATE
ON ?0.players
FOR EACH ROW
EXECUTE PROCEDURE check_daily_growth();
DROP TRIGGER IF EXISTS ?0_update_ennoblement_old_and_new_owner_tribe_id ON ?0.ennoblements;
CREATE TRIGGER ?0_update_ennoblement_old_and_new_owner_tribe_id
BEFORE INSERT

View File

@ -60,3 +60,15 @@ func countPlayerVillages(villages []*models.Village) int {
}
return count
}
func getDateDifferenceInDays(t1, t2 time.Time) int {
diff := t1.Sub(t2)
return int(diff.Hours() / 24)
}
func calcPlayerDailyGrowth(diffInDays, points int) int {
if diffInDays > 0 {
return points / diffInDays
}
return 0
}

View File

@ -152,12 +152,14 @@ func (h *updateServerDataHandler) parsePlayerLine(line []string) (*models.Player
return player, nil
}
func (h *updateServerDataHandler) getPlayers(od map[int]*models.OpponentsDefeated) ([]*models.Player, error) {
func (h *updateServerDataHandler) getPlayers(od map[int]*models.OpponentsDefeated,
firstEnnoblementByID map[int]*models.Ennoblement) ([]*models.Player, error) {
url := h.baseURL + endpointPlayers
lines, err := getCSVData(url, false)
if err != nil {
return nil, errors.Wrapf(err, "unable to get data, url %s", url)
}
now := time.Now()
players := []*models.Player{}
for _, line := range lines {
@ -169,13 +171,18 @@ func (h *updateServerDataHandler) getPlayers(od map[int]*models.OpponentsDefeate
if ok {
player.OpponentsDefeated = *playerOD
}
firstEnnoblement, ok := firstEnnoblementByID[player.ID]
if ok {
diffInDays := getDateDifferenceInDays(now, firstEnnoblement.EnnobledAt)
player.DailyGrowth = calcPlayerDailyGrowth(diffInDays, player.Points)
}
players = append(players, player)
}
return players, nil
}
func (h *updateServerDataHandler) parseTribeLine(line []string, numberOfVillages int) (*models.Tribe, error) {
func (h *updateServerDataHandler) parseTribeLine(line []string) (*models.Tribe, error) {
if len(line) != 8 {
return nil, fmt.Errorf("Invalid line format (should be id,name,tag,members,villages,points,allpoints,rank)")
}
@ -217,7 +224,6 @@ func (h *updateServerDataHandler) parseTribeLine(line []string, numberOfVillages
if err != nil {
return nil, errors.Wrap(err, "tribe.Rank")
}
tribe.Dominance = float64(tribe.TotalVillages) / float64(numberOfVillages)
return tribe, nil
}
@ -230,7 +236,7 @@ func (h *updateServerDataHandler) getTribes(od map[int]*models.OpponentsDefeated
}
tribes := []*models.Tribe{}
for _, line := range lines {
tribe, err := h.parseTribeLine(line, numberOfVillages)
tribe, err := h.parseTribeLine(line)
if err != nil {
return nil, errors.Wrapf(err, "unable to parse line, url %s", url)
}
@ -238,6 +244,7 @@ func (h *updateServerDataHandler) getTribes(od map[int]*models.OpponentsDefeated
if ok {
tribe.OpponentsDefeated = *tribeOD
}
tribe.Dominance = float64(tribe.TotalVillages) / float64(numberOfVillages)
tribes = append(tribes, tribe)
}
return tribes, nil
@ -324,11 +331,11 @@ func (h *updateServerDataHandler) parseEnnoblementLine(line []string) (*models.E
return ennoblement, nil
}
func (h *updateServerDataHandler) getEnnoblements() ([]*models.Ennoblement, error) {
func (h *updateServerDataHandler) getEnnoblements() ([]*models.Ennoblement, map[int]*models.Ennoblement, error) {
url := h.baseURL + endpointConquer
lines, err := getCSVData(url, false)
if err != nil {
return nil, errors.Wrapf(err, "unable to get data, url %s", url)
return nil, nil, errors.Wrapf(err, "unable to get data, url %s", url)
}
lastEnnoblement := &models.Ennoblement{}
@ -337,20 +344,25 @@ func (h *updateServerDataHandler) getEnnoblements() ([]*models.Ennoblement, erro
Limit(1).
Order("ennobled_at DESC").
Select(); err != nil && err != pg.ErrNoRows {
return nil, errors.Wrapf(err, "cannot load last ennoblement, url %s", url)
return nil, nil, errors.Wrapf(err, "cannot load last ennoblement, url %s", url)
}
firstEnnoblementByID := make(map[int]*models.Ennoblement)
ennoblements := []*models.Ennoblement{}
for _, line := range lines {
ennoblement, err := h.parseEnnoblementLine(line)
if err != nil {
return nil, errors.Wrapf(err, "cannot parse line, url %s", url)
return nil, nil, errors.Wrapf(err, "cannot parse line, url %s", url)
}
if otherEnnoblement, ok := firstEnnoblementByID[ennoblement.NewOwnerID]; !ok ||
otherEnnoblement.EnnobledAt.After(ennoblement.EnnobledAt) {
firstEnnoblementByID[ennoblement.NewOwnerID] = ennoblement
}
if ennoblement.EnnobledAt.After(lastEnnoblement.EnnobledAt) {
ennoblements = append(ennoblements, ennoblement)
}
}
return ennoblements, nil
return ennoblements, firstEnnoblementByID, nil
}
func (h *updateServerDataHandler) getConfig() (*models.ServerConfig, error) {
@ -393,6 +405,11 @@ func (h *updateServerDataHandler) update() error {
return err
}
ennoblements, firstEnnoblementByID, err := h.getEnnoblements()
if err != nil {
return err
}
villages, err := h.getVillages()
if err != nil {
return err
@ -405,7 +422,7 @@ func (h *updateServerDataHandler) update() error {
}
numberOfTribes := len(tribes)
players, err := h.getPlayers(pod)
players, err := h.getPlayers(pod, firstEnnoblementByID)
if err != nil {
return err
}
@ -424,11 +441,6 @@ func (h *updateServerDataHandler) update() error {
return err
}
ennoblements, err := h.getEnnoblements()
if err != nil {
return err
}
tx, err := h.db.Begin()
if err != nil {
return err
@ -472,6 +484,7 @@ func (h *updateServerDataHandler) update() error {
Set("rank = EXCLUDED.rank").
Set("exist = EXCLUDED.exist").
Set("tribe_id = EXCLUDED.tribe_id").
Set("daily_growth = EXCLUDED.daily_growth").
Apply(attachODSetClauses).
Insert(); err != nil {
return errors.Wrap(err, "cannot insert players")