OneLauncher-Cracked/packages/core/src/api/ingress.rs
2025-04-11 14:24:00 +02:00

199 lines
4.9 KiB
Rust

use crate::LauncherResult;
use crate::store::State;
use crate::store::ingress::{IngressId, IngressType, SubIngress};
#[tracing::instrument]
pub async fn init_ingress(
ingress_type: IngressType,
message: &str,
total: f64,
) -> LauncherResult<IngressId> {
let state = State::get().await?;
let processor = &state.ingress_processor;
let id = processor
.create(ingress_type, message.to_string(), total)
.await?;
Ok(id)
}
pub async fn init_ingress_opt(
init: bool,
ingress_type: IngressType,
message: &str,
total: f64,
) -> LauncherResult<Option<IngressId>> {
if init {
let id = init_ingress(ingress_type, message, total).await?;
Ok(Some(id))
} else {
Ok(None)
}
}
/// Sends an ingress update with the given increment and message
#[tracing::instrument]
pub async fn send_ingress_message(
id: &IngressId,
increment: f64,
message: Option<&str>,
) -> LauncherResult<()> {
if !State::initialized() {
tracing::debug!("attempted to send ingress when state is not initialized");
return Ok(());
}
let state = State::get().await?;
let processor = &state.ingress_processor;
processor
.send(id, increment, message.map(String::from))
.await?;
Ok(())
}
/// Sends an ingress update with the given increment
pub async fn send_ingress(
id: &IngressId,
increment: f64,
) -> LauncherResult<()> {
send_ingress_message(id, increment, None).await
}
/// Sends an ingress update with the given message (does not increment)
pub async fn set_ingress_message(
id: &IngressId,
message: &str,
) -> LauncherResult<()> {
send_ingress_message(id, 0.0, Some(message)).await
}
#[async_trait::async_trait]
pub trait IngressSendExt {
async fn send_ingress_message(&self, increment: f64, message: Option<&str>) -> LauncherResult<()>;
async fn send_ingress(&self, increment: f64) -> LauncherResult<()>;
async fn set_ingress_message(&self, message: &str) -> LauncherResult<()>;
}
#[async_trait::async_trait]
impl IngressSendExt for IngressId {
async fn send_ingress_message(&self, increment: f64, message: Option<&str>) -> LauncherResult<()> {
send_ingress_message(self, increment, message).await
}
async fn send_ingress(&self, increment: f64) -> LauncherResult<()> {
send_ingress(self, increment).await
}
async fn set_ingress_message(&self, message: &str) -> LauncherResult<()> {
set_ingress_message(self, message).await
}
}
#[async_trait::async_trait]
impl IngressSendExt for Option<&IngressId> {
async fn send_ingress_message(&self, increment: f64, message: Option<&str>) -> LauncherResult<()> {
if let Some(id) = self {
id.send_ingress_message(increment, message).await
} else {
Ok(())
}
}
async fn send_ingress(&self, increment: f64) -> LauncherResult<()> {
if let Some(id) = self {
id.send_ingress(increment).await
} else {
Ok(())
}
}
async fn set_ingress_message(&self, message: &str) -> LauncherResult<()> {
if let Some(id) = self {
id.set_ingress_message(message).await
} else {
Ok(())
}
}
}
#[async_trait::async_trait]
impl IngressSendExt for &SubIngress<'_> {
async fn send_ingress_message(&self, increment: f64, message: Option<&str>) -> LauncherResult<()> {
self.id.send_ingress_message(increment, message).await
}
async fn send_ingress(&self, increment: f64) -> LauncherResult<()> {
self.id.send_ingress(increment).await
}
async fn set_ingress_message(&self, message: &str) -> LauncherResult<()> {
self.id.set_ingress_message(message).await
}
}
#[async_trait::async_trait]
impl IngressSendExt for Option<&SubIngress<'_>> {
async fn send_ingress_message(&self, increment: f64, message: Option<&str>) -> LauncherResult<()> {
if let Some(id) = self {
id.send_ingress_message(increment, message).await
} else {
Ok(())
}
}
async fn send_ingress(&self, increment: f64) -> LauncherResult<()> {
if let Some(id) = self {
id.send_ingress(increment).await
} else {
Ok(())
}
}
async fn set_ingress_message(&self, message: &str) -> LauncherResult<()> {
if let Some(id) = self {
id.set_ingress_message(message).await
} else {
Ok(())
}
}
}
#[cfg(test)]
pub mod tests {
use crate::api::ingress::{init_ingress, IngressSendExt};
use crate::api::proxy::ProxyDynamic;
use crate::initialize_core;
use crate::store::CoreOptions;
use crate::store::ingress::IngressType;
use std::time::Duration;
#[tokio::test]
pub async fn create_and_update_ingress() -> crate::LauncherResult<()> {
initialize_core(CoreOptions::default(), ProxyDynamic::new()).await?;
let id = init_ingress(
IngressType::Download {
file_name: "Some-Mod-1.8.9.jar".into(),
},
"this is a test message",
100.0,
)
.await?;
tokio::time::sleep(Duration::from_millis(2350)).await;
id.send_ingress(10.0).await?;
tokio::time::sleep(Duration::from_millis(2500)).await;
id.send_ingress(20.0).await?;
tokio::time::sleep(Duration::from_millis(2500)).await;
id.send_ingress(70.0).await?;
tokio::time::sleep(Duration::from_millis(2500)).await;
drop(id);
Ok(())
}
}