Inline native methods

The split no longer makes sense now that uniffi is the bridge.
master
Lonami Exo 2022-10-27 19:44:48 +02:00
parent d11a00d062
commit 1574ce683c
1 changed files with 45 additions and 77 deletions

View File

@ -3,7 +3,7 @@
mod db;
use grammers_client::types::{Dialog as OgDialog, LoginToken};
use grammers_client::types::LoginToken;
use grammers_client::{Client, Config, InitParams};
use grammers_session::{PackedChat, Session, UpdateState};
use grammers_tl_types as tl;
@ -104,7 +104,22 @@ fn block_on<F: Future>(future: F) -> F::Output {
RUNTIME.get().unwrap().block_on(future)
}
async fn init_client() -> Result<()> {
pub fn initDatabase(path: String) -> Result<()> {
let mut guard = DATABASE.lock().unwrap();
if guard.is_some() {
info!("Database is already initialized");
}
match db::init_connection(&path) {
Ok(conn) => {
*guard = Some(conn);
Ok(())
}
Err(_) => Err(NativeError::Database),
}
}
pub fn initClient() -> Result<()> {
android_logger::init_once(
android_logger::Config::default()
.with_min_level(LOG_MIN_LEVEL)
@ -155,7 +170,7 @@ async fn init_client() -> Result<()> {
}
}
let client = Client::connect(Config {
let client = block_on(Client::connect(Config {
session,
api_id: API_ID,
api_hash: API_HASH.to_string(),
@ -167,8 +182,7 @@ async fn init_client() -> Result<()> {
},
..Default::default()
},
})
.await
}))
.map_err(|_| NativeError::Network)?;
info!("Connected!");
@ -180,28 +194,23 @@ async fn init_client() -> Result<()> {
Ok(())
}
async fn need_login() -> Result<bool> {
pub fn needLogin() -> Result<bool> {
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
client
.is_authorized()
.await
block_on(client.is_authorized()).map_err(|_| NativeError::Network)
}
pub fn requestLoginCode(phone: String) -> Result<u64> {
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
block_on(client.request_login_code(&phone, API_ID, API_HASH))
.map(|token| Box::into_raw(Box::new(token)) as u64)
.map_err(|_| NativeError::Network)
}
async fn request_login_code(phone: &str) -> Result<LoginToken> {
pub fn signIn(token_ptr: u64, code: String) -> Result<()> {
let token = unsafe { *Box::from_raw(token_ptr as *mut LoginToken) };
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
client
.request_login_code(&phone, API_ID, API_HASH)
.await
.map_err(|_| NativeError::Network)
}
async fn sign_in(token: LoginToken, code: &str) -> Result<()> {
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
client
.sign_in(&token, &code)
.await
.map_err(|_| NativeError::Network)?;
block_on(client.sign_in(&token, &code)).map_err(|_| NativeError::Network)?;
let guard = DATABASE.lock().unwrap();
let conn = match guard.as_ref() {
@ -247,61 +256,18 @@ async fn sign_in(token: LoginToken, code: &str) -> Result<()> {
Ok(())
}
async fn get_dialogs() -> Result<Vec<OgDialog>> {
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
let mut result = Vec::new();
let mut dialogs = client.iter_dialogs();
while let Some(dialog) = dialogs.next().await.map_err(|_| NativeError::Network)? {
result.push(dialog);
}
Ok(result)
}
async fn send_message(chat: PackedChat, text: &str) -> Result<()> {
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
client
.send_message(chat, text)
.await
.map_err(|_| NativeError::Network)?;
Ok(())
}
pub fn initDatabase(path: String) -> Result<()> {
let mut guard = DATABASE.lock().unwrap();
if guard.is_some() {
info!("Database is already initialized");
}
match db::init_connection(&path) {
Ok(conn) => {
*guard = Some(conn);
Ok(())
}
Err(e) => Err(NativeError::Database),
}
}
pub fn initClient() -> Result<()> {
block_on(init_client())
}
pub fn needLogin() -> Result<bool> {
block_on(need_login())
}
pub fn requestLoginCode(phone: String) -> Result<u64> {
block_on(request_login_code(&phone)).map(|token| Box::into_raw(Box::new(token)) as u64)
}
pub fn signIn(token_ptr: u64, code: String) -> Result<()> {
let token = unsafe { *Box::from_raw(token_ptr as *mut LoginToken) };
block_on(sign_in(token, &code))
}
pub fn getDialogs() -> Result<Vec<Dialog>> {
block_on(get_dialogs()).map(|dialogs| {
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
block_on(async {
let mut result = Vec::new();
let mut dialogs = client.iter_dialogs();
while let Some(dialog) = dialogs.next().await.map_err(|_| NativeError::Network)? {
result.push(dialog);
}
Ok(result)
})
.map(|dialogs| {
dialogs
.into_iter()
.map(|d| Dialog {
@ -340,6 +306,8 @@ pub fn getDialogs() -> Result<Vec<Dialog>> {
}
pub fn sendMessage(packed: String, text: String) -> Result<()> {
let packed = PackedChat::from_hex(&packed).unwrap();
block_on(send_message(packed, &text))
let chat = PackedChat::from_hex(&packed).unwrap();
let client = CLIENT.get().ok_or(NativeError::Initialization)?;
block_on(client.send_message(chat, text)).map_err(|_| NativeError::Network)?;
Ok(())
}