From 88a225764a541bb89a37037ed199dd685d51ef85 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 9 Sep 2022 21:28:24 +0200 Subject: [PATCH] FF1: fix printjson --- CommonClient.py | 8 +++++++- FF1Client.py | 45 ++++++++++++++++++++------------------------- MultiServer.py | 5 ++++- SNIClient.py | 3 --- Starcraft2Client.py | 8 +++----- 5 files changed, 34 insertions(+), 35 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index 574da16f..94d4359d 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -5,6 +5,7 @@ import urllib.parse import sys import typing import time +import functools import ModuleUpdate ModuleUpdate.update() @@ -17,7 +18,8 @@ if __name__ == "__main__": Utils.init_logging("TextClient", exception_logger="Client") from MultiServer import CommandProcessor -from NetUtils import Endpoint, decode, NetworkItem, encode, JSONtoTextParser, ClientStatus, Permission, NetworkSlot +from NetUtils import Endpoint, decode, NetworkItem, encode, JSONtoTextParser, \ + ClientStatus, Permission, NetworkSlot, RawJSONtoTextParser from Utils import Version, stream_input from worlds import network_data_package, AutoWorldRegister import os @@ -204,6 +206,10 @@ class CommonContext: # execution self.keep_alive_task = asyncio.create_task(keep_alive(self), name="Bouncy") + @functools.cached_property + def raw_text_parser(self) -> RawJSONtoTextParser: + return RawJSONtoTextParser(self) + @property def total_locations(self) -> typing.Optional[int]: """Will return None until connected.""" diff --git a/FF1Client.py b/FF1Client.py index c280fa30..6973c9f4 100644 --- a/FF1Client.py +++ b/FF1Client.py @@ -1,4 +1,5 @@ import asyncio +import copy import json import time from asyncio import StreamReader, StreamWriter @@ -6,7 +7,7 @@ from typing import List import Utils -from CommonClient import CommonContext, server_loop, gui_enabled, console_loop, ClientCommandProcessor, logger, \ +from CommonClient import CommonContext, server_loop, gui_enabled, ClientCommandProcessor, logger, \ get_base_parser SYSTEM_MESSAGE_ID = 0 @@ -64,7 +65,7 @@ class FF1Context(CommonContext): def _set_message(self, msg: str, msg_id: int): if DISPLAY_MSGS: - self.messages[(time.time(), msg_id)] = msg + self.messages[time.time(), msg_id] = msg def on_package(self, cmd: str, args: dict): if cmd == 'Connected': @@ -76,29 +77,23 @@ class FF1Context(CommonContext): elif cmd == "ReceivedItems": msg = f"Received {', '.join([self.item_names[item.item] for item in args['items']])}" self._set_message(msg, SYSTEM_MESSAGE_ID) - elif cmd == 'PrintJSON': - print_type = args['type'] - item = args['item'] - receiving_player_id = args['receiving'] - receiving_player_name = self.player_names[receiving_player_id] - sending_player_id = item.player - sending_player_name = self.player_names[item.player] - if print_type == 'Hint': - msg = f"Hint: Your {self.item_names[item.item]} is at" \ - f" {self.player_names[item.player]}'s {self.location_names[item.location]}" - self._set_message(msg, item.item) - elif print_type == 'ItemSend' and receiving_player_id != self.slot: - if sending_player_id == self.slot: - if receiving_player_id == self.slot: - msg = f"You found your own {self.item_names[item.item]}" - else: - msg = f"You sent {self.item_names[item.item]} to {receiving_player_name}" - else: - if receiving_player_id == sending_player_id: - msg = f"{sending_player_name} found their {self.item_names[item.item]}" - else: - msg = f"{sending_player_name} sent {self.item_names[item.item]} to " \ - f"{receiving_player_name}" + + def on_print_json(self, args: dict): + relevant = args.get("type", None) in {"Hint", "ItemSend"} + if relevant: + item = args["item"] + # goes to this world + if self.slot_concerns_self(args["receiving"]): + relevant = True + # found in this world + elif self.slot_concerns_self(item.player): + relevant = True + # not related + else: + relevant = False + if relevant: + item = args["item"] + msg = self.raw_text_parser(copy.deepcopy(args["data"])) self._set_message(msg, item.item) def run_gui(self): diff --git a/MultiServer.py b/MultiServer.py index fc6e17dd..2838609a 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -743,6 +743,7 @@ async def countdown(ctx: Context, timer: int): broadcast_countdown(ctx, 0, f"[Server]: GO") ctx.countdown_timer = 0 + def broadcast_text_all(ctx: Context, text: str, additional_arguments: dict = {}): old_clients, new_clients = [], [] @@ -755,8 +756,10 @@ def broadcast_text_all(ctx: Context, text: str, additional_arguments: dict = {}) ctx.broadcast(old_clients, [{"cmd": "Print", "text": text }]) ctx.broadcast(new_clients, [{**{"cmd": "PrintJSON", "data": [{ "text": text }]}, **additional_arguments}]) + def broadcast_countdown(ctx: Context, timer: int, message: str): - broadcast_text_all(ctx, message, { "type": "Countdown", "countdown": timer }) + broadcast_text_all(ctx, message, {"type": "Countdown", "countdown": timer}) + def get_players_string(ctx: Context): auth_clients = {(c.team, c.slot) for c in ctx.endpoints if c.auth} diff --git a/SNIClient.py b/SNIClient.py index ccac3998..477cde86 100644 --- a/SNIClient.py +++ b/SNIClient.py @@ -15,9 +15,6 @@ import typing from json import loads, dumps -import ModuleUpdate -ModuleUpdate.update() - from Utils import init_logging, messagebox if __name__ == "__main__": diff --git a/Starcraft2Client.py b/Starcraft2Client.py index ce4d9b04..f81d4ec3 100644 --- a/Starcraft2Client.py +++ b/Starcraft2Client.py @@ -135,11 +135,6 @@ class SC2Context(CommonContext): last_loc_list = None difficulty_override = -1 mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} - raw_text_parser: RawJSONtoTextParser - - def __init__(self, *args, **kwargs): - super(SC2Context, self).__init__(*args, **kwargs) - self.raw_text_parser = RawJSONtoTextParser(self) async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -164,10 +159,13 @@ class SC2Context(CommonContext): check_mod_install() def on_print_json(self, args: dict): + # goes to this world if "receiving" in args and self.slot_concerns_self(args["receiving"]): relevant = True + # found in this world elif "item" in args and self.slot_concerns_self(args["item"].player): relevant = True + # not related else: relevant = False