diff --git a/app.py b/app.py index b404ef7..b2483f6 100644 --- a/app.py +++ b/app.py @@ -174,7 +174,7 @@ def seed_known_users(): def periodic_seed(): while True: seed_known_users() - time.sleep(300) # 5 Minuten + time.sleep(300) # ============================================================ # FALLBACK CHECK @@ -218,6 +218,27 @@ def is_user_in_local_rooms(user_id: str) -> bool: return False +# ============================================================ +# 🔥 HYBRID DM DETECTION +# ============================================================ + +def is_likely_dm_event(event): + content = event.get("content", {}) + + # 1️⃣ offizielles Flag + if content.get("is_direct") is True: + return True + + # 2️⃣ Heuristik + unsigned = event.get("unsigned", {}) + state = unsigned.get("invite_room_state", []) + + member_events = [ + e for e in state if e.get("type") == "m.room.member" + ] + + return len(member_events) <= 2 + # ============================================================ # ROUTES # ============================================================ @@ -241,16 +262,18 @@ def invite(room_id, event_id): # whitelist if domain in config.domain_whitelist: remember_user(sender) - return forward_request("PUT", + return forward_request( + "PUT", f"{config.tuwunel_url}/_matrix/federation/v2/invite/{room_id}/{event_id}", - request.headers, payload + request.headers, + payload ) if config.block_external_dms and is_external(sender): if not is_known_user(sender): - # 🔥 FALLBACK CHECK + # 🔥 fallback check if is_user_in_local_rooms(sender): remember_user(sender) else: