from typing import Any, Union from wechat_ipad.providers.server_864.base import Server864APIClientBase class ChatroomMixin(Server864APIClientBase): """864 群聊相关接口。""" async def get_chatroom_info(self, chatroom: str) -> dict: """获取单个群详情。""" data = await self._request_data( "post", "/group/GetChatRoomInfo", json_body={"ChatRoomWxIdList": [chatroom]}, timeout=30, ) if isinstance(data, list): return dict(data[0] or {}) if data else {} if not isinstance(data, dict): return {} contact_list = data.get("ContactList") or data.get("contactList") or [] if contact_list: return dict(contact_list[0] or {}) return dict(data) async def get_chatroom_member_list(self, chatroom: str) -> list[dict]: """获取群成员列表。""" data = await self._request_data( "post", "/group/GetChatroomMemberDetail", json_body={"ChatRoomName": chatroom}, timeout=30, ) if isinstance(data, list): return list(data) if not isinstance(data, dict): return [] return list( data.get("ChatRoomMember") or data.get("chatRoomMember") or (data.get("NewChatroomData") or {}).get("ChatRoomMember", []) or (data.get("newChatroomData") or {}).get("chatRoomMember", []) or data.get("MemberList") or [] ) async def get_chatroom_announce(self, chatroom: str) -> dict: """获取群公告详情。""" data = await self._request_data( "post", # 864 的群公告接口路由名保留了历史命名 `SetGetChatRoomInfoDetail`: # 1. controller 中实际导出的就是这个路径; # 2. 直接用语义更自然的 `GetChatRoomInfoDetail` 会 404; # 3. 对外方法名继续保持 `get_chatroom_announce`,内部路径单独适配即可。 "/group/SetGetChatRoomInfoDetail", json_body={"ChatRoomName": chatroom}, timeout=30, ) return dict(data or {}) async def get_chatroom_qrcode(self, chatroom: str) -> dict[str, Any]: """获取群二维码。""" data = await self._request_data( "post", "/group/GetChatroomQrCode", json_body={"ChatRoomName": chatroom}, timeout=30, ) return { "base64": str(self._pick_first(data, "QrCode", "qrcode", "QrCodeBase64", "base64") or ""), "description": str(self._pick_first(data, "Desc", "desc", "Description", "description") or ""), } async def get_chatroom_nickname(self, wxid: Union[str, list[str]], chatroom: str) -> Union[str, list[str]]: """获取成员在群内的展示昵称。""" members = await self.get_chatroom_member_list(chatroom) member_map = {} for member in members: member_wxid = str(member.get("UserName", "") or "") nickname = member.get("DisplayName") or member.get("NickName") or member_wxid member_map[member_wxid] = nickname if isinstance(wxid, str): return str(member_map.get(wxid, "")) return [str(member_map.get(single_wxid, "")) for single_wxid in wxid] async def get_chatroom_member_detail(self, wxid: str, chatroom: str) -> dict: """获取单个群成员详情。""" members = await self.get_chatroom_member_list(chatroom) for member in members: if str(member.get("UserName", "") or "") == wxid: return dict(member) return {}