mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 08:56:30 +03:00
add more advanced API to send a message
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
- Clear config cache after backup import. This bug sometimes resulted in the import to seemingly work at first. #4067
|
- Clear config cache after backup import. This bug sometimes resulted in the import to seemingly work at first. #4067
|
||||||
|
|
||||||
### API-Changes
|
### API-Changes
|
||||||
|
- jsonrpc: add more advanced API to send a message.
|
||||||
|
|
||||||
|
|
||||||
## 1.109.0
|
## 1.109.0
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ use types::account::Account;
|
|||||||
use types::chat::FullChat;
|
use types::chat::FullChat;
|
||||||
use types::chat_list::ChatListEntry;
|
use types::chat_list::ChatListEntry;
|
||||||
use types::contact::ContactObject;
|
use types::contact::ContactObject;
|
||||||
|
use types::message::DraftMessage;
|
||||||
use types::message::MessageObject;
|
use types::message::MessageObject;
|
||||||
use types::provider_info::ProviderInfo;
|
use types::provider_info::ProviderInfo;
|
||||||
use types::webxdc::WebxdcMessageInfo;
|
use types::webxdc::WebxdcMessageInfo;
|
||||||
@@ -1511,6 +1512,54 @@ impl CommandApi {
|
|||||||
Ok(message_id.to_u32())
|
Ok(message_id.to_u32())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn send_msg(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
chat_id: u32,
|
||||||
|
draft: DraftMessage,
|
||||||
|
) -> Result<(u32, MessageObject)> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
let mut message = Message::new(if let Some(viewtype) = draft.viewtype {
|
||||||
|
viewtype.into()
|
||||||
|
} else if draft.file.is_some() {
|
||||||
|
Viewtype::File
|
||||||
|
} else {
|
||||||
|
Viewtype::Text
|
||||||
|
});
|
||||||
|
if draft.text.is_some() {
|
||||||
|
message.set_text(draft.text);
|
||||||
|
}
|
||||||
|
if draft.html.is_some() {
|
||||||
|
message.set_html(draft.html);
|
||||||
|
}
|
||||||
|
if draft.override_sender_name.is_some() {
|
||||||
|
message.set_override_sender_name(draft.override_sender_name);
|
||||||
|
}
|
||||||
|
if let Some(file) = draft.file {
|
||||||
|
message.set_file(file, None);
|
||||||
|
}
|
||||||
|
if let Some((latitude, longitude)) = draft.location {
|
||||||
|
message.set_location(latitude, longitude);
|
||||||
|
}
|
||||||
|
if let Some(id) = draft.quoted_message_id {
|
||||||
|
message
|
||||||
|
.set_quote(
|
||||||
|
&ctx,
|
||||||
|
Some(
|
||||||
|
&Message::load_from_db(&ctx, MsgId::new(id))
|
||||||
|
.await
|
||||||
|
.context("message to quote could not be loaded")?,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
let msg_id = chat::send_msg(&ctx, ChatId::new(chat_id), &mut message)
|
||||||
|
.await?
|
||||||
|
.to_u32();
|
||||||
|
let message = MessageObject::from_message_id(&ctx, msg_id).await?;
|
||||||
|
Ok((msg_id, message))
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
// functions for the composer
|
// functions for the composer
|
||||||
// the composer is the message input field
|
// the composer is the message input field
|
||||||
|
|||||||
@@ -502,3 +502,15 @@ impl From<ChatItem> for JSONRPCMessageListItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, TypeDef)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct DraftMessage {
|
||||||
|
pub text: Option<String>,
|
||||||
|
pub html: Option<String>,
|
||||||
|
pub viewtype: Option<MessageViewtype>,
|
||||||
|
pub file: Option<String>,
|
||||||
|
pub location: Option<(f64, f64)>,
|
||||||
|
pub override_sender_name: Option<String>,
|
||||||
|
pub quoted_message_id: Option<u32>,
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from dataclasses import dataclass
|
|||||||
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union
|
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from ._utils import AttrDict
|
from ._utils import AttrDict
|
||||||
from .const import ChatVisibility
|
from .const import ChatVisibility, ViewType
|
||||||
from .contact import Contact
|
from .contact import Contact
|
||||||
from .message import Message
|
from .message import Message
|
||||||
|
|
||||||
@@ -108,15 +108,27 @@ class Chat:
|
|||||||
async def send_message(
|
async def send_message(
|
||||||
self,
|
self,
|
||||||
text: Optional[str] = None,
|
text: Optional[str] = None,
|
||||||
|
html: Optional[str] = None,
|
||||||
|
viewtype: Optional[ViewType] = None,
|
||||||
file: Optional[str] = None,
|
file: Optional[str] = None,
|
||||||
location: Optional[Tuple[float, float]] = None,
|
location: Optional[Tuple[float, float]] = None,
|
||||||
|
override_sender_name: Optional[str] = None,
|
||||||
quoted_msg: Optional[Union[int, Message]] = None,
|
quoted_msg: Optional[Union[int, Message]] = None,
|
||||||
) -> Message:
|
) -> Message:
|
||||||
"""Send a message and return the resulting Message instance."""
|
"""Send a message and return the resulting Message instance."""
|
||||||
if isinstance(quoted_msg, Message):
|
if isinstance(quoted_msg, Message):
|
||||||
quoted_msg = quoted_msg.id
|
quoted_msg = quoted_msg.id
|
||||||
|
|
||||||
msg_id, _ = await self._rpc.misc_send_msg(self.account.id, self.id, text, file, location, quoted_msg)
|
draft = {
|
||||||
|
"text": text,
|
||||||
|
"html": html,
|
||||||
|
"viewtype": viewtype,
|
||||||
|
"file": file,
|
||||||
|
"location": location,
|
||||||
|
"overrideSenderName": override_sender_name,
|
||||||
|
"quotedMsg": quoted_msg,
|
||||||
|
}
|
||||||
|
msg_id, _ = await self._rpc.send_msg(self.account.id, self.id, draft)
|
||||||
return Message(self.account, msg_id)
|
return Message(self.account, msg_id)
|
||||||
|
|
||||||
async def send_text(self, text: str) -> Message:
|
async def send_text(self, text: str) -> Message:
|
||||||
|
|||||||
Reference in New Issue
Block a user