diff --git a/CHANGELOG.md b/CHANGELOG.md index 974b809eb..6788711f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - `exportBackup()` - `importBackup()` - `getMessageHtml()` #3671 + - `miscGetStickerFolder` and `miscGetStickers` #3672 - breaking: jsonrpc: remove function `messageListGetMessageIds()`, it is replaced by `getMessageIds()` and `getMessageListItems()` the latter returns a new `MessageListItem` type, which is the now prefered way of using the message list. - jsonrpc: add type: #3641, #3645 - `MessageSearchResult` diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 04bec904c..20ad089f5 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -24,7 +24,7 @@ use deltachat::{ use std::collections::BTreeMap; use std::sync::Arc; use std::{collections::HashMap, str::FromStr}; -use tokio::sync::RwLock; +use tokio::{fs, sync::RwLock}; use walkdir::WalkDir; use yerpc::rpc; @@ -1500,6 +1500,63 @@ impl CommandApi { // that might get removed later again // --------------------------------------------- + async fn misc_get_sticker_folder(&self, account_id: u32) -> Result { + let ctx = self.get_context(account_id).await?; + let account_folder = ctx + .get_dbfile() + .parent() + .context("account folder not found")?; + let sticker_folder_path = account_folder.join("./stickers"); + fs::create_dir_all(&sticker_folder_path).await?; + sticker_folder_path + .to_str() + .map(|s| s.to_owned()) + .context("path conversion to string failed") + } + + /// for desktop, get stickers from stickers folder, + /// grouped by the folder they are in. + async fn misc_get_stickers(&self, account_id: u32) -> Result>> { + let ctx = self.get_context(account_id).await?; + let account_folder = ctx + .get_dbfile() + .parent() + .context("account folder not found")?; + let sticker_folder_path = account_folder.join("./stickers"); + fs::create_dir_all(&sticker_folder_path).await?; + let mut result = HashMap::new(); + + let mut packs = tokio::fs::read_dir(sticker_folder_path).await?; + while let Some(entry) = packs.next_entry().await? { + if !entry.file_type().await?.is_dir() { + continue; + } + let pack_name = entry.file_name().into_string().unwrap_or_default(); + let mut stickers = tokio::fs::read_dir(entry.path()).await?; + let mut sticker_paths = Vec::new(); + while let Some(sticker_entry) = stickers.next_entry().await? { + if !sticker_entry.file_type().await?.is_file() { + continue; + } + let sticker_name = sticker_entry.file_name().into_string().unwrap_or_default(); + if sticker_name.ends_with(".png") || sticker_name.ends_with(".webp") { + sticker_paths.push( + sticker_entry + .path() + .to_str() + .map(|s| s.to_owned()) + .context("path conversion to string failed")?, + ); + } + } + if !sticker_paths.is_empty() { + result.insert(pack_name, sticker_paths); + } + } + + Ok(result) + } + /// Returns the messageid of the sent message async fn misc_send_text_message( &self, diff --git a/deltachat-jsonrpc/typescript/generated/client.ts b/deltachat-jsonrpc/typescript/generated/client.ts index 5676406ba..875aa6d19 100644 --- a/deltachat-jsonrpc/typescript/generated/client.ts +++ b/deltachat-jsonrpc/typescript/generated/client.ts @@ -895,6 +895,19 @@ export class RawClient { return (this._transport.request('send_videochat_invitation', [accountId, chatId] as RPC.Params)) as Promise; } + + public miscGetStickerFolder(accountId: T.U32): Promise { + return (this._transport.request('misc_get_sticker_folder', [accountId] as RPC.Params)) as Promise; + } + + /** + * for desktop, get stickers from stickers folder, + * grouped by the folder they are in. + */ + public miscGetStickers(accountId: T.U32): Promise> { + return (this._transport.request('misc_get_stickers', [accountId] as RPC.Params)) as Promise>; + } + /** * Returns the messageid of the sent message */ diff --git a/deltachat-jsonrpc/typescript/generated/types.ts b/deltachat-jsonrpc/typescript/generated/types.ts index 283962df1..b36ad0d8e 100644 --- a/deltachat-jsonrpc/typescript/generated/types.ts +++ b/deltachat-jsonrpc/typescript/generated/types.ts @@ -160,4 +160,4 @@ export type MessageNotificationInfo={"id":U32;"chatId":U32;"accountId":U32;"imag 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 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,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],null,null,U32,null,U32,null,U32,Account,U32,U64,U32,string,(ProviderInfo|null),U32,boolean,U32,Record,U32,string,(string|null),null,U32,Record,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record,Record,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,U32,FullChat,U32,U32,BasicChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,string,U32,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,U32,(MessageListItem)[],U32,U32,Message,U32,U32,(string|null),U32,(U32)[],Record,U32,U32,MessageNotificationInfo,U32,(U32)[],null,U32,U32,string,U32,U32,null,U32,string,(U32|null),(U32)[],U32,(U32)[],Record,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,U32,boolean,U32,U32,string,null,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)],U32,string,(string|null),null,U32,string,(string|null),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,string,U32,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 __AllTyps=[string,boolean,Record,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],null,null,U32,null,U32,null,U32,Account,U32,U64,U32,string,(ProviderInfo|null),U32,boolean,U32,Record,U32,string,(string|null),null,U32,Record,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record,Record,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,U32,FullChat,U32,U32,BasicChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,string,U32,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,U32,(MessageListItem)[],U32,U32,Message,U32,U32,(string|null),U32,(U32)[],Record,U32,U32,MessageNotificationInfo,U32,(U32)[],null,U32,U32,string,U32,U32,null,U32,string,(U32|null),(U32)[],U32,(U32)[],Record,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,U32,boolean,U32,U32,string,null,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)],U32,string,(string|null),null,U32,string,(string|null),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,string,U32,U32,U32,null,U32,U32,(Message|null),U32,U32,U32,U32,string,U32,Record,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];