merge: observe selected diplomacy pairs

This commit is contained in:
2026-07-26 09:30:30 +00:00
+50 -4
View File
@@ -115,6 +115,36 @@ function comparisonNationCooldownSelectors(mixed $value, string $label): array
return array_values($result); return array_values($result);
} }
/** @return list<array{fromNationId: int, toNationId: int}> */
function comparisonDiplomacyPairSelectors(mixed $value, string $label): array
{
if ($value === null) {
return [];
}
if (!is_array($value)) {
throw new \InvalidArgumentException("{$label} must be an array");
}
$result = [];
foreach ($value as $entry) {
if (!is_array($entry)) {
throw new \InvalidArgumentException("{$label} entries must be objects");
}
$fromNationId = $entry['fromNationId'] ?? null;
$toNationId = $entry['toNationId'] ?? null;
if (!is_int($fromNationId) || $fromNationId < 1 || !is_int($toNationId) || $toNationId < 1) {
throw new \InvalidArgumentException(
"{$label} entries require positive fromNationId and toNationId",
);
}
$result["{$fromNationId}:{$toNationId}"] = [
'fromNationId' => $fromNationId,
'toNationId' => $toNationId,
];
}
ksort($result, SORT_STRING);
return array_values($result);
}
/** @param array<string, mixed> $row */ /** @param array<string, mixed> $row */
function comparisonPickRow(array $row, array $mapping, array $jsonKeys = []): array function comparisonPickRow(array $row, array $mapping, array $jsonKeys = []): array
{ {
@@ -168,6 +198,10 @@ function comparisonTurnStateSnapshot(array $request): array
$observe['nationCooldowns'] ?? [], $observe['nationCooldowns'] ?? [],
'nationCooldowns', 'nationCooldowns',
); );
$diplomacyPairSelectors = comparisonDiplomacyPairSelectors(
$observe['diplomacyPairs'] ?? [],
'diplomacyPairs',
);
if (!is_int($logAfterId) || $logAfterId < 0 || !is_int($messageAfterId) || $messageAfterId < 0) { if (!is_int($logAfterId) || $logAfterId < 0 || !is_int($messageAfterId) || $messageAfterId < 0) {
throw new \InvalidArgumentException('logAfterId and messageAfterId must be non-negative integers'); throw new \InvalidArgumentException('logAfterId and messageAfterId must be non-negative integers');
} }
@@ -363,16 +397,29 @@ function comparisonTurnStateSnapshot(array $request): array
comparisonRowsById('nation', 'nation', $nationIds), comparisonRowsById('nation', 'nation', $nationIds),
); );
$diplomacy = []; $diplomacyPairs = [];
foreach ($nationIds as $fromNationId) { foreach ($nationIds as $fromNationId) {
foreach ($nationIds as $toNationId) { foreach ($nationIds as $toNationId) {
if ($fromNationId === $toNationId) { if ($fromNationId === $toNationId) {
continue; continue;
} }
$diplomacyPairs["{$fromNationId}:{$toNationId}"] = [
'fromNationId' => $fromNationId,
'toNationId' => $toNationId,
];
}
}
foreach ($diplomacyPairSelectors as $pair) {
$diplomacyPairs["{$pair['fromNationId']}:{$pair['toNationId']}"] = $pair;
}
ksort($diplomacyPairs, SORT_STRING);
$diplomacy = [];
foreach ($diplomacyPairs as $pair) {
$row = $db->queryFirstRow( $row = $db->queryFirstRow(
'SELECT me, you, state, term, dead FROM diplomacy WHERE me = %i AND you = %i', 'SELECT me, you, state, term, dead FROM diplomacy WHERE me = %i AND you = %i',
$fromNationId, $pair['fromNationId'],
$toNationId, $pair['toNationId'],
); );
if ($row !== null) { if ($row !== null) {
$diplomacy[] = comparisonPickRow($row, [ $diplomacy[] = comparisonPickRow($row, [
@@ -384,7 +431,6 @@ function comparisonTurnStateSnapshot(array $request): array
]); ]);
} }
} }
}
$generalTurns = []; $generalTurns = [];
foreach ($generalIds as $generalId) { foreach ($generalIds as $generalId) {