Source code for iamai.adapter.dingtalk.event

"""DingTalk 适配器事件。"""
import time
from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Union
from typing_extensions import Self

from pydantic import BaseModel, Field

from iamai.event import MessageEvent

from .exceptions import WebhookExpiredError
from .message import DingTalkMessage

if TYPE_CHECKING:
    from . import DingTalkAdapter

__all__ = ["UserInfo", "Text", "DingTalkEvent"]


[docs] class UserInfo(BaseModel): """用户信息""" dingtalkId: str staffId: Optional[str] = None
[docs] class Text(BaseModel): """文本消息""" content: str
[docs] class DingTalkEvent(MessageEvent["DingTalkAdapter"]): """DingTalk 事件基类""" type: Optional[str] = Field(alias="msgtype") msgtype: str msgId: str createAt: str conversationType: Literal["1", "2"] conversationId: str conversationTitle: Optional[str] = None senderId: str senderNick: str senderCorpId: Optional[str] = None sessionWebhook: str sessionWebhookExpiredTime: int isAdmin: Optional[bool] = None chatbotCorpId: Optional[str] = None isInAtList: Optional[bool] = None senderStaffId: Optional[str] = None chatbotUserId: str atUsers: List[UserInfo] text: Text response_msg: Union[None, str, Dict[str, Any], DingTalkMessage] = None response_at: Union[None, Dict[str, Any], DingTalkMessage] = None @property def message(self) -> DingTalkMessage: """返回 message 字段。""" return DingTalkMessage.text(self.text.content)
[docs] def get_plain_text(self) -> str: """获取消息的纯文本内容。 Returns: 消息的纯文本内容。 """ return self.message.get_plain_text()
[docs] async def reply( self, message: Union[str, Dict[str, Any], DingTalkMessage], at: Union[None, Dict[str, Any], DingTalkMessage] = None, ) -> Dict[str, Any]: """回复消息。 Args: message: 回复消息的内容,可以是 `str`, `Dict` 或 `DingTalkMessage`。 at: 回复消息时 At 的对象,必须时 at 类型的 `DingTalkMessage`,或者符合标准的 `Dict`。 Returns: 调用 Webhook 地址后钉钉服务器的响应。 Raises: WebhookExpiredError: 当前事件的 Webhook 地址已经过期。 ...: 同 `DingTalkAdapter.send()` 方法。 """ if self.sessionWebhookExpiredTime > time.time() * 1000: return await self.adapter.send( webhook=self.sessionWebhook, conversation_type=self.conversationType, msg=message, at=at, ) raise WebhookExpiredError
[docs] async def is_same_sender(self, other: Self) -> bool: """判断自身和另一个事件是否是同一个发送者。 Args: other: 另一个事件。 Returns: 是否是同一个发送者。 """ return self.senderId == other.senderId