54 lines
1.7 KiB
Rust
54 lines
1.7 KiB
Rust
use crate::model::data::user::UserBaseSource;
|
|
use crate::model::processing::emoji::EmojiModel;
|
|
use crate::model::processing::{get_mm_token_emoji, PackResult};
|
|
use crate::model::{PackType, PackingContext};
|
|
use magnetar_calckey_model::ck;
|
|
use magnetar_sdk::mmm::Token;
|
|
use magnetar_sdk::types::emoji::EmojiContext;
|
|
use magnetar_sdk::types::user::{PackUserBase, UserBase};
|
|
use magnetar_sdk::types::{Id, MmXml};
|
|
use magnetar_sdk::{mmm, Packed, Required};
|
|
|
|
pub struct UserModel;
|
|
|
|
impl UserModel {
|
|
pub fn tokenize_username(&self, user: &ck::user::Model) -> Token {
|
|
mmm::Context::default().parse_ui(user.name.as_deref().unwrap_or(&user.username))
|
|
}
|
|
|
|
pub async fn base_from_existing(
|
|
&self,
|
|
ctx: &PackingContext,
|
|
user: &ck::user::Model,
|
|
) -> PackResult<PackUserBase> {
|
|
let avatar = match &user.avatar_id {
|
|
Some(av_id) => ctx.service.drive_file_cache.get(av_id).await?,
|
|
None => None,
|
|
};
|
|
|
|
let username_mm = self.tokenize_username(&user);
|
|
|
|
let emoji_model = EmojiModel;
|
|
let shortcodes = emoji_model.deduplicate_emoji(ctx, get_mm_token_emoji(&username_mm));
|
|
let emojis = emoji_model
|
|
.fetch_many_emojis(ctx, &shortcodes, user.host.as_deref())
|
|
.await?;
|
|
let emoji_context = EmojiContext(emojis);
|
|
|
|
let base = UserBase::extract(
|
|
ctx,
|
|
UserBaseSource {
|
|
user,
|
|
username_mm: mmm::to_xml_string(&username_mm).map(MmXml).as_ref().ok(),
|
|
avatar: avatar.as_deref(),
|
|
emoji_context: &emoji_context,
|
|
},
|
|
);
|
|
|
|
Ok(PackUserBase::pack_from((
|
|
Required(Id::from(&user.id)),
|
|
Required(base),
|
|
)))
|
|
}
|
|
}
|