mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
more jsonrpc porting (#3645)
* Port setChatVisbility to jsonrpc * jsonrpc add functions - setChatEphemeralTimer - getChatEphemeralTimer and changelog * add pr number to changelog * jsonrpc: getLocations function * Port imex() to jsonrpc * autogenerate types * jsonrpc: add `getAccountFileSize()` * jsonrpc: `estimateAutodeleteCount` * jsonrpc: setStockStrings * Refactor imex into exportSelfKeys and importSelfKeys * generate typings * rustformat * fix clippy * update changelog Co-authored-by: jikstra <jikstra@disroot.org>
This commit is contained in:
14
CHANGELOG.md
14
CHANGELOG.md
@@ -3,7 +3,7 @@
|
|||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
### API-Changes
|
### API-Changes
|
||||||
- jsonrpc: add function: #3641
|
- jsonrpc: add function: #3641, #3645
|
||||||
- `getChatContacts()`
|
- `getChatContacts()`
|
||||||
- `createGroupChat()`
|
- `createGroupChat()`
|
||||||
- `createBroadcastList()`
|
- `createBroadcastList()`
|
||||||
@@ -14,8 +14,18 @@
|
|||||||
- `sendVideochatInvitation()`
|
- `sendVideochatInvitation()`
|
||||||
- `searchMessages()`
|
- `searchMessages()`
|
||||||
- `messageIdsToSearchResults()`
|
- `messageIdsToSearchResults()`
|
||||||
- jsonrpc: add type: #3641
|
- `setChatVisibility()`
|
||||||
|
- `getChatEphemeralTimer()`
|
||||||
|
- `setChatEphemeralTimer()`
|
||||||
|
- `getLocations()`
|
||||||
|
- `getAccountFileSize()`
|
||||||
|
- `estimateAutoDeletionCount()`
|
||||||
|
- `setStockStrings()`
|
||||||
|
- `exportSelfKeys()`
|
||||||
|
- `importSelfKeys()`
|
||||||
|
- jsonrpc: add type: #3641, #3645
|
||||||
- `MessageSearchResult`
|
- `MessageSearchResult`
|
||||||
|
- `Location`
|
||||||
|
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|||||||
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -980,6 +980,7 @@ dependencies = [
|
|||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio",
|
"tokio",
|
||||||
"typescript-type-def",
|
"typescript-type-def",
|
||||||
|
"walkdir",
|
||||||
"yerpc",
|
"yerpc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ tokio = { version = "1.19.2" }
|
|||||||
# optional dependencies
|
# optional dependencies
|
||||||
axum = { version = "0.5.9", optional = true, features = ["ws"] }
|
axum = { version = "0.5.9", optional = true, features = ["ws"] }
|
||||||
env_logger = { version = "0.9.0", optional = true }
|
env_logger = { version = "0.9.0", optional = true }
|
||||||
|
walkdir = "2.3.2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tokio = { version = "1.19.2", features = ["full", "rt-multi-thread"] }
|
tokio = { version = "1.19.2", features = ["full", "rt-multi-thread"] }
|
||||||
|
|||||||
@@ -8,17 +8,23 @@ use deltachat::{
|
|||||||
config::Config,
|
config::Config,
|
||||||
contact::{may_be_valid_addr, Contact, ContactId, Origin},
|
contact::{may_be_valid_addr, Contact, ContactId, Origin},
|
||||||
context::get_info,
|
context::get_info,
|
||||||
message::{delete_msgs, get_msg_info, markseen_msgs, Message, MessageState, MsgId, Viewtype},
|
ephemeral::Timer,
|
||||||
|
imex, location,
|
||||||
|
message::{
|
||||||
|
self, delete_msgs, get_msg_info, markseen_msgs, Message, MessageState, MsgId, Viewtype,
|
||||||
|
},
|
||||||
provider::get_provider_info,
|
provider::get_provider_info,
|
||||||
qr,
|
qr,
|
||||||
qr_code_generator::get_securejoin_qr_svg,
|
qr_code_generator::get_securejoin_qr_svg,
|
||||||
securejoin,
|
securejoin,
|
||||||
|
stock_str::StockMessage,
|
||||||
webxdc::StatusUpdateSerial,
|
webxdc::StatusUpdateSerial,
|
||||||
};
|
};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::{collections::HashMap, str::FromStr};
|
use std::{collections::HashMap, str::FromStr};
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
|
use walkdir::WalkDir;
|
||||||
use yerpc::rpc;
|
use yerpc::rpc;
|
||||||
|
|
||||||
pub use deltachat::accounts::Accounts;
|
pub use deltachat::accounts::Accounts;
|
||||||
@@ -38,10 +44,13 @@ use types::provider_info::ProviderInfo;
|
|||||||
use types::webxdc::WebxdcMessageInfo;
|
use types::webxdc::WebxdcMessageInfo;
|
||||||
|
|
||||||
use self::types::{
|
use self::types::{
|
||||||
chat::{BasicChat, MuteDuration},
|
chat::{BasicChat, JSONRPCChatVisibility, MuteDuration},
|
||||||
|
location::JsonrpcLocation,
|
||||||
message::{MessageNotificationInfo, MessageSearchResult, MessageViewtype},
|
message::{MessageNotificationInfo, MessageSearchResult, MessageViewtype},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use num_traits::FromPrimitive;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct CommandApi {
|
pub struct CommandApi {
|
||||||
pub(crate) accounts: Arc<RwLock<Accounts>>,
|
pub(crate) accounts: Arc<RwLock<Accounts>>,
|
||||||
@@ -145,6 +154,21 @@ impl CommandApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the combined filesize of an account in bytes
|
||||||
|
async fn get_account_file_size(&self, account_id: u32) -> Result<u64> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
let dbfile = ctx.get_dbfile().metadata()?.len();
|
||||||
|
let total_size = WalkDir::new(ctx.get_blobdir())
|
||||||
|
.max_depth(2)
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|entry| entry.ok())
|
||||||
|
.filter_map(|entry| entry.metadata().ok())
|
||||||
|
.filter(|metadata| metadata.is_file())
|
||||||
|
.fold(0, |acc, m| acc + m.len());
|
||||||
|
|
||||||
|
Ok(dbfile + total_size)
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns provider for the given domain.
|
/// Returns provider for the given domain.
|
||||||
///
|
///
|
||||||
/// This function looks up domain in offline database.
|
/// This function looks up domain in offline database.
|
||||||
@@ -233,6 +257,18 @@ impl CommandApi {
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn set_stock_strings(&self, strings: HashMap<u32, String>) -> Result<()> {
|
||||||
|
let accounts = self.accounts.read().await;
|
||||||
|
for (stock_id, stock_message) in strings {
|
||||||
|
if let Some(stock_id) = StockMessage::from_u32(stock_id) {
|
||||||
|
accounts
|
||||||
|
.set_stock_translation(stock_id, stock_message)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Configures this account with the currently set parameters.
|
/// Configures this account with the currently set parameters.
|
||||||
/// Setup the credential config before calling this.
|
/// Setup the credential config before calling this.
|
||||||
async fn configure(&self, account_id: u32) -> Result<()> {
|
async fn configure(&self, account_id: u32) -> Result<()> {
|
||||||
@@ -256,6 +292,38 @@ impl CommandApi {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn export_self_keys(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
path: String,
|
||||||
|
passphrase: Option<String>,
|
||||||
|
) -> Result<()> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
imex::imex(
|
||||||
|
&ctx,
|
||||||
|
imex::ImexMode::ExportSelfKeys,
|
||||||
|
path.as_ref(),
|
||||||
|
passphrase,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn import_self_keys(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
path: String,
|
||||||
|
passphrase: Option<String>,
|
||||||
|
) -> Result<()> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
imex::imex(
|
||||||
|
&ctx,
|
||||||
|
imex::ImexMode::ImportSelfKeys,
|
||||||
|
path.as_ref(),
|
||||||
|
passphrase,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the message IDs of all _fresh_ messages of any chat.
|
/// Returns the message IDs of all _fresh_ messages of any chat.
|
||||||
/// Typically used for implementing notification summaries
|
/// Typically used for implementing notification summaries
|
||||||
/// or badge counters e.g. on the app icon.
|
/// or badge counters e.g. on the app icon.
|
||||||
@@ -288,6 +356,20 @@ impl CommandApi {
|
|||||||
ChatId::new(chat_id).get_fresh_msg_cnt(&ctx).await
|
ChatId::new(chat_id).get_fresh_msg_cnt(&ctx).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Estimate the number of messages that will be deleted
|
||||||
|
/// by the set_config()-options `delete_device_after` or `delete_server_after`.
|
||||||
|
/// This is typically used to show the estimated impact to the user
|
||||||
|
/// before actually enabling deletion of old messages.
|
||||||
|
async fn estimate_auto_deletion_count(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
from_server: bool,
|
||||||
|
seconds: i64,
|
||||||
|
) -> Result<usize> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
message::estimate_deletion_cnt(&ctx, from_server, seconds).await
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
// autocrypt
|
// autocrypt
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
@@ -606,6 +688,39 @@ impl CommandApi {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn set_chat_visibility(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
chat_id: u32,
|
||||||
|
visibility: JSONRPCChatVisibility,
|
||||||
|
) -> Result<()> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
|
||||||
|
ChatId::new(chat_id)
|
||||||
|
.set_visibility(&ctx, visibility.into_core_type())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn set_chat_ephemeral_timer(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
chat_id: u32,
|
||||||
|
timer: u32,
|
||||||
|
) -> Result<()> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
ChatId::new(chat_id)
|
||||||
|
.set_ephemeral_timer(&ctx, Timer::from_u32(timer))
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_chat_ephemeral_timer(&self, account_id: u32, chat_id: u32) -> Result<u32> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
Ok(ChatId::new(chat_id)
|
||||||
|
.get_ephemeral_timer(&ctx)
|
||||||
|
.await?
|
||||||
|
.to_u32())
|
||||||
|
}
|
||||||
|
|
||||||
// for now only text messages, because we only used text messages in desktop thusfar
|
// for now only text messages, because we only used text messages in desktop thusfar
|
||||||
async fn add_device_message(
|
async fn add_device_message(
|
||||||
&self,
|
&self,
|
||||||
@@ -1125,6 +1240,32 @@ impl CommandApi {
|
|||||||
ctx.get_connectivity_html().await
|
ctx.get_connectivity_html().await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
|
// locations
|
||||||
|
// ---------------------------------------------
|
||||||
|
|
||||||
|
async fn get_locations(
|
||||||
|
&self,
|
||||||
|
account_id: u32,
|
||||||
|
chat_id: Option<u32>,
|
||||||
|
contact_id: Option<u32>,
|
||||||
|
timestamp_begin: i64,
|
||||||
|
timestamp_end: i64,
|
||||||
|
) -> Result<Vec<JsonrpcLocation>> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
|
||||||
|
let locations = location::get_range(
|
||||||
|
&ctx,
|
||||||
|
chat_id.map(ChatId::new),
|
||||||
|
contact_id,
|
||||||
|
timestamp_begin,
|
||||||
|
timestamp_end,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(locations.into_iter().map(|l| l.into()).collect())
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
// webxdc
|
// webxdc
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use anyhow::{anyhow, bail, Result};
|
use anyhow::{anyhow, bail, Result};
|
||||||
use deltachat::chat::{self, get_chat_contacts};
|
use deltachat::chat::{self, get_chat_contacts, ChatVisibility};
|
||||||
use deltachat::chat::{Chat, ChatId};
|
use deltachat::chat::{Chat, ChatId};
|
||||||
use deltachat::constants::Chattype;
|
use deltachat::constants::Chattype;
|
||||||
use deltachat::contact::{Contact, ContactId};
|
use deltachat::contact::{Contact, ContactId};
|
||||||
@@ -193,3 +193,21 @@ impl MuteDuration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Serialize, Deserialize, TypeDef)]
|
||||||
|
#[serde(rename = "ChatVisibility")]
|
||||||
|
pub enum JSONRPCChatVisibility {
|
||||||
|
Normal,
|
||||||
|
Archived,
|
||||||
|
Pinned,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl JSONRPCChatVisibility {
|
||||||
|
pub fn into_core_type(self) -> ChatVisibility {
|
||||||
|
match self {
|
||||||
|
JSONRPCChatVisibility::Normal => ChatVisibility::Normal,
|
||||||
|
JSONRPCChatVisibility::Archived => ChatVisibility::Archived,
|
||||||
|
JSONRPCChatVisibility::Pinned => ChatVisibility::Pinned,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
47
deltachat-jsonrpc/src/api/types/location.rs
Normal file
47
deltachat-jsonrpc/src/api/types/location.rs
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
use deltachat::location::Location;
|
||||||
|
use serde::Serialize;
|
||||||
|
use typescript_type_def::TypeDef;
|
||||||
|
|
||||||
|
#[derive(Serialize, TypeDef)]
|
||||||
|
#[serde(rename = "Location", rename_all = "camelCase")]
|
||||||
|
pub struct JsonrpcLocation {
|
||||||
|
pub location_id: u32,
|
||||||
|
pub is_independent: bool,
|
||||||
|
pub latitude: f64,
|
||||||
|
pub longitude: f64,
|
||||||
|
pub accuracy: f64,
|
||||||
|
pub timestamp: i64,
|
||||||
|
pub contact_id: u32,
|
||||||
|
pub msg_id: u32,
|
||||||
|
pub chat_id: u32,
|
||||||
|
pub marker: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Location> for JsonrpcLocation {
|
||||||
|
fn from(location: Location) -> Self {
|
||||||
|
let Location {
|
||||||
|
location_id,
|
||||||
|
independent,
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
accuracy,
|
||||||
|
timestamp,
|
||||||
|
contact_id,
|
||||||
|
msg_id,
|
||||||
|
chat_id,
|
||||||
|
marker,
|
||||||
|
} = location;
|
||||||
|
Self {
|
||||||
|
location_id,
|
||||||
|
is_independent: independent != 0,
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
accuracy,
|
||||||
|
timestamp,
|
||||||
|
contact_id: contact_id.to_u32(),
|
||||||
|
msg_id,
|
||||||
|
chat_id: chat_id.to_u32(),
|
||||||
|
marker,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ pub mod account;
|
|||||||
pub mod chat;
|
pub mod chat;
|
||||||
pub mod chat_list;
|
pub mod chat_list;
|
||||||
pub mod contact;
|
pub mod contact;
|
||||||
|
pub mod location;
|
||||||
pub mod message;
|
pub mod message;
|
||||||
pub mod provider_info;
|
pub mod provider_info;
|
||||||
pub mod webxdc;
|
pub mod webxdc;
|
||||||
|
|||||||
@@ -73,6 +73,13 @@ export class RawClient {
|
|||||||
return (this._transport.request('get_account_info', [accountId] as RPC.Params)) as Promise<T.Account>;
|
return (this._transport.request('get_account_info', [accountId] as RPC.Params)) as Promise<T.Account>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the combined filesize of an account in bytes
|
||||||
|
*/
|
||||||
|
public getAccountFileSize(accountId: T.U32): Promise<T.U64> {
|
||||||
|
return (this._transport.request('get_account_file_size', [accountId] as RPC.Params)) as Promise<T.U64>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns provider for the given domain.
|
* Returns provider for the given domain.
|
||||||
*
|
*
|
||||||
@@ -135,6 +142,11 @@ export class RawClient {
|
|||||||
return (this._transport.request('batch_get_config', [accountId, keys] as RPC.Params)) as Promise<Record<string,(string|null)>>;
|
return (this._transport.request('batch_get_config', [accountId, keys] as RPC.Params)) as Promise<Record<string,(string|null)>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public setStockStrings(strings: Record<T.U32,string>): Promise<null> {
|
||||||
|
return (this._transport.request('set_stock_strings', [strings] as RPC.Params)) as Promise<null>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures this account with the currently set parameters.
|
* Configures this account with the currently set parameters.
|
||||||
* Setup the credential config before calling this.
|
* Setup the credential config before calling this.
|
||||||
@@ -150,6 +162,16 @@ export class RawClient {
|
|||||||
return (this._transport.request('stop_ongoing_process', [accountId] as RPC.Params)) as Promise<null>;
|
return (this._transport.request('stop_ongoing_process', [accountId] as RPC.Params)) as Promise<null>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public exportSelfKeys(accountId: T.U32, path: string, passphrase: (string|null)): Promise<null> {
|
||||||
|
return (this._transport.request('export_self_keys', [accountId, path, passphrase] as RPC.Params)) as Promise<null>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public importSelfKeys(accountId: T.U32, path: string, passphrase: (string|null)): Promise<null> {
|
||||||
|
return (this._transport.request('import_self_keys', [accountId, path, passphrase] as RPC.Params)) as Promise<null>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the message IDs of all _fresh_ messages of any chat.
|
* Returns the message IDs of all _fresh_ messages of any chat.
|
||||||
* Typically used for implementing notification summaries
|
* Typically used for implementing notification summaries
|
||||||
@@ -179,6 +201,16 @@ export class RawClient {
|
|||||||
return (this._transport.request('get_fresh_msg_cnt', [accountId, chatId] as RPC.Params)) as Promise<T.Usize>;
|
return (this._transport.request('get_fresh_msg_cnt', [accountId, chatId] as RPC.Params)) as Promise<T.Usize>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Estimate the number of messages that will be deleted
|
||||||
|
* by the set_config()-options `delete_device_after` or `delete_server_after`.
|
||||||
|
* This is typically used to show the estimated impact to the user
|
||||||
|
* before actually enabling deletion of old messages.
|
||||||
|
*/
|
||||||
|
public estimateAutoDeletionCount(accountId: T.U32, fromServer: boolean, seconds: T.I64): Promise<T.Usize> {
|
||||||
|
return (this._transport.request('estimate_auto_deletion_count', [accountId, fromServer, seconds] as RPC.Params)) as Promise<T.Usize>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public autocryptInitiateKeyTransfer(accountId: T.U32): Promise<string> {
|
public autocryptInitiateKeyTransfer(accountId: T.U32): Promise<string> {
|
||||||
return (this._transport.request('autocrypt_initiate_key_transfer', [accountId] as RPC.Params)) as Promise<string>;
|
return (this._transport.request('autocrypt_initiate_key_transfer', [accountId] as RPC.Params)) as Promise<string>;
|
||||||
@@ -415,6 +447,21 @@ export class RawClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public setChatVisibility(accountId: T.U32, chatId: T.U32, visibility: T.ChatVisibility): Promise<null> {
|
||||||
|
return (this._transport.request('set_chat_visibility', [accountId, chatId, visibility] as RPC.Params)) as Promise<null>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public setChatEphemeralTimer(accountId: T.U32, chatId: T.U32, timer: T.U32): Promise<null> {
|
||||||
|
return (this._transport.request('set_chat_ephemeral_timer', [accountId, chatId, timer] as RPC.Params)) as Promise<null>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public getChatEphemeralTimer(accountId: T.U32, chatId: T.U32): Promise<T.U32> {
|
||||||
|
return (this._transport.request('get_chat_ephemeral_timer', [accountId, chatId] as RPC.Params)) as Promise<T.U32>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public addDeviceMessage(accountId: T.U32, label: string, text: string): Promise<T.U32> {
|
public addDeviceMessage(accountId: T.U32, label: string, text: string): Promise<T.U32> {
|
||||||
return (this._transport.request('add_device_message', [accountId, label, text] as RPC.Params)) as Promise<T.U32>;
|
return (this._transport.request('add_device_message', [accountId, label, text] as RPC.Params)) as Promise<T.U32>;
|
||||||
}
|
}
|
||||||
@@ -716,6 +763,11 @@ export class RawClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public getLocations(accountId: T.U32, chatId: (T.U32|null), contactId: (T.U32|null), timestampBegin: T.I64, timestampEnd: T.I64): Promise<(T.Location)[]> {
|
||||||
|
return (this._transport.request('get_locations', [accountId, chatId, contactId, timestampBegin, timestampEnd] as RPC.Params)) as Promise<(T.Location)[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public webxdcSendStatusUpdate(accountId: T.U32, instanceMsgId: T.U32, updateStr: string, description: string): Promise<null> {
|
public webxdcSendStatusUpdate(accountId: T.U32, instanceMsgId: T.U32, updateStr: string, description: string): Promise<null> {
|
||||||
return (this._transport.request('webxdc_send_status_update', [accountId, instanceMsgId, updateStr, description] as RPC.Params)) as Promise<null>;
|
return (this._transport.request('webxdc_send_status_update', [accountId, instanceMsgId, updateStr, description] as RPC.Params)) as Promise<null>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
export type U32=number;
|
export type U32=number;
|
||||||
export type Account=(({"type":"Configured";}&{"id":U32;"displayName":(string|null);"addr":(string|null);"profileImage":(string|null);"color":string;})|({"type":"Unconfigured";}&{"id":U32;}));
|
export type Account=(({"type":"Configured";}&{"id":U32;"displayName":(string|null);"addr":(string|null);"profileImage":(string|null);"color":string;})|({"type":"Unconfigured";}&{"id":U32;}));
|
||||||
|
export type U64=number;
|
||||||
export type ProviderInfo={"beforeLoginHint":string;"overviewPage":string;"status":U32;};
|
export type ProviderInfo={"beforeLoginHint":string;"overviewPage":string;"status":U32;};
|
||||||
export type Qr=(({"type":"askVerifyContact";}&{"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"askVerifyGroup";}&{"grpname":string;"grpid":string;"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"fprOk";}&{"contact_id":U32;})|({"type":"fprMismatch";}&{"contact_id":(U32|null);})|({"type":"fprWithoutAddr";}&{"fingerprint":string;})|({"type":"account";}&{"domain":string;})|({"type":"webrtcInstance";}&{"domain":string;"instance_pattern":string;})|({"type":"addr";}&{"contact_id":U32;"draft":(string|null);})|({"type":"url";}&{"url":string;})|({"type":"text";}&{"text":string;})|({"type":"withdrawVerifyContact";}&{"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"withdrawVerifyGroup";}&{"grpname":string;"grpid":string;"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"reviveVerifyContact";}&{"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"reviveVerifyGroup";}&{"grpname":string;"grpid":string;"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"login";}&{"address":string;}));
|
export type Qr=(({"type":"askVerifyContact";}&{"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"askVerifyGroup";}&{"grpname":string;"grpid":string;"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"fprOk";}&{"contact_id":U32;})|({"type":"fprMismatch";}&{"contact_id":(U32|null);})|({"type":"fprWithoutAddr";}&{"fingerprint":string;})|({"type":"account";}&{"domain":string;})|({"type":"webrtcInstance";}&{"domain":string;"instance_pattern":string;})|({"type":"addr";}&{"contact_id":U32;"draft":(string|null);})|({"type":"url";}&{"url":string;})|({"type":"text";}&{"text":string;})|({"type":"withdrawVerifyContact";}&{"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"withdrawVerifyGroup";}&{"grpname":string;"grpid":string;"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"reviveVerifyContact";}&{"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"reviveVerifyGroup";}&{"grpname":string;"grpid":string;"contact_id":U32;"fingerprint":string;"invitenumber":string;"authcode":string;})|({"type":"login";}&{"address":string;}));
|
||||||
export type Usize=number;
|
export type Usize=number;
|
||||||
export type ChatListEntry=[U32,U32];
|
|
||||||
export type I64=number;
|
export type I64=number;
|
||||||
|
export type ChatListEntry=[U32,U32];
|
||||||
export type ChatListItemFetchResult=(({"type":"ChatListItem";}&{"id":U32;"name":string;"avatarPath":(string|null);"color":string;"lastUpdated":(I64|null);"summaryText1":string;"summaryText2":string;"summaryStatus":U32;"isProtected":boolean;"isGroup":boolean;"freshMessageCounter":Usize;"isSelfTalk":boolean;"isDeviceTalk":boolean;"isSendingLocation":boolean;"isSelfInGroup":boolean;"isArchived":boolean;"isPinned":boolean;"isMuted":boolean;"isContactRequest":boolean;
|
export type ChatListItemFetchResult=(({"type":"ChatListItem";}&{"id":U32;"name":string;"avatarPath":(string|null);"color":string;"lastUpdated":(I64|null);"summaryText1":string;"summaryText2":string;"summaryStatus":U32;"isProtected":boolean;"isGroup":boolean;"freshMessageCounter":Usize;"isSelfTalk":boolean;"isDeviceTalk":boolean;"isSendingLocation":boolean;"isSelfInGroup":boolean;"isArchived":boolean;"isPinned":boolean;"isMuted":boolean;"isContactRequest":boolean;
|
||||||
/**
|
/**
|
||||||
* true when chat is a broadcastlist
|
* true when chat is a broadcastlist
|
||||||
@@ -49,6 +50,7 @@ export type BasicChat=
|
|||||||
* used when you only need the basic metadata of a chat like type, name, profile picture
|
* used when you only need the basic metadata of a chat like type, name, profile picture
|
||||||
*/
|
*/
|
||||||
{"id":U32;"name":string;"isProtected":boolean;"profileImage":(string|null);"archived":boolean;"chatType":U32;"isUnpromoted":boolean;"isSelfTalk":boolean;"color":string;"isContactRequest":boolean;"isDeviceChat":boolean;"isMuted":boolean;};
|
{"id":U32;"name":string;"isProtected":boolean;"profileImage":(string|null);"archived":boolean;"chatType":U32;"isUnpromoted":boolean;"isSelfTalk":boolean;"color":string;"isContactRequest":boolean;"isDeviceChat":boolean;"isMuted":boolean;};
|
||||||
|
export type ChatVisibility=("Normal"|"Archived"|"Pinned");
|
||||||
export type MuteDuration=("NotMuted"|"Forever"|{"Until":I64;});
|
export type MuteDuration=("NotMuted"|"Forever"|{"Until":I64;});
|
||||||
export type MessageQuote=(({"kind":"JustText";}&{"text":string;})|({"kind":"WithMessage";}&{"text":string;"messageId":U32;"authorDisplayName":string;"authorDisplayColor":string;"overrideSenderName":(string|null);"image":(string|null);"isForwarded":boolean;}));
|
export type MessageQuote=(({"kind":"JustText";}&{"text":string;})|({"kind":"WithMessage";}&{"text":string;"messageId":U32;"authorDisplayName":string;"authorDisplayColor":string;"overrideSenderName":(string|null);"image":(string|null);"isForwarded":boolean;}));
|
||||||
export type Viewtype=("Unknown"|
|
export type Viewtype=("Unknown"|
|
||||||
@@ -97,7 +99,6 @@ export type Viewtype=("Unknown"|
|
|||||||
*/
|
*/
|
||||||
"Webxdc");
|
"Webxdc");
|
||||||
export type I32=number;
|
export type I32=number;
|
||||||
export type U64=number;
|
|
||||||
export type WebxdcMessageInfo={
|
export type WebxdcMessageInfo={
|
||||||
/**
|
/**
|
||||||
* The name of the app.
|
* The name of the app.
|
||||||
@@ -148,4 +149,5 @@ export type MessageNotificationInfo={"id":U32;"chatId":U32;"accountId":U32;"imag
|
|||||||
"summaryText":string;};
|
"summaryText":string;};
|
||||||
export type MessageSearchResult={"id":U32;"authorProfileImage":(string|null);"authorName":string;"authorColor":string;"chatName":(string|null);"message":string;"timestamp":I64;};
|
export type MessageSearchResult={"id":U32;"authorProfileImage":(string|null);"authorName":string;"authorColor":string;"chatName":(string|null);"message":string;"timestamp":I64;};
|
||||||
export type F64=number;
|
export type F64=number;
|
||||||
export type __AllTyps=[string,boolean,Record<string,string>,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],U32,Account,U32,string,(ProviderInfo|null),U32,boolean,U32,Record<string,string>,U32,string,(string|null),null,U32,Record<string,(string|null)>,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record<string,(string|null)>,U32,null,U32,null,U32,(U32)[],U32,U32,Usize,U32,string,U32,U32,string,null,U32,(U32|null),(string|null),(U32|null),(ChatListEntry)[],U32,(ChatListEntry)[],Record<U32,ChatListItemFetchResult>,U32,U32,FullChat,U32,U32,BasicChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,U32,null,U32,U32,U32,null,U32,U32,U32,null,U32,U32,(U32)[],U32,string,boolean,U32,U32,U32,U32,U32,string,null,U32,U32,(string|null),null,U32,string,string,U32,U32,U32,null,U32,U32,(U32|null),U32,U32,MuteDuration,null,U32,U32,boolean,U32,(U32)[],null,U32,U32,U32,(U32)[],U32,U32,Message,U32,(U32)[],Record<U32,Message>,U32,U32,MessageNotificationInfo,U32,(U32)[],null,U32,U32,string,U32,U32,null,U32,string,(U32|null),(U32)[],U32,(U32)[],Record<U32,MessageSearchResult>,U32,U32,Contact,U32,string,(string|null),U32,U32,U32,U32,U32,U32,null,U32,U32,null,U32,(Contact)[],U32,U32,(string|null),(U32)[],U32,U32,(string|null),(Contact)[],U32,(U32)[],Record<U32,Contact>,U32,U32,string,U32,string,(U32|null),U32,(U32|null),Viewtype,(Viewtype|null),(Viewtype|null),(U32)[],U32,U32,Viewtype,(Viewtype|null),(Viewtype|null),[(U32|null),(U32|null)],null,U32,U32,U32,string,U32,U32,string,string,null,U32,U32,U32,string,U32,U32,WebxdcMessageInfo,U32,(U32)[],U32,null,U32,U32,null,U32,U32,(Message|null),U32,U32,U32,U32,string,U32,U32,U32,U32,(string|null),(string|null),([F64,F64]|null),(U32|null),[U32,Message],U32,U32,(string|null),(string|null),(U32|null),null];
|
export type Location={"locationId":U32;"isIndependent":boolean;"latitude":F64;"longitude":F64;"accuracy":F64;"timestamp":I64;"contactId":U32;"msgId":U32;"chatId":U32;"marker":(string|null);};
|
||||||
|
export type __AllTyps=[string,boolean,Record<string,string>,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],U32,Account,U32,U64,U32,string,(ProviderInfo|null),U32,boolean,U32,Record<string,string>,U32,string,(string|null),null,U32,Record<string,(string|null)>,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record<string,(string|null)>,Record<U32,string>,null,U32,null,U32,null,U32,string,(string|null),null,U32,string,(string|null),null,U32,(U32)[],U32,U32,Usize,U32,boolean,I64,Usize,U32,string,U32,U32,string,null,U32,(U32|null),(string|null),(U32|null),(ChatListEntry)[],U32,(ChatListEntry)[],Record<U32,ChatListItemFetchResult>,U32,U32,FullChat,U32,U32,BasicChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,U32,null,U32,U32,U32,null,U32,U32,U32,null,U32,U32,(U32)[],U32,string,boolean,U32,U32,U32,U32,U32,string,null,U32,U32,(string|null),null,U32,U32,ChatVisibility,null,U32,U32,U32,null,U32,U32,U32,U32,string,string,U32,U32,U32,null,U32,U32,(U32|null),U32,U32,MuteDuration,null,U32,U32,boolean,U32,(U32)[],null,U32,U32,U32,(U32)[],U32,U32,Message,U32,(U32)[],Record<U32,Message>,U32,U32,MessageNotificationInfo,U32,(U32)[],null,U32,U32,string,U32,U32,null,U32,string,(U32|null),(U32)[],U32,(U32)[],Record<U32,MessageSearchResult>,U32,U32,Contact,U32,string,(string|null),U32,U32,U32,U32,U32,U32,null,U32,U32,null,U32,(Contact)[],U32,U32,(string|null),(U32)[],U32,U32,(string|null),(Contact)[],U32,(U32)[],Record<U32,Contact>,U32,U32,string,U32,string,(U32|null),U32,(U32|null),Viewtype,(Viewtype|null),(Viewtype|null),(U32)[],U32,U32,Viewtype,(Viewtype|null),(Viewtype|null),[(U32|null),(U32|null)],null,U32,U32,U32,string,U32,(U32|null),(U32|null),I64,I64,(Location)[],U32,U32,string,string,null,U32,U32,U32,string,U32,U32,WebxdcMessageInfo,U32,(U32)[],U32,null,U32,U32,null,U32,U32,(Message|null),U32,U32,U32,U32,string,U32,U32,U32,U32,(string|null),(string|null),([F64,F64]|null),(U32|null),[U32,Message],U32,U32,(string|null),(string|null),(U32|null),null];
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ pub struct Accounts {
|
|||||||
///
|
///
|
||||||
/// This way changing a translation for one context automatically
|
/// This way changing a translation for one context automatically
|
||||||
/// changes it for all other contexts.
|
/// changes it for all other contexts.
|
||||||
stockstrings: StockStrings,
|
pub(crate) stockstrings: StockStrings,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Accounts {
|
impl Accounts {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use strum::EnumProperty as EnumPropertyTrait;
|
|||||||
use strum_macros::EnumProperty;
|
use strum_macros::EnumProperty;
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
|
use crate::accounts::Accounts;
|
||||||
use crate::blob::BlobObject;
|
use crate::blob::BlobObject;
|
||||||
use crate::chat::{self, Chat, ChatId, ProtectionStatus};
|
use crate::chat::{self, Chat, ChatId, ProtectionStatus};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
@@ -1302,6 +1303,17 @@ impl Context {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Accounts {
|
||||||
|
/// Set the stock string for the [StockMessage].
|
||||||
|
///
|
||||||
|
pub async fn set_stock_translation(&self, id: StockMessage, stockstring: String) -> Result<()> {
|
||||||
|
self.stockstrings
|
||||||
|
.set_stock_translation(id, stockstring)
|
||||||
|
.await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
|
|||||||
Reference in New Issue
Block a user