open_lark/service/im/v1/message/
send.rs

1use reqwest::Method;
2
3use crate::{
4    core::{
5        api_resp::BaseResponse, constants::AccessTokenType, endpoints::EndpointBuilder,
6        http::Transport, req_option::RequestOption, standard_response::StandardResponse, SDKResult,
7    },
8    service::im::v1::message::{CreateMessageResp, Message},
9};
10
11// MessageService is defined in the parent module (mod.rs)
12use crate::service::im::v1::message::MessageService;
13
14impl MessageService {
15    /// 发送消息
16    ///
17    /// 给指定用户或者会话发送消息,支持文本、富文本、可交互的消息卡片、群名片、个人名片、图片、
18    /// 视频、音频、文件、表情包。
19    ///
20    /// <https://open.feishu.cn/document/server-docs/im-v1/message/create>
21    pub async fn create(
22        &self,
23        create_message_request: crate::service::im::v1::message::builders::CreateMessageRequest,
24        option: Option<RequestOption>,
25    ) -> SDKResult<Message> {
26        let mut api_req = create_message_request.api_req;
27        api_req.http_method = Method::POST;
28        api_req.api_path = crate::core::endpoints::im::IM_V1_SEND_MESSAGE.to_string();
29        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
30
31        let api_resp: BaseResponse<CreateMessageResp> =
32            Transport::request(api_req, &self.config, option).await?;
33
34        api_resp.into_result().map(|resp| resp.data)
35    }
36
37    /// 撤回消息
38    ///
39    /// 撤回已经发送成功的消息。支持撤回应用自身发送的消息、应用管理员撤回群成员的消息、
40    /// 撤回指定用户在指定会话的消息等不同场景。
41    ///
42    /// <https://open.feishu.cn/document/server-docs/im-v1/message/delete>
43    pub async fn delete(&self, message_id: &str, option: Option<RequestOption>) -> SDKResult<()> {
44        let api_req = crate::core::api_req::ApiRequest {
45            http_method: Method::DELETE,
46            api_path: EndpointBuilder::replace_param(
47                crate::core::endpoints::im::IM_V1_DELETE_MESSAGE,
48                "message_id",
49                message_id,
50            ),
51            supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
52            ..Default::default()
53        };
54
55        let api_resp: BaseResponse<serde_json::Value> =
56            Transport::request(api_req, &self.config, option).await?;
57
58        api_resp.into_result().map(|_| ())
59    }
60
61    /// 更新消息
62    ///
63    /// 更新已发送的消息。仅支持更新应用自身发送的文本消息、图片消息和文件消息。
64    ///
65    /// <https://open.feishu.cn/document/server-docs/im-v1/message/update>
66    pub async fn update(
67        &self,
68        message_id: &str,
69        update_message_request: crate::service::im::v1::message::builders::UpdateMessageRequest,
70        option: Option<RequestOption>,
71    ) -> SDKResult<Message> {
72        let mut api_req = update_message_request.api_req;
73        api_req.http_method = Method::PATCH;
74        api_req.api_path = EndpointBuilder::replace_param(
75            crate::core::endpoints::im::IM_V1_UPDATE_MESSAGE,
76            "message_id",
77            message_id,
78        );
79        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
80
81        let api_resp: BaseResponse<CreateMessageResp> =
82            Transport::request(api_req, &self.config, option).await?;
83
84        api_resp.into_result().map(|resp| resp.data)
85    }
86
87    /// 回复消息
88    ///
89    /// 在指定消息下进行回复。支持回复文本、图片、文件等类型的消息。
90    ///
91    /// <https://open.feishu.cn/document/server-docs/im-v1/message/reply>
92    pub async fn reply(
93        &self,
94        message_id: &str,
95        reply_message_request: crate::service::im::v1::message::builders::CreateMessageRequest,
96        option: Option<RequestOption>,
97    ) -> SDKResult<Message> {
98        let mut api_req = reply_message_request.api_req;
99        api_req.http_method = Method::POST;
100        api_req.api_path = EndpointBuilder::replace_param(
101            crate::core::endpoints::im::IM_V1_REPLY_MESSAGE,
102            "message_id",
103            message_id,
104        );
105        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
106
107        let api_resp: BaseResponse<CreateMessageResp> =
108            Transport::request(api_req, &self.config, option).await?;
109
110        api_resp.into_result().map(|resp| resp.data)
111    }
112}