Fix regia basket e stabilità diretta iOS.
La regia remota non va più in 500 su basket/timed; iOS gestisce chiusura set, riconnessione RTMP e avanzamento quarti in modo affidabile. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -17,7 +17,10 @@ module Public
|
||||
@score = @session.score_state || Scoring::Engine.ensure_score_for(@session)
|
||||
@rules = Scoring::Rules.from_match(@match)
|
||||
@stream_closed = @session.terminal?
|
||||
@on_air = !@stream_closed && mediamtx_stream_playable?(@session)
|
||||
@on_air = !@stream_closed && (
|
||||
mediamtx_stream_playable?(@session) ||
|
||||
@session.status.in?(%w[connecting live reconnecting paused])
|
||||
)
|
||||
@regia_share_url = request.original_url
|
||||
@regia_share_title = "Regia — #{@team.name} vs #{@match.opponent_name}"
|
||||
@live_share_url = @session.share_url
|
||||
@@ -70,17 +73,18 @@ module Public
|
||||
score = @session.score_state
|
||||
closed = @session.terminal?
|
||||
playable = !closed && mediamtx_stream_playable?(@session)
|
||||
publisher_online = !closed && mediamtx_publisher_online?(@session)
|
||||
{
|
||||
status: @session.status,
|
||||
paused: @session.paused?,
|
||||
stream_closed: closed,
|
||||
live: !closed && (@session.live? || @session.paused? || mediamtx_publisher_online?(@session)),
|
||||
on_air: playable,
|
||||
publisher_online: !closed && mediamtx_publisher_online?(@session),
|
||||
live: !closed && (@session.live? || @session.paused? || publisher_online),
|
||||
on_air: playable || (!closed && @session.status.in?(%w[connecting live reconnecting paused])),
|
||||
publisher_online: publisher_online,
|
||||
ended_at: @session.ended_at,
|
||||
home_name: @session.match.team.name,
|
||||
away_name: @session.match.opponent_name,
|
||||
points_target: Scoring::Rules.from_match(@session.match).points_target(score&.current_set || 1),
|
||||
points_target: Scoring::Rules.points_target_for_match(@session.match, current_set: score&.current_set || 1),
|
||||
score: score&.as_cable_payload
|
||||
}
|
||||
end
|
||||
|
||||
@@ -45,6 +45,11 @@ module Scoring
|
||||
current_set >= max_sets ? @points_deciding_set : @points_per_set
|
||||
end
|
||||
|
||||
def self.points_target_for_match(match, current_set: 1)
|
||||
rules = from_match(match)
|
||||
rules.is_a?(Rules) ? rules.points_target(current_set) : 0
|
||||
end
|
||||
|
||||
def set_winner_from_points(home_points:, away_points:, current_set:)
|
||||
target = points_target(current_set)
|
||||
if home_points >= target && (home_points - away_points) >= @min_point_lead
|
||||
|
||||
@@ -93,4 +93,4 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/regia.js?v=6"></script>
|
||||
<script src="/regia.js?v=7"></script>
|
||||
|
||||
@@ -174,7 +174,10 @@
|
||||
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
||||
body: JSON.stringify({ cmd: action })
|
||||
});
|
||||
if (!res.ok) throw new Error("Errore aggiornamento punteggio");
|
||||
if (!res.ok) {
|
||||
const body = await res.json().catch(() => ({}));
|
||||
throw new Error(body.error || "Errore aggiornamento punteggio");
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,43 @@ RSpec.describe "Public regia", type: :request do
|
||||
expect(session.score_state.reload.home_points).to eq(1)
|
||||
end
|
||||
|
||||
it "aggiorna il punteggio basket via API senza errore 500" do
|
||||
basket_team = club.teams.create!(name: "U13 Basket", sport_key: "basket")
|
||||
basket_match = basket_team.matches.create!(
|
||||
opponent_name: "Avversario",
|
||||
sport: "basket",
|
||||
scoring_rules: { "periods" => 4, "period_duration_secs" => 600, "overtime_duration_secs" => 300 }
|
||||
)
|
||||
basket_session = StreamSession.create!(match: basket_match, user: user, platform: "matchlivetv", status: "live")
|
||||
basket_session.create_score_state!(
|
||||
board_type: "basket",
|
||||
home_sets: 0,
|
||||
away_sets: 0,
|
||||
home_points: 0,
|
||||
away_points: 0,
|
||||
current_set: 1,
|
||||
data: {
|
||||
"period" => 1,
|
||||
"clock_secs" => 600,
|
||||
"clock_running" => false,
|
||||
"home_score" => 0,
|
||||
"away_score" => 0,
|
||||
"overtime" => false
|
||||
}
|
||||
)
|
||||
token = Sessions::RegiaAccess.new(basket_session).issue_token!
|
||||
|
||||
patch public_regia_score_path(token), params: { cmd: "home_point" }, as: :json
|
||||
expect(response).to have_http_status(:ok)
|
||||
body = response.parsed_body
|
||||
expect(body.dig("score", "home_points")).to eq(1)
|
||||
expect(body["points_target"]).to eq(0)
|
||||
|
||||
get public_regia_status_path(token)
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(response.parsed_body.dig("score", "board_type")).to eq("basket")
|
||||
end
|
||||
|
||||
it "mette in pausa e riprende la diretta" do
|
||||
mtx = instance_double(
|
||||
Mediamtx::Client,
|
||||
|
||||
Reference in New Issue
Block a user