From aa418bb91f74f8b6f1c0aab7190fbf41d962de3b Mon Sep 17 00:00:00 2001
From: "d.shuvalov" <46745805+PrEvIeS@users.noreply.github.com>
Date: Tue, 5 May 2026 17:11:04 +0300
Subject: [PATCH] Auto-pin owner via area-entered + level event; filter
party-member level events
Tracks the local player by listening for `: You have entered .` and
the next level event in that window, then ignores subsequent `:
() is now level ` lines for any other character. Party joins
inside an unpinned area window mark the window INVALIDATED so we don't
mis-attribute a party member's level event to the local player. Setting
`POE2_CHARACTER_NAME` short-circuits the state machine to PINNED on first
area entry.
---
main.py | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/main.py b/main.py
index 7ee959b..f95d480 100644
--- a/main.py
+++ b/main.py
@@ -272,9 +272,22 @@ def update_rpc(level_info, instance_info=None, status=None):
regex_level = re.compile(r": (\w+) \(([\w\s]+)\) is now level (\d+)")
regex_instance = re.compile(r'Generating level (\d+) area "([^"]+)" with seed (\d+)')
+regex_local_area_entered = re.compile(r": You have entered (.*)\.")
+regex_party_joined = re.compile(r": (\S+) has joined the area\.")
+
+# Owner-detection state machine: filters level events from party members.
+# UNKNOWN : no area-entry seen yet -> emit freely
+# AREA_ENTERED : ": You have entered ..." just fired, no party member yet -> next level pins
+# PINNED : owner identified, only that name's level events update presence
+# INVALIDATED : a party member joined inside an unpinned window -> drop until next area entry
+# Override via POE2_CHARACTER_NAME= short-circuits to PINNED on first area entry.
+_owner_state = "UNKNOWN"
+_pinned_name: Optional[str] = None
+_override_name: Optional[str] = os.environ.get("POE2_CHARACTER_NAME")
def monitor_log():
+ global _owner_state, _pinned_name
game_path = find_game_log()
log_file_path = Path(game_path)
@@ -306,7 +319,32 @@ def monitor_log():
while True:
new_lines = log_file.readlines()
for line in new_lines:
+ if regex_local_area_entered.search(line):
+ if _override_name is not None:
+ _owner_state = "PINNED"
+ _pinned_name = _override_name
+ else:
+ _owner_state = "AREA_ENTERED"
+ _pinned_name = None
+ continue
+ if party_match := regex_party_joined.search(line):
+ if _owner_state == "AREA_ENTERED":
+ _owner_state = "INVALIDATED"
+ elif _owner_state == "PINNED":
+ logging.warning(
+ f"Party member {party_match.group(1)} joined while pinned to {_pinned_name}; keeping pin"
+ )
+ continue
+
level_info = find_last_level_up(line, regex_level)
+ if level_info:
+ if _owner_state == "PINNED" and level_info["username"] != _pinned_name:
+ continue
+ if _owner_state == "INVALIDATED":
+ continue
+ if _owner_state == "AREA_ENTERED":
+ _owner_state = "PINNED"
+ _pinned_name = level_info["username"]
if level_info and (
not current_status["level_info"]
or level_info != current_status["level_info"]