2019-08-09 23:13:45 -07:00
|
|
|
// Copyright 2019 Team 254. All Rights Reserved.
|
|
|
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
|
|
|
//
|
|
|
|
|
// Functions for managing awards and their associated lower thirds.
|
|
|
|
|
|
|
|
|
|
package tournament
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2021-05-16 11:00:29 -07:00
|
|
|
"github.com/Team254/cheesy-arena-lite/model"
|
2019-08-09 23:13:45 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Creates or updates the given award, depending on whether or not it already exists.
|
|
|
|
|
func CreateOrUpdateAward(database *model.Database, award *model.Award, createIntroLowerThird bool) error {
|
|
|
|
|
// Validate the award data.
|
|
|
|
|
if award.AwardName == "" {
|
|
|
|
|
return fmt.Errorf("Award name cannot be blank.")
|
|
|
|
|
}
|
|
|
|
|
var team *model.Team
|
|
|
|
|
if award.TeamId > 0 {
|
|
|
|
|
team, _ = database.GetTeamById(award.TeamId)
|
|
|
|
|
if team == nil {
|
|
|
|
|
return fmt.Errorf("Team %d is not present at this event.", award.TeamId)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
if award.Id == 0 {
|
|
|
|
|
err = database.CreateAward(award)
|
|
|
|
|
} else {
|
|
|
|
|
err = database.SaveAward(award)
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create or update associated lower thirds.
|
|
|
|
|
awardIntroLowerThird := model.LowerThird{TopText: award.AwardName, AwardId: award.Id}
|
|
|
|
|
awardWinnerLowerThird := model.LowerThird{TopText: award.AwardName, BottomText: award.PersonName,
|
|
|
|
|
AwardId: award.Id}
|
|
|
|
|
if team != nil {
|
|
|
|
|
if award.PersonName == "" {
|
|
|
|
|
awardWinnerLowerThird.BottomText = fmt.Sprintf("Team %d, %s", team.Id, team.Nickname)
|
|
|
|
|
} else {
|
|
|
|
|
awardWinnerLowerThird.BottomText = fmt.Sprintf("%s – Team %d, %s", award.PersonName, team.Id,
|
|
|
|
|
team.Nickname)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if awardWinnerLowerThird.BottomText == "" {
|
|
|
|
|
awardWinnerLowerThird.BottomText = "(No awardee assigned yet)"
|
|
|
|
|
}
|
|
|
|
|
lowerThirds, err := database.GetLowerThirdsByAwardId(award.Id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
bottomIndex := 0
|
|
|
|
|
if createIntroLowerThird {
|
|
|
|
|
if err = createOrUpdateAwardLowerThird(database, &awardIntroLowerThird, lowerThirds, 0); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
bottomIndex++
|
|
|
|
|
}
|
|
|
|
|
if err = createOrUpdateAwardLowerThird(database, &awardWinnerLowerThird, lowerThirds, bottomIndex); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Deletes the given award and any associated lower thirds.
|
|
|
|
|
func DeleteAward(database *model.Database, awardId int) error {
|
|
|
|
|
var award *model.Award
|
|
|
|
|
award, err := database.GetAwardById(awardId)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if award == nil {
|
|
|
|
|
return fmt.Errorf("Award with ID %d does not exist.", awardId)
|
|
|
|
|
}
|
|
|
|
|
if err = database.DeleteAward(award); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Delete lower thirds.
|
|
|
|
|
lowerThirds, err := database.GetLowerThirdsByAwardId(award.Id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, lowerThird := range lowerThirds {
|
|
|
|
|
if err = database.DeleteLowerThird(&lowerThird); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Generates awards and lower thirds for the tournament winners and finalists.
|
|
|
|
|
func CreateOrUpdateWinnerAndFinalistAwards(database *model.Database, winnerAllianceId, finalistAllianceId int) error {
|
|
|
|
|
var winnerAllianceTeams, finalistAllianceTeams []model.AllianceTeam
|
|
|
|
|
var err error
|
|
|
|
|
if winnerAllianceTeams, err = database.GetTeamsByAlliance(winnerAllianceId); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if finalistAllianceTeams, err = database.GetTeamsByAlliance(finalistAllianceId); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if len(winnerAllianceTeams) == 0 || len(finalistAllianceTeams) == 0 {
|
|
|
|
|
return fmt.Errorf("Input alliances do not contain any teams.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Clear out any awards that may exist if the final match was scored more than once.
|
|
|
|
|
winnerAwards, err := database.GetAwardsByType(model.WinnerAward)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
finalistAwards, err := database.GetAwardsByType(model.FinalistAward)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, award := range append(winnerAwards, finalistAwards...) {
|
|
|
|
|
if err = DeleteAward(database, award.Id); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create the finalist awards first since they're usually presented first.
|
2019-09-15 02:09:23 -07:00
|
|
|
finalistAward := model.Award{AwardName: "Finalist", Type: model.FinalistAward,
|
2019-08-09 23:13:45 -07:00
|
|
|
TeamId: finalistAllianceTeams[0].TeamId}
|
|
|
|
|
if err = CreateOrUpdateAward(database, &finalistAward, true); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, allianceTeam := range finalistAllianceTeams[1:] {
|
|
|
|
|
finalistAward.Id = 0
|
|
|
|
|
finalistAward.TeamId = allianceTeam.TeamId
|
|
|
|
|
if err = CreateOrUpdateAward(database, &finalistAward, false); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create the winner awards.
|
2019-09-15 02:09:23 -07:00
|
|
|
winnerAward := model.Award{AwardName: "Winner", Type: model.WinnerAward,
|
2019-08-09 23:13:45 -07:00
|
|
|
TeamId: winnerAllianceTeams[0].TeamId}
|
|
|
|
|
if err = CreateOrUpdateAward(database, &winnerAward, true); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, allianceTeam := range winnerAllianceTeams[1:] {
|
|
|
|
|
winnerAward.Id = 0
|
|
|
|
|
winnerAward.TeamId = allianceTeam.TeamId
|
|
|
|
|
if err = CreateOrUpdateAward(database, &winnerAward, false); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func createOrUpdateAwardLowerThird(database *model.Database, lowerThird *model.LowerThird,
|
|
|
|
|
existingLowerThirds []model.LowerThird, index int) error {
|
|
|
|
|
if index < len(existingLowerThirds) {
|
|
|
|
|
lowerThird.Id = existingLowerThirds[index].Id
|
|
|
|
|
lowerThird.DisplayOrder = existingLowerThirds[index].DisplayOrder
|
|
|
|
|
return database.SaveLowerThird(lowerThird)
|
|
|
|
|
} else {
|
|
|
|
|
lowerThird.DisplayOrder = database.GetNextLowerThirdDisplayOrder()
|
|
|
|
|
return database.CreateLowerThird(lowerThird)
|
|
|
|
|
}
|
|
|
|
|
}
|