Implement projected time
Some checks failed
CI / scan_ruby (push) Successful in 16s
CI / scan_js (push) Successful in 13s
CI / lint (push) Successful in 13s
CI / test (push) Failing after 35s

This commit is contained in:
sto
2025-11-14 12:13:09 +01:00
parent f91145637f
commit b88460ae71
16 changed files with 114 additions and 48 deletions

View File

@@ -26,9 +26,7 @@ class CompletionsController < ApplicationController
@completion = Completion.new(completion_params)
@completion.contest_id = @contest.id
if @completion.save
if @completion.display_time_from_start.present?
extend_completions!(@completion.contestant)
end
extend_completions!(@completion.contestant)
if @contestant && !params[:completion].key?(:message_id)
redirect_to edit_contest_contestant_path(@contest, @contestant), notice: t("completions.new.notice")
else

View File

@@ -9,24 +9,38 @@ module CompletionsConcern
end
def display_time(time)
if time == nil
return ""
end
h = time / 3600
m = (time % 3600) / 60
s = (time % 3600) % 60
if h > 0
return h.to_s + ":" + pad(m) + ":" + pad(s)
elsif m > 0
return m.to_s + ":" + pad(s)
end
s.to_s
m.to_s + ":" + pad(s)
end
def extend_completions!(contestant)
current_time_from_start = 0
contestant.completions.order(:time_seconds).each do |completion|
completion.update(display_time_from_start: display_time(completion.time_seconds),
display_relative_time: display_time(completion.time_seconds - current_time_from_start))
current_time_from_start = completion.time_seconds
completions = contestant.completions
puzzles = contestant.contest.puzzles
if puzzles.length > 1
current_time_from_start = 0
completions.order(:time_seconds).each do |completion|
completion.update(display_time_from_start: display_time(completion.time_seconds),
display_relative_time: display_time(completion.time_seconds - current_time_from_start))
current_time_from_start = completion.time_seconds
end
contestant.update(display_time: display_time(current_time_from_start), time_seconds: current_time_from_start)
elsif puzzles.length == 1 && completions.length >= 1
if completions[0].remaining_pieces != nil
contestant.update(
display_time: "#{display_time(completions[0].time_seconds)} - #{puzzles[0].pieces - completions[0].remaining_pieces}p",
time_seconds: completions[0].projected_time
)
else
contestant.update(display_time: display_time(completions[0].time_seconds), time_seconds: completions[0].time_seconds)
end
end
contestant.update(display_time: display_time(current_time_from_start), time_seconds: current_time_from_start)
end
end

View File

@@ -160,6 +160,7 @@ class ContestsController < ApplicationController
contestant = Contestant.create(contest: @contest, name: @offline.name, offline: @offline)
Completion.create(contest: @contest,
contestant: contestant,
offline: @offline,
puzzle: @contest.puzzles[0],
completed: @offline.completed,
display_time_from_start: dp,