Factorio: Add connection change filtering functionality (#4997)

This commit is contained in:
Andres
2025-11-20 20:30:11 -05:00
committed by GitHub
parent 3c819ec781
commit 32a021096b
5 changed files with 45 additions and 2 deletions

4
CommonClient.py Normal file → Executable file
View File

@@ -572,6 +572,10 @@ class CommonContext:
return print_json_packet.get("type", "") == "ItemSend" \
and not self.slot_concerns_self(print_json_packet["receiving"]) \
and not self.slot_concerns_self(print_json_packet["item"].player)
def is_connection_change(self, print_json_packet: dict) -> bool:
"""Helper function for filtering out connection changes."""
return print_json_packet.get("type", "") in ["Join","Part"]
def on_print(self, args: dict):
logger.info(args["text"])

23
worlds/factorio/Client.py Normal file → Executable file
View File

@@ -56,6 +56,10 @@ class FactorioCommandProcessor(ClientCommandProcessor):
"""Toggle filtering of item sends that get displayed in-game to only those that involve you."""
self.ctx.toggle_filter_item_sends()
def _cmd_toggle_connection_change_filter(self):
"""Toggle filtering of Connected/Disconnected players."""
self.ctx.toggle_filter_connection_changes()
def _cmd_toggle_chat(self):
"""Toggle sending of chat messages from players on the Factorio server to Archipelago."""
self.ctx.toggle_bridge_chat_out()
@@ -82,7 +86,7 @@ class FactorioContext(CommonContext):
# updated by spinup server
mod_version: Version = Version(0, 0, 0)
def __init__(self, server_address, password, filter_item_sends: bool, bridge_chat_out: bool,
def __init__(self, server_address, password, filter_connection_changes: bool, filter_item_sends: bool, bridge_chat_out: bool,
rcon_port: int, rcon_password: str, server_settings_path: str | None,
factorio_server_args: tuple[str, ...]):
super(FactorioContext, self).__init__(server_address, password)
@@ -94,6 +98,7 @@ class FactorioContext(CommonContext):
self.factorio_json_text_parser = FactorioJSONtoTextParser(self)
self.energy_link_increment = 0
self.last_deplete = 0
self.filter_connection_changes: bool = filter_connection_changes
self.filter_item_sends: bool = filter_item_sends
self.multiplayer: bool = False # whether multiple different players have connected
self.bridge_chat_out: bool = bridge_chat_out
@@ -130,6 +135,7 @@ class FactorioContext(CommonContext):
def on_print_json(self, args: dict):
if self.rcon_client:
if (not self.filter_item_sends or not self.is_uninteresting_item_send(args)) \
and (not self.filter_connection_changes or not self.is_connection_change(args)) \
and not self.is_echoed_chat(args):
text = self.factorio_json_text_parser(copy.deepcopy(args["data"]))
if not text.startswith(
@@ -222,6 +228,15 @@ class FactorioContext(CommonContext):
logger.info(announcement)
self.print_to_game(announcement)
def toggle_filter_connection_changes(self) -> None:
self.filter_connection_changes = not self.filter_connection_changes
if self.filter_connection_changes:
announcement = "Connection changes are now filtered."
else:
announcement = "Connection changes are no longer filtered."
logger.info(announcement)
self.print_to_game(announcement)
def toggle_bridge_chat_out(self) -> None:
self.bridge_chat_out = not self.bridge_chat_out
if self.bridge_chat_out:
@@ -388,6 +403,9 @@ async def factorio_server_watcher(ctx: FactorioContext):
elif re.match(r"^[0-9.]+ Script @[^ ]+\.lua:\d+: Player command toggle-ap-send-filter$", msg):
factorio_server_logger.debug(msg)
ctx.toggle_filter_item_sends()
elif re.match(r"^[0-9.]+ Script @[^ ]+\.lua:\d+: Player command toggle-ap-connection-change-filter$", msg):
factorio_server_logger.debug(msg)
ctx.toggle_filter_connection_changes()
elif re.match(r"^[0-9.]+ Script @[^ ]+\.lua:\d+: Player command toggle-ap-chat$", msg):
factorio_server_logger.debug(msg)
ctx.toggle_bridge_chat_out()
@@ -586,6 +604,7 @@ def launch(*new_args: str):
raise FileNotFoundError(f"Could not find file {server_settings} for server_settings. Aborting.")
initial_filter_item_sends = bool(settings.filter_item_sends)
initial_filter_connection_changes = bool(settings.filter_connection_changes)
initial_bridge_chat_out = bool(settings.bridge_chat_out)
if not os.path.exists(os.path.dirname(executable)):
@@ -600,7 +619,7 @@ def launch(*new_args: str):
asyncio.run(main(lambda: FactorioContext(
args.connect, args.password,
initial_filter_item_sends, initial_bridge_chat_out,
initial_filter_connection_changes, initial_filter_item_sends, initial_bridge_chat_out,
rcon_port, rcon_password, server_settings, rest
)))
colorama.deinit()

View File

@@ -859,6 +859,10 @@ commands.add_command("toggle-ap-send-filter", "Toggle filtering of item sends th
log("Player command toggle-ap-send-filter") -- notifies client
end)
commands.add_command("toggle-ap-connection-change-filter", "Toggle filtering of players joining or parting", function(call)
log("Player command toggle-ap-connection-change-filter") -- notifies client
end)
commands.add_command("toggle-ap-chat", "Toggle sending of chat messages from players on the Factorio server to Archipelago.", function(call)
log("Player command toggle-ap-chat") -- notifies client
end)

View File

@@ -179,6 +179,18 @@ factorio_options:
filter_item_sends: true
```
### filter_connection_changes
By default, all player joined and player stopped tracking notifications are displayed in-game. In larger async seeds this may become overly spammy.
To hide all connection changes, do one of the following:
- Type `/toggle-ap-connection-change-filter` in-game
- Type `/toggle_connection_change_filter` in the Achipelago Client
- In your `host.yaml` set
```
factorio_options:
filter_connection_changes: true
```
### bridge_chat_out
By default, in-game chat is bridged to Archipelago. If you prefer to be able to speak privately, you can disable this
feature by doing one of the following:

View File

@@ -19,8 +19,12 @@ If this file does exist, then it will be used.
class BridgeChatOut(settings.Bool):
"""Whether to send chat messages from players on the Factorio server to Archipelago."""
class FilterConnectionChanges(settings.Bool):
"""Whether to filter connection changes displayed in-game."""
executable: Executable = Executable("factorio/bin/x64/factorio")
server_settings: typing.Optional[ServerSettings] = None
filter_item_sends: typing.Union[FilterItemSends, bool] = False
filter_connection_changes: typing.Union[FilterConnectionChanges, bool] = False
bridge_chat_out: typing.Union[BridgeChatOut, bool] = True