diff options
Diffstat (limited to 'web/pw-server/src/lib/components/log_viewer')
-rw-r--r-- | web/pw-server/src/lib/components/log_viewer/LogTurn.svelte | 27 | ||||
-rw-r--r-- | web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte | 38 |
2 files changed, 58 insertions, 7 deletions
diff --git a/web/pw-server/src/lib/components/log_viewer/LogTurn.svelte b/web/pw-server/src/lib/components/log_viewer/LogTurn.svelte index 80367f4..bfd2a37 100644 --- a/web/pw-server/src/lib/components/log_viewer/LogTurn.svelte +++ b/web/pw-server/src/lib/components/log_viewer/LogTurn.svelte @@ -1,10 +1,11 @@ <script lang="ts"> import type { PlayerLogTurn } from "$lib/log_parser"; import Fa from "svelte-fa"; - import { faAngleRight, faAngleDown } from "@fortawesome/free-solid-svg-icons"; + import { faAngleRight, faAngleDown, faCopy } from "@fortawesome/free-solid-svg-icons"; export let turnNum: number; export let logTurn: PlayerLogTurn; + export let copyTurn: () => void; let expanded = false; const PLURAL_MAP = { @@ -49,8 +50,13 @@ </div> {#if expanded} <div class="turn-content"> - {#if logTurn.action?.type === "dispatches"} + <div class="copy-turn" on:click={copyTurn}> + <Fa icon={faCopy} /> + copy turn to clipboard + </div> + {#if logTurn.action?.type === "dispatches" && logTurn.action.dispatches.length > 0} <div class="dispatches-container"> + <div class="dispatches-header">dispatches</div> {#each logTurn.action.dispatches as dispatch} <div class="dispatch"> <div class="dispatch-text"> @@ -102,6 +108,16 @@ background-color: #333; } + .copy-turn { + margin: 4px 0; + } + + .copy-turn:hover { + text-decoration: underline; + cursor: pointer; + color: #fff; + } + .turn-header-text { color: #eee; font-size: 14px; @@ -111,15 +127,22 @@ .turn-content { margin-bottom: 12px; + margin-left: 8px; } .turn-error { color: red; } + .dispatches-header { + color: #fff; + padding-top: 4px; + } + .dispatch { display: flex; justify-content: space-between; + padding-left: 8px; } .dispatch-error { diff --git a/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte b/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte index 450fdf2..f21a038 100644 --- a/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte +++ b/web/pw-server/src/lib/components/log_viewer/PlayerLog.svelte @@ -3,11 +3,39 @@ import LogTurn from "./LogTurn.svelte"; export let matchLog: string; + export let matchData: object; export let playerId: number; let playerLog: PlayerLog; let showRawStderr = false; + async function copyTurn(turnNum: number) { + // find state for turnNum + let gamestate = matchLog + .split("\n") + .slice(0, -1) + .map((line) => JSON.parse(line)) + .filter((json) => json["type"] == "gamestate") + .at(turnNum); + + let numPlayers = matchData["players"].length; + let rotatePlayerNum = (playerNum: number | null) => { + if (playerNum === null) { + return null; + } + return ((numPlayers + playerNum - playerId) % numPlayers) + 1; + }; + + gamestate["planets"].forEach((planet) => { + planet["owner"] = rotatePlayerNum(planet["owner"]); + }); + gamestate["expeditions"].forEach((expedition) => { + expedition["owner"] = rotatePlayerNum(expedition["owner"]); + }); + + await navigator.clipboard.writeText(JSON.stringify(gamestate)); + } + $: if (matchLog) { playerLog = parsePlayerLog(playerId, matchLog); } else { @@ -23,11 +51,11 @@ {:else} <!-- The log should be rerendered when playerId changes --> {#key playerId} - <div class="log-contents"> - {#each playerLog as logTurn, turnNum} - <LogTurn {logTurn} {turnNum} /> - {/each} - </div> + <div class="log-contents"> + {#each playerLog as logTurn, turnNum} + <LogTurn {logTurn} {turnNum} copyTurn={() => copyTurn(turnNum)} /> + {/each} + </div> {/key} {/if} </div> |