from __future__ import annotations import json import socket from typing import Any HOST = "127.0.0.1" PORT = 7777 def log(message: str) -> None: print(message, flush=True) def handle_packet(packet: dict[str, Any]) -> None: packet_type = packet.get("type") if packet_type == "welcome": log(f"Welcome packet: {packet}") elif packet_type == "transform": log(f"Received transform: {packet}") else: log(f"Received packet: {packet}") def handle_line(line: str) -> None: if not line: return try: packet = json.loads(line) except json.JSONDecodeError as error: log(f"Invalid JSON from server: {error}: {line}") return if not isinstance(packet, dict): log(f"Invalid packet from server: expected JSON object: {packet}") return handle_packet(packet) def main() -> None: # This fake client lets us verify server broadcast behavior before trying to # run and coordinate a second Fallout 4/F4SE instance. with socket.create_connection((HOST, PORT)) as connection: log(f"Connected to Fallout 4 Together server at {HOST}:{PORT}") buffer = "" while True: chunk = connection.recv(4096) if not chunk: log("Server disconnected.") break buffer += chunk.decode("utf-8", errors="replace") while "\n" in buffer: line, buffer = buffer.split("\n", 1) handle_line(line.strip()) if __name__ == "__main__": try: main() except ConnectionRefusedError: log(f"Could not connect to Fallout 4 Together server at {HOST}:{PORT}. Is server.py running?") except KeyboardInterrupt: log("\nFake client stopped.") except OSError as error: log(f"Disconnected from server: {error}")