From a7835c3057f1303247ad0ade50fc03d921f2ca04 Mon Sep 17 00:00:00 2001 From: Oliver Hofmann Date: Sun, 17 May 2026 14:56:02 +0200 Subject: [PATCH] fix: re-prime on chat switch; native Playwright click for profile cards --- src/teampulse/monitor.py | 6 ++++++ src/teampulse/resolver.py | 30 +++++++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/teampulse/monitor.py b/src/teampulse/monitor.py index 8acc10b..14c3e6e 100644 --- a/src/teampulse/monitor.py +++ b/src/teampulse/monitor.py @@ -180,6 +180,12 @@ class Monitor: _clear_line() print(f"Chat: {current_chat}") last_chat = current_chat + if skip_existing: + # Neuer Chat — bestehende Nachrichten überspringen + try: + self.poll_new_messages() + except Exception: + pass except Exception: pass diff --git a/src/teampulse/resolver.py b/src/teampulse/resolver.py index 72eda89..6f5504e 100644 --- a/src/teampulse/resolver.py +++ b/src/teampulse/resolver.py @@ -37,23 +37,31 @@ class Resolver: ) def _extract_email_from_profile(self, display_name: str) -> str | None: - # Click the first visible span whose text exactly matches the display name. - # Works for both channel meetings (fui-StyledText spans) and meeting chat. - clicked = self._page.evaluate("""(name) => { - for (const span of document.querySelectorAll('span')) { - if (span.textContent.trim() === name && span.offsetParent !== null) { - span.click(); - return true; - } - } - return false; - }""", display_name) + # Use Playwright's native click (real mouse events) to trigger the Teams profile card. + # Try multiple selectors that contain the sender's name. + selectors = [ + f"[data-tid='message-author-name']:has-text('{display_name}')", + f"[data-tid='reply-message-header'] span:has-text('{display_name}')", + f"span:has-text('{display_name}')", + ] + + clicked = False + for selector in selectors: + try: + loc = self._page.locator(selector).first + if loc.is_visible(timeout=1000): + loc.click() + clicked = True + break + except Exception: + continue if not clicked: print(f" Sender '{display_name}' nicht im Chat gefunden.") return None try: + # Wait for profile card, then extract email from mailto link self._page.wait_for_selector(_PROFILE_EMAIL_SELECTOR, timeout=5000) email_el = self._page.query_selector(_PROFILE_EMAIL_SELECTOR) email = None