FF1: fix printjson
This commit is contained in:
		
							parent
							
								
									99d2caa57d
								
							
						
					
					
						commit
						88a225764a
					
				| 
						 | 
				
			
			@ -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."""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										45
									
								
								FF1Client.py
								
								
								
								
							
							
						
						
									
										45
									
								
								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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,9 +15,6 @@ import typing
 | 
			
		|||
 | 
			
		||||
from json import loads, dumps
 | 
			
		||||
 | 
			
		||||
import ModuleUpdate
 | 
			
		||||
ModuleUpdate.update()
 | 
			
		||||
 | 
			
		||||
from Utils import init_logging, messagebox
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue