Files
Rocketmc/apps/labrinth/src/sync/status.rs
Prospector 3dad6b317f MR App 0.9.5 - Big bugfix update (#3585)
* Add launcher_feature_version to Profile

* Misc fixes

- Add typing to theme and settings stuff
- Push instance route on creation from installing a modpack
- Fixed servers not reloading properly when first added

* Make old instances scan the logs folder for joined servers on launcher startup

* Create AttachedWorldData

* Change AttachedWorldData interface

* Rename WorldType::World to WorldType::Singleplayer

* Implement world display status system

* Fix Minecraft font

* Fix set_world_display_status Tauri error

* Add 'Play instance' option

* Add option to disable worlds showing in Home

* Fixes

- Fix available server filter only showing if there are some available
- Fixed server and singleplayer filters sometimes showing when there are only servers or singleplayer worlds
- Fixed new worlds not being automatically added when detected
- Rephrased Jump back into worlds option description

* Fixed sometimes more than 6 items showing up in Jump back in

* Fix servers.dat issue with instances you haven't played before

* Fix too large of bulk requests being made, limit max to 800 #3430

* Add hiding from home page, add types to Mods.vue

* Make recent worlds go into grid when display is huge

* Fix lint

* Remove redundant media query

* Fix protocol version on home page, and home page being blocked by pinging servers

* Clippy fix

* More Clippy fixes

* Fix Prettier lints

* Undo `from_string` changes

---------

Co-authored-by: Josiah Glosson <soujournme@gmail.com>
Co-authored-by: Alejandro González <me@alegon.dev>
2025-05-01 16:13:13 -07:00

72 lines
2.0 KiB
Rust

use crate::database::redis::RedisPool;
use crate::queue::socket::ActiveSockets;
use ariadne::ids::UserId;
use ariadne::users::UserStatus;
use redis::AsyncCommands;
const EXPIRY_TIME_SECONDS: i64 = 60;
pub async fn get_user_status(
user: UserId,
local_sockets: &ActiveSockets,
redis: &RedisPool,
) -> Option<UserStatus> {
if let Some(friend_status) = local_sockets.get_status(user) {
return Some(friend_status);
}
if let Ok(mut conn) = redis.pool.get().await {
if let Ok(mut statuses) =
conn.sscan::<_, String>(get_field_name(user)).await
{
if let Some(status_json) = statuses.next_item().await {
return serde_json::from_str::<UserStatus>(&status_json).ok();
}
}
}
None
}
pub async fn replace_user_status(
old_status: Option<&UserStatus>,
new_status: Option<&UserStatus>,
redis: &RedisPool,
) -> Result<(), redis::RedisError> {
let Some(user) = new_status.or(old_status).map(|x| x.user_id) else {
return Ok(());
};
if let Ok(mut conn) = redis.pool.get().await {
let field_name = get_field_name(user);
let mut pipe = redis::pipe();
pipe.atomic();
if let Some(status) = old_status {
pipe.srem(&field_name, serde_json::to_string(&status).unwrap())
.ignore();
}
if let Some(status) = new_status {
pipe.sadd(&field_name, serde_json::to_string(&status).unwrap())
.ignore();
pipe.expire(&field_name, EXPIRY_TIME_SECONDS).ignore();
}
return pipe.query_async(&mut conn).await;
}
Ok(())
}
pub async fn push_back_user_expiry(
user: UserId,
redis: &RedisPool,
) -> Result<(), redis::RedisError> {
if let Ok(mut conn) = redis.pool.get().await {
return conn.expire(get_field_name(user), EXPIRY_TIME_SECONDS).await;
}
Ok(())
}
fn get_field_name(user: UserId) -> String {
format!("user_status:{user}")
}