Skip to content

Commit

Permalink
Merge branch 'Kython89-selection-rankings'
Browse files Browse the repository at this point in the history
  • Loading branch information
patfair committed Jun 16, 2024
2 parents b09658b + c5d1366 commit ed84e9f
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 30 deletions.
1 change: 1 addition & 0 deletions field/arena.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ type Arena struct {
SavedRankings game.Rankings
AllianceStationDisplayMode string
AllianceSelectionAlliances []model.Alliance
AllianceSelectionRankedTeams []model.AllianceSelectionRankedTeam
AllianceSelectionShowTimer bool
AllianceSelectionTimeRemainingSec int
PlayoffTournament *playoff.PlayoffTournament
Expand Down
2 changes: 2 additions & 0 deletions field/arena_notifiers.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,12 @@ func (arena *Arena) generateAllianceSelectionMessage() any {
Alliances []model.Alliance
ShowTimer bool
TimeRemainingSec int
RankedTeams []model.AllianceSelectionRankedTeam
}{
arena.AllianceSelectionAlliances,
arena.AllianceSelectionShowTimer,
arena.AllianceSelectionTimeRemainingSec,
arena.AllianceSelectionRankedTeams,
}
}

Expand Down
6 changes: 6 additions & 0 deletions model/alliance.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ type Alliance struct {
Lineup [3]int
}

type AllianceSelectionRankedTeam struct {
Rank int
TeamId int
Picked bool
}

func (database *Database) CreateAlliance(alliance *Alliance) error {
return database.allianceTable.create(alliance)
}
Expand Down
2 changes: 2 additions & 0 deletions model/event_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ type EventSettings struct {
NumPlayoffAlliances int
SelectionRound2Order string
SelectionRound3Order string
SelectionShowUnpickedTeams bool
TbaDownloadEnabled bool
TbaPublishingEnabled bool
TbaEventCode string
Expand Down Expand Up @@ -70,6 +71,7 @@ func (database *Database) GetEventSettings() (*EventSettings, error) {
NumPlayoffAlliances: 8,
SelectionRound2Order: "L",
SelectionRound3Order: "",
SelectionShowUnpickedTeams: false,
TbaDownloadEnabled: true,
ApChannel: 36,
WarmupDurationSec: game.MatchTiming.WarmupDurationSec,
Expand Down
31 changes: 31 additions & 0 deletions static/css/audience_display.css
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,37 @@ html {
max-width: 800px;
max-height: 400px;
}
#allianceRankingsCentering {
position: absolute;
height: 100%;
left: 3em;
top: 3em;
}
#allianceRankings {
max-width: 11em;
max-height: 92%;
display: flex;
flex-flow: column wrap;
overflow: hidden;
background-color: #fff;
border: 2px solid #222;
font-size: 2em;
font-family: "FuturaLT";
}
.unpicked {
width: 5.5em;
display: flex;
justify-content: start;
}
.unpicked-rank {
width: 1.8em;
text-align: right;
color: #999;
}
.unpicked-team {
margin-left: 0.3em;
color: #222;
}
#allianceSelectionCentering {
position: absolute;
height: 100%;
Expand Down
14 changes: 14 additions & 0 deletions static/js/audience_display.js
Original file line number Diff line number Diff line change
Expand Up @@ -328,13 +328,24 @@ const handlePlaySound = function(sound) {
// Handles a websocket message to update the alliance selection screen.
const handleAllianceSelection = function(data) {
const alliances = data.Alliances;
const rankedTeams = data.RankedTeams;
if (alliances && alliances.length > 0) {
const numColumns = alliances[0].TeamIds.length + 1;
$.each(alliances, function(k, v) {
v.Index = k + 1;
});
$("#allianceSelection").html(allianceSelectionTemplate({alliances: alliances, numColumns: numColumns}));
}
if (rankedTeams) {
let text = "";
$.each(rankedTeams, function(i, v) {
if (!v.Picked) {
text += `<div class="unpicked"><div class="unpicked-rank">${v.Rank}.</div>` +
`<div class="unpicked-team">${v.TeamId}</div></div>`;
}
});
$("#allianceRankings").html(text);
}

if (data.ShowTimer) {
$("#allianceSelectionTimer").text(getCountdownString(data.TimeRemainingSec));
Expand Down Expand Up @@ -373,11 +384,14 @@ const handleLowerThird = function(data) {

const transitionAllianceSelectionToBlank = function(callback) {
$('#allianceSelectionCentering').transition({queue: false, right: "-60em"}, 500, "ease", callback);
$('#allianceRankingsCentering.enabled').transition({queue:false, left: "-60em"}, 500, "ease");
};

const transitionBlankToAllianceSelection = function(callback) {
$('#allianceSelectionCentering').css("right","-60em").show();
$('#allianceSelectionCentering').transition({queue: false, right: "3em"}, 500, "ease", callback);
$('#allianceRankingsCentering.enabled').css("left", "-60em").show();
$('#allianceRankingsCentering.enabled').transition({queue: false, left: "3em"}, 500, "ease");
};

const transitionBlankToBracket = function(callback) {
Expand Down
3 changes: 3 additions & 0 deletions templates/audience_display.html
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,9 @@
<div id="allianceSelectionCentering" style="display: none;">
<div id="allianceSelection"></div>
</div>
<div id="allianceRankingsCentering" {{if .SelectionShowUnpickedTeams}}class="enabled"{{end}} style="display: none;">
<div id="allianceRankings"></div>
</div>
<div id="lowerThird">
<img id="lowerThirdLogo" src="/static/img/lower-third-logo.png" alt="logo" />
<div id="lowerThirdTop"></div>
Expand Down
9 changes: 9 additions & 0 deletions templates/setup_settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,15 @@
</div>
</div>
</div>
<div class="row mb-3">
<label class="col-lg-8 control-label" for="selectionShowUnpickedTeams">
Show Unpicked Teams On Overlay
</label>
<div class="col-lg-1 checkbox">
<input type="checkbox" id="selectionShowUnpickedTeams"
name="selectionShowUnpickedTeams"{{if .SelectionShowUnpickedTeams}} checked{{end}}>
</div>
</div>
</fieldset>
<fieldset class="mb-4">
<legend>Automatic Team Info Download</legend>
Expand Down
33 changes: 13 additions & 20 deletions web/alliance_selection.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,6 @@ import (
"time"
)

type RankedTeam struct {
Rank int
TeamId int
Picked bool
}

// Global var to hold the team rankings during the alliance selection.
var cachedRankedTeams []*RankedTeam

// Global var to hold configurable time limit for selections. A value of zero disables the timer.
var allianceSelectionTimeLimitSec = 0

Expand Down Expand Up @@ -56,9 +47,8 @@ func (web *Web) allianceSelectionPostHandler(w http.ResponseWriter, r *http.Requ
allianceSelectionTimeLimitSec, _ = strconv.Atoi(r.PostFormValue("timeLimitSec"))

// Reset picked state for each team in preparation for reconstructing it.
newRankedTeams := make([]*RankedTeam, len(cachedRankedTeams))
for i, team := range cachedRankedTeams {
newRankedTeams[i] = &RankedTeam{team.Rank, team.TeamId, false}
for i := range web.arena.AllianceSelectionRankedTeams {
web.arena.AllianceSelectionRankedTeams[i].Picked = false
}

// Iterate through all selections and update the alliances.
Expand All @@ -74,15 +64,15 @@ func (web *Web) allianceSelectionPostHandler(w http.ResponseWriter, r *http.Requ
return
}
found := false
for _, team := range newRankedTeams {
for k, team := range web.arena.AllianceSelectionRankedTeams {
if team.TeamId == teamId {
if team.Picked {
web.renderAllianceSelection(w, r,
fmt.Sprintf("Team %d is already part of an alliance.", teamId))
return
}
found = true
team.Picked = true
web.arena.AllianceSelectionRankedTeams[k].Picked = true
web.arena.AllianceSelectionAlliances[i].TeamIds[j] = teamId
break
}
Expand All @@ -100,7 +90,6 @@ func (web *Web) allianceSelectionPostHandler(w http.ResponseWriter, r *http.Requ
}
}
}
cachedRankedTeams = newRankedTeams

if allianceSelectionTicker != nil {
allianceSelectionTicker.Stop()
Expand Down Expand Up @@ -157,9 +146,13 @@ func (web *Web) allianceSelectionStartHandler(w http.ResponseWriter, r *http.Req
handleWebErr(w, err)
return
}
cachedRankedTeams = make([]*RankedTeam, len(rankings))
web.arena.AllianceSelectionRankedTeams = make([]model.AllianceSelectionRankedTeam, len(rankings))
for i, ranking := range rankings {
cachedRankedTeams[i] = &RankedTeam{i + 1, ranking.TeamId, false}
web.arena.AllianceSelectionRankedTeams[i] = model.AllianceSelectionRankedTeam{
Rank: i + 1,
TeamId: ranking.TeamId,
Picked: false,
}
}

web.arena.AllianceSelectionNotifier.Notify()
Expand Down Expand Up @@ -191,7 +184,7 @@ func (web *Web) allianceSelectionResetHandler(w http.ResponseWriter, r *http.Req
}

web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.AllianceSelectionRankedTeams = []model.AllianceSelectionRankedTeam{}
web.arena.AllianceSelectionNotifier.Notify()
http.Redirect(w, r, "/alliance_selection", 303)
}
Expand Down Expand Up @@ -347,15 +340,15 @@ func (web *Web) renderAllianceSelection(w http.ResponseWriter, r *http.Request,
data := struct {
*model.EventSettings
Alliances []model.Alliance
RankedTeams []*RankedTeam
RankedTeams []model.AllianceSelectionRankedTeam
NextRow int
NextCol int
ErrorMessage string
TimeLimitSec int
}{
web.arena.EventSettings,
web.arena.AllianceSelectionAlliances,
cachedRankedTeams,
web.arena.AllianceSelectionRankedTeams,
nextRow,
nextCol,
errorMessage,
Expand Down
10 changes: 1 addition & 9 deletions web/alliance_selection_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ import (
func TestAllianceSelection(t *testing.T) {
web := setupTestWeb(t)

web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.EventSettings.PlayoffType = model.SingleEliminationPlayoff
web.arena.EventSettings.NumPlayoffAlliances = 15
web.arena.EventSettings.SelectionRound3Order = "L"
Expand Down Expand Up @@ -104,8 +102,6 @@ func TestAllianceSelection(t *testing.T) {
func TestAllianceSelectionErrors(t *testing.T) {
web := setupTestWeb(t)

web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.EventSettings.PlayoffType = model.SingleEliminationPlayoff
web.arena.EventSettings.NumPlayoffAlliances = 2
for i := 1; i <= 6; i++ {
Expand Down Expand Up @@ -157,7 +153,7 @@ func TestAllianceSelectionErrors(t *testing.T) {
assert.Equal(t, 200, recorder.Code)
assert.Contains(t, recorder.Body.String(), "already been finalized")
web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.AllianceSelectionRankedTeams = []model.AllianceSelectionRankedTeam{}
recorder = web.postHttpResponse("/alliance_selection/start", "")
assert.Equal(t, 200, recorder.Code)
assert.Contains(t, recorder.Body.String(), "already been finalized")
Expand All @@ -166,8 +162,6 @@ func TestAllianceSelectionErrors(t *testing.T) {
func TestAllianceSelectionReset(t *testing.T) {
web := setupTestWeb(t)

web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.EventSettings.PlayoffType = model.SingleEliminationPlayoff
web.arena.EventSettings.NumPlayoffAlliances = 2
for i := 1; i <= 6; i++ {
Expand Down Expand Up @@ -223,8 +217,6 @@ func TestAllianceSelectionReset(t *testing.T) {
func TestAllianceSelectionAutofocus(t *testing.T) {
web := setupTestWeb(t)

web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.EventSettings.PlayoffType = model.SingleEliminationPlayoff
web.arena.EventSettings.NumPlayoffAlliances = 2

Expand Down
3 changes: 2 additions & 1 deletion web/setup_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) {
eventSettings.NumPlayoffAlliances = numAlliances
eventSettings.SelectionRound2Order = r.PostFormValue("selectionRound2Order")
eventSettings.SelectionRound3Order = r.PostFormValue("selectionRound3Order")
eventSettings.SelectionShowUnpickedTeams = r.PostFormValue("selectionShowUnpickedTeams") == "on"
eventSettings.TbaDownloadEnabled = r.PostFormValue("tbaDownloadEnabled") == "on"
eventSettings.TbaPublishingEnabled = r.PostFormValue("tbaPublishingEnabled") == "on"
eventSettings.TbaEventCode = r.PostFormValue("tbaEventCode")
Expand Down Expand Up @@ -256,7 +257,7 @@ func (web *Web) clearDbHandler(w http.ResponseWriter, r *http.Request) {
return
}
web.arena.AllianceSelectionAlliances = []model.Alliance{}
cachedRankedTeams = []*RankedTeam{}
web.arena.AllianceSelectionRankedTeams = []model.AllianceSelectionRankedTeam{}
}

http.Redirect(w, r, "/setup/settings", 303)
Expand Down

0 comments on commit ed84e9f

Please sign in to comment.