from __future__ import annotations from typing import Any import httpx from yuxi.channels.models import DeliveryResult from yuxi.utils.logging_config import logger from .wecom.client import WeComClient class WeChatGroupAdmin: async def get_channel_info( self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str ) -> dict[str, Any]: try: token = await client.get_access_token() url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/get" params = {"access_token": token, "chatid": chat_id} resp = await http_client.get(url, params=params) data = resp.json() if data.get("errcode") == 0: return data.get("chat_info", {}) except Exception as e: logger.warning(f"[WeChat/GroupAdmin] get_channel_info failed: {e}") return {} async def rename_group( self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str, name: str ) -> DeliveryResult: try: token = await client.get_access_token() url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/update" payload = {"chatid": chat_id, "name": name} resp = await http_client.post(url, params={"access_token": token}, json=payload) data = resp.json() if data.get("errcode") == 0: return DeliveryResult(success=True) return DeliveryResult(success=False, error=data.get("errmsg", "Unknown")) except Exception as e: return DeliveryResult(success=False, error=str(e)) async def set_group_icon( self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str, image_data: bytes ) -> DeliveryResult: return DeliveryResult(success=False, error="WeCom API does not support group icon") async def add_participant( self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str, user_id: str ) -> DeliveryResult: try: token = await client.get_access_token() url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/update" current = await self.get_channel_info(client, http_client, chat_id) userlist = list(current.get("userlist", [])) if user_id not in userlist: userlist.append(user_id) payload = {"chatid": chat_id, "add_user_list": [user_id]} resp = await http_client.post(url, params={"access_token": token}, json=payload) data = resp.json() if data.get("errcode") == 0: return DeliveryResult(success=True) return DeliveryResult(success=False, error=data.get("errmsg", "Unknown")) except Exception as e: return DeliveryResult(success=False, error=str(e)) async def remove_participant( self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str, user_id: str ) -> DeliveryResult: try: token = await client.get_access_token() url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/update" payload = {"chatid": chat_id, "del_user_list": [user_id]} resp = await http_client.post(url, params={"access_token": token}, json=payload) data = resp.json() if data.get("errcode") == 0: return DeliveryResult(success=True) return DeliveryResult(success=False, error=data.get("errmsg", "Unknown")) except Exception as e: return DeliveryResult(success=False, error=str(e)) async def leave_group(self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str) -> DeliveryResult: return DeliveryResult(success=False, error="WeCom does not support leave group via API") async def list_members( self, client: WeComClient, http_client: httpx.AsyncClient, chat_id: str ) -> list[dict[str, Any]]: info = await self.get_channel_info(client, http_client, chat_id) userlist = info.get("userlist", []) return [{"user_id": uid} for uid in userlist]