|
@@ -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}"})
|
|
return json.dumps({"success": False, "error": f"Failed to create Chatto client: {exc}"})
|
|
|
|
|
|
|
|
try:
|
|
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:
|
|
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
|
|
# 2. Find or create the DM room between us and the target
|
|
|
our_id = (await client.me()).id
|
|
our_id = (await client.me()).id
|
|
@@ -3676,8 +3694,8 @@ async def _handle_chatto_send_dm(args: dict) -> dict:
|
|
|
room = rws.room
|
|
room = rws.room
|
|
|
if not room or room.kind != RoomKind.DM:
|
|
if not room or room.kind != RoomKind.DM:
|
|
|
continue
|
|
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
|
|
dm_room_id = room.id
|
|
|
break
|
|
break
|
|
|
|
|
|