поправлена отдача данных в vMix с помощью agent.exe

This commit is contained in:
2026-07-21 11:07:23 +03:00
parent 2b3c882d25
commit c646691142
2 changed files with 63 additions and 25 deletions

View File

@@ -1036,7 +1036,12 @@ function updatePeriodButtons() {
}
function addPlayerEvent(side, type, playerId, playerName) {
pushEvent(side, type, playerName, `Игрок #${playerId ?? ""}`, playerId);
const row =
findLineupRowByPlayerId(side, "starting", playerId) ||
findLineupRowByPlayerId(side, "bench", playerId);
const displayName = getRowDisplayName(row) || String(playerName || "").trim();
pushEvent(side, type, displayName, `Игрок #${playerId ?? ""}`, playerId);
}
@@ -1173,7 +1178,7 @@ function getPlayersForSide(side) {
.filter((row) => row.dataset.temporary !== "1")
.map((row) => ({
player_id: row.dataset.playerId || "",
player_name: row.dataset.playerName || "",
player_name: getRowDisplayName(row),
player_number: row.dataset.playerNumber || ""
}))
.filter((p) => p.player_name.trim() !== "");
@@ -1293,19 +1298,29 @@ function getScoreSum() {
}
function getSubOutName(payload) {
const explicit = String(payload.player_name_out || "").trim();
if (explicit) {
return explicit;
}
const raw = String(payload.player_name || "");
if (raw.includes("→")) {
return raw.split("→")[0].trim();
}
return String(payload.player_name_out || "").trim();
return "";
}
function getSubInName(payload) {
const explicit = String(payload.player_name_in || "").trim();
if (explicit) {
return explicit;
}
const raw = String(payload.player_name || "");
if (raw.includes("→")) {
return raw.split("→")[1].trim();
}
return String(payload.player_name_in || "").trim();
return "";
}
function escapeVmixValue(value) {
@@ -1425,8 +1440,12 @@ function getPlayerNumberByEvent(event) {
};
}
const row = findLineupRowByPlayerId(event.side, "starting", event.player_id)
|| findLineupRowByPlayerId(event.side, "bench", event.player_id);
const playerSide = event.type === "own_goal"
? getOppositeSide(event.side)
: event.side;
const row = findLineupRowByPlayerId(playerSide, "starting", event.player_id)
|| findLineupRowByPlayerId(playerSide, "bench", event.player_id);
return row?.dataset.playerNumber || "";
}
@@ -1602,6 +1621,10 @@ function renderEvents() {
];
const eventNumberData = getPlayerNumberByEvent(event);
const eventNameData = getPlayerNamesByEvent(event);
const vmixPlayerName = event.type === "sub"
? `${eventNameData.out || ""}${eventNameData.in || ""}`.trim()
: getVmixPlayerDisplayName(event);
const isClickable = clickableTypes.includes(event.type);
@@ -1612,10 +1635,12 @@ function renderEvents() {
side: event.side ?? "",
minute: event.minute ?? "",
seconds: event.seconds ?? 0,
player_name: event.player_name ?? "",
player_name: vmixPlayerName,
player_id: event.player_id ?? null,
player_out_id: event.player_out_id ?? null,
player_in_id: event.player_in_id ?? null,
player_name_out: eventNameData.out ?? "",
player_name_in: eventNameData.in ?? "",
player_number: typeof eventNumberData === "string" ? eventNumberData : "",
player_out_number: typeof eventNumberData === "object" ? (eventNumberData.out ?? "") : "",
player_in_number: typeof eventNumberData === "object" ? (eventNumberData.in ?? "") : "",
@@ -1665,9 +1690,13 @@ function getVmixPlayerDisplayName(event) {
return String(event?.player_name || "").trim();
}
const playerSide = event.type === "own_goal"
? getOppositeSide(event.side)
: event.side;
const row =
findLineupRowByPlayerId(event.side, "starting", event.player_id) ||
findLineupRowByPlayerId(event.side, "bench", event.player_id);
findLineupRowByPlayerId(playerSide, "starting", event.player_id) ||
findLineupRowByPlayerId(playerSide, "bench", event.player_id);
if (!row) {
return String(event.player_name || "").trim();
@@ -2324,9 +2353,13 @@ function getDisplayNameForEvent(event) {
}
if (event.player_id) {
const playerSide = event.type === "own_goal"
? getOppositeSide(event.side)
: event.side;
const row =
findLineupRowByPlayerId(event.side, "starting", event.player_id) ||
findLineupRowByPlayerId(event.side, "bench", event.player_id);
findLineupRowByPlayerId(playerSide, "starting", event.player_id) ||
findLineupRowByPlayerId(playerSide, "bench", event.player_id);
if (row) {
return getRowDisplayName(row);
@@ -2446,6 +2479,7 @@ function renderLineupRow(row) {
class="player-link-btn vmix-person-trigger"
data-vmix-person-type="player"
data-side="${escapeHtml(side)}"
data-name="${escapeHtml(displayName)}"
data-first-name="${escapeHtml(player.firstName || "")}"
data-last-name="${escapeHtml(player.lastName || "")}"
data-role="${escapeHtml(player.position || "")}"

View File

@@ -427,6 +427,7 @@
class="player-inline vmix-person-trigger player-link"
data-vmix-person-type="player"
data-side="home"
data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}"
data-first-name="{{ p.first_name or '' }}"
data-last-name="{{ p.last_name or '' }}"
data-role="{{ p.position or '' }}"
@@ -452,7 +453,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn goal"
title="Гол"
onclick="addPlayerEvent('home', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('home', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
>
</button>
@@ -460,7 +461,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn"
title="Автогол"
onclick="addPlayerEvent('home', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('home', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
>
АГ
</button>
@@ -468,7 +469,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn"
title="Пенальти"
onclick="addPlayerEvent('home', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('home', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
>
П
</button>
@@ -476,7 +477,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn sub"
title="Замена"
onclick="beginSubstitution('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)"
onclick="beginSubstitution('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)"
>
</button>
@@ -484,13 +485,13 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn yellow-card"
title="Жёлтая карточка"
onclick="addPlayerEvent('home', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('home', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
></button>
<button
type="button"
class="icon-btn red-card"
title="Красная карточка"
onclick="addPlayerEvent('home', 'red', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('home', 'red', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
></button>
</div>
</td>
@@ -543,6 +544,7 @@ data-role="{{ p.position or '' }}"
class="player-inline vmix-person-trigger player-link"
data-vmix-person-type="player"
data-side="home"
data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}"
data-first-name="{{ p.first_name or '' }}"
data-last-name="{{ p.last_name or '' }}"
data-role="{{ p.position or '' }}"
@@ -568,7 +570,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn sub"
title="Замена"
onclick="selectBenchPlayer('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)"
onclick="selectBenchPlayer('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)"
>
</button>
@@ -669,6 +671,7 @@ data-role="{{ p.position or '' }}"
class="player-inline vmix-person-trigger player-link"
data-vmix-person-type="player"
data-side="away"
data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}"
data-first-name="{{ p.first_name or '' }}"
data-last-name="{{ p.last_name or '' }}"
data-role="{{ p.position or '' }}"
@@ -694,7 +697,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn goal"
title="Гол"
onclick="addPlayerEvent('away', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('away', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
>
</button>
@@ -702,7 +705,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn"
title="Автогол"
onclick="addPlayerEvent('away', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('away', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
>
АГ
</button>
@@ -710,7 +713,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn"
title="Пенальти"
onclick="addPlayerEvent('away', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('away', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
>
П
</button>
@@ -718,7 +721,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn sub"
title="Замена"
onclick="beginSubstitution('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)"
onclick="beginSubstitution('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)"
>
</button>
@@ -726,13 +729,13 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn yellow-card"
title="Жёлтая карточка"
onclick="addPlayerEvent('away', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('away', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
></button>
<button
type="button"
class="icon-btn red-card"
title="Красная карточка"
onclick="addPlayerEvent('away', 'red', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})"
onclick="addPlayerEvent('away', 'red', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})"
></button>
</div>
</td>
@@ -785,6 +788,7 @@ data-role="{{ p.position or '' }}"
class="player-inline vmix-person-trigger player-link"
data-vmix-person-type="player"
data-side="away"
data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}"
data-first-name="{{ p.first_name or '' }}"
data-last-name="{{ p.last_name or '' }}"
data-role="{{ p.position or '' }}"
@@ -810,7 +814,7 @@ data-role="{{ p.position or '' }}"
type="button"
class="icon-btn sub"
title="Замена"
onclick="selectBenchPlayer('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)"
onclick="selectBenchPlayer('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)"
>
</button>