121 lines
3.9 KiB
Rust
121 lines
3.9 KiB
Rust
use magnetar_calckey_model::ck;
|
|
use magnetar_calckey_model::note_model::sub_interaction_renote;
|
|
use magnetar_sdk::types::note::{
|
|
NoteDetailExt, NoteSelfContextExt, PackNoteMaybeAttachments, PackPollBase, ReactionPair,
|
|
};
|
|
use magnetar_sdk::types::user::PackUserBase;
|
|
use magnetar_sdk::types::{
|
|
drive::PackDriveFileBase,
|
|
emoji::EmojiContext,
|
|
note::{NoteAttachmentExt, NoteBase, NoteVisibility},
|
|
user::UserBase,
|
|
MmXml,
|
|
};
|
|
use magnetar_sdk::{Packed, Required};
|
|
|
|
use crate::model::{PackType, PackingContext};
|
|
|
|
pub struct NoteBaseSource<'a> {
|
|
pub note: &'a ck::note::Model,
|
|
pub cw_mm: Option<&'a MmXml>,
|
|
pub text_mm: Option<&'a MmXml>,
|
|
pub reactions: &'a Vec<ReactionPair>,
|
|
pub user: &'a UserBase,
|
|
pub emoji_context: &'a EmojiContext,
|
|
}
|
|
|
|
impl PackType<NoteBaseSource<'_>> for NoteBase {
|
|
fn extract(
|
|
_context: &PackingContext,
|
|
NoteBaseSource {
|
|
note,
|
|
text_mm,
|
|
cw_mm,
|
|
reactions,
|
|
user,
|
|
emoji_context,
|
|
}: NoteBaseSource<'_>,
|
|
) -> Self {
|
|
use ck::sea_orm_active_enums::NoteVisibilityEnum as NVE;
|
|
NoteBase {
|
|
created_at: note.created_at.into(),
|
|
updated_at: note.updated_at.map(|d| d.into()),
|
|
cw: note.cw.clone(),
|
|
cw_mm: cw_mm.cloned(),
|
|
uri: note.uri.clone(),
|
|
url: note.url.clone(),
|
|
text: note.text.clone().unwrap_or_default(),
|
|
text_mm: text_mm.map(ToOwned::to_owned).clone(),
|
|
visibility: match note.visibility {
|
|
NVE::Followers => NoteVisibility::Followers,
|
|
NVE::Hidden => NoteVisibility::Direct,
|
|
NVE::Public => NoteVisibility::Public,
|
|
NVE::Home => NoteVisibility::Home,
|
|
NVE::Specified => NoteVisibility::Direct,
|
|
},
|
|
user: Box::new(PackUserBase::pack_from((
|
|
Required(note.user_id.as_str().into()),
|
|
Required(user.clone()),
|
|
))),
|
|
parent_note_id: note.reply_id.clone(),
|
|
renoted_note_id: note.renote_id.clone(),
|
|
reply_count: note.replies_count as u64,
|
|
renote_count: note.renote_count as u64,
|
|
mentions: note.mentions.clone(),
|
|
hashtags: note.tags.clone(),
|
|
visible_user_ids: matches!(note.visibility, NVE::Specified)
|
|
.then(|| note.visible_user_ids.clone()),
|
|
reactions: reactions.clone(),
|
|
local_only: note.local_only,
|
|
has_poll: note.has_poll,
|
|
file_ids: note.file_ids.clone(),
|
|
emojis: emoji_context.clone(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl PackType<&sub_interaction_renote::Model> for NoteSelfContextExt {
|
|
fn extract(_context: &PackingContext, data: &sub_interaction_renote::Model) -> Self {
|
|
NoteSelfContextExt {
|
|
self_renote_count: data.renotes.map(|v| v as u64),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct NoteDetailSource<'a> {
|
|
pub parent_note: Option<&'a PackNoteMaybeAttachments>,
|
|
pub renoted_note: Option<&'a PackNoteMaybeAttachments>,
|
|
}
|
|
|
|
impl<'a> PackType<NoteDetailSource<'a>> for NoteDetailExt {
|
|
fn extract(
|
|
_context: &PackingContext,
|
|
NoteDetailSource {
|
|
parent_note,
|
|
renoted_note,
|
|
}: NoteDetailSource<'a>,
|
|
) -> Self {
|
|
NoteDetailExt {
|
|
parent_note: parent_note.cloned().map(Box::new),
|
|
renoted_note: renoted_note.cloned().map(Box::new),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct NoteAttachmentSource<'a> {
|
|
pub attachments: &'a [PackDriveFileBase],
|
|
pub poll: Option<&'a PackPollBase>,
|
|
}
|
|
|
|
impl<'a> PackType<NoteAttachmentSource<'a>> for NoteAttachmentExt {
|
|
fn extract(
|
|
_context: &PackingContext,
|
|
NoteAttachmentSource { poll, attachments }: NoteAttachmentSource<'a>,
|
|
) -> Self {
|
|
NoteAttachmentExt {
|
|
attachments: attachments.to_vec(),
|
|
poll: poll.cloned(),
|
|
}
|
|
}
|
|
}
|