Explorar el Código

fix: resolve user via room member search instead of admin_get_member (bot lacks admin rights)

Liv Klumpp hace 2 semanas
padre
commit
f381f32e2f
Se han modificado 1 ficheros con 37 adiciones y 19 borrados
  1. 37 19
      adapter.py

+ 37 - 19
adapter.py

@@ -3646,25 +3646,43 @@ async def _handle_chatto_send_dm(args: dict) -> dict:
         return json.dumps({"success": False, "error": f"Failed to create Chatto client: {exc}"})
 
     try:
-        # 1. Resolve the target user
-        if user_login:
-            member_data = await client.admin_get_member(login=user_login)
+        # 1. Resolve the target user — via room member search (no admin rights needed)
+        if user_id:
+            target_user_id = user_id
+            target_login = user_login
         else:
-            member_data = await client.admin_get_member(user_id=user_id)
-
-        member = member_data.get("member")
-        if not member:
-            return json.dumps({"success": False, "error": f"User not found (login={user_login or user_id})"})
-
-        target_user = member.get("user")
-        if not target_user:
-            return json.dumps({"success": False, "error": "User record missing in member data"})
-
-        target_user_id = target_user.get("id")
-        if not target_user_id:
-            return json.dumps({"success": False, "error": "User has no ID"})
+            target_user_id = None
+            target_login = user_login
+            our_id = (await client.me()).id
+            for rws in await client.list_rooms():
+                room = rws.room
+                if not room:
+                    continue
+                try:
+                    member_ids, _ = await client.list_room_members(
+                        room.id, search=user_login
+                    )
+                except ChattoError:
+                    continue
+                if not member_ids:
+                    continue
+                members = await client.batch_get_room_members(room.id, member_ids)
+                for m in members:
+                    u = getattr(m, "user", None)
+                    login = getattr(u, "login", None) if u else None
+                    uid = getattr(u, "id", None) if u else None
+                    if uid and login and login.casefold() == user_login.casefold():
+                        target_user_id = uid
+                        target_login = login
+                        break
+                if target_user_id:
+                    break
 
-        target_login = target_user.get("login", user_login)
+            if not target_user_id:
+                return json.dumps({
+                    "success": False,
+                    "error": f"User not found (login={user_login or user_id})",
+                })
 
         # 2. Find or create the DM room between us and the target
         our_id = (await client.me()).id
@@ -3676,8 +3694,8 @@ async def _handle_chatto_send_dm(args: dict) -> dict:
             room = rws.room
             if not room or room.kind != RoomKind.DM:
                 continue
-            members_page, _ = await client.list_room_members(room.id)
-            if target_user_id in members_page and our_id in members_page:
+            member_ids, _ = await client.list_room_members(room.id)
+            if target_user_id in member_ids and our_id in member_ids:
                 dm_room_id = room.id
                 break