1
This commit is contained in:
@@ -414,9 +414,10 @@ pub async fn get_custom_world_library(
|
||||
Extension(authenticated): Extension<AuthenticatedAccessToken>,
|
||||
) -> Result<Json<Value>, Response> {
|
||||
let owner_user_id = authenticated.claims().user_id().to_string();
|
||||
let author_display_name = resolve_author_display_name(&state, &authenticated);
|
||||
let entries = state
|
||||
.spacetime_client()
|
||||
.list_custom_world_profiles(owner_user_id)
|
||||
.list_custom_world_works(owner_user_id.clone())
|
||||
.await
|
||||
.map_err(|error| {
|
||||
custom_world_error_response(&request_context, map_custom_world_client_error(error))
|
||||
@@ -427,7 +428,13 @@ pub async fn get_custom_world_library(
|
||||
CustomWorldLibraryResponse {
|
||||
entries: entries
|
||||
.into_iter()
|
||||
.map(map_custom_world_library_entry_response)
|
||||
.filter_map(|item| {
|
||||
map_custom_world_library_entry_response_from_work_summary(
|
||||
item,
|
||||
&owner_user_id,
|
||||
&author_display_name,
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
))
|
||||
@@ -2712,9 +2719,89 @@ fn map_custom_world_library_entry_response(
|
||||
play_count: entry.play_count,
|
||||
remix_count: entry.remix_count,
|
||||
like_count: entry.like_count,
|
||||
recent_play_count_7d: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn map_custom_world_library_entry_response_from_work_summary(
|
||||
item: CustomWorldWorkSummaryRecord,
|
||||
owner_user_id: &str,
|
||||
author_display_name: &str,
|
||||
) -> Option<CustomWorldLibraryEntryResponse> {
|
||||
let profile_id = item.profile_id.as_ref()?.clone();
|
||||
let profile = build_custom_world_library_list_profile_payload(&item, &profile_id);
|
||||
Some(CustomWorldLibraryEntryResponse {
|
||||
owner_user_id: owner_user_id.to_string(),
|
||||
public_work_code: (item.status == "published")
|
||||
.then(|| build_public_work_code_from_profile_id(&profile_id)),
|
||||
profile_id,
|
||||
author_public_user_code: None,
|
||||
profile,
|
||||
visibility: item.status,
|
||||
published_at: item.published_at,
|
||||
updated_at: item.updated_at,
|
||||
author_display_name: author_display_name.to_string(),
|
||||
world_name: item.title,
|
||||
subtitle: item.subtitle,
|
||||
summary_text: item.summary,
|
||||
cover_image_src: item.cover_image_src,
|
||||
theme_mode: "mythic".to_string(),
|
||||
playable_npc_count: item.playable_npc_count,
|
||||
landmark_count: item.landmark_count,
|
||||
play_count: 0,
|
||||
remix_count: 0,
|
||||
like_count: 0,
|
||||
recent_play_count_7d: 0,
|
||||
})
|
||||
}
|
||||
|
||||
fn build_public_work_code_from_profile_id(profile_id: &str) -> String {
|
||||
let digits = profile_id
|
||||
.chars()
|
||||
.filter(|character| character.is_ascii_digit())
|
||||
.collect::<String>();
|
||||
let normalized_digits = if digits.is_empty() {
|
||||
let checksum = profile_id.bytes().fold(0u32, |accumulator, value| {
|
||||
accumulator.wrapping_mul(131) + u32::from(value)
|
||||
});
|
||||
format!("{:08}", checksum % 100_000_000)
|
||||
} else {
|
||||
format!("{:0>8}", &digits[digits.len().saturating_sub(8)..])
|
||||
};
|
||||
|
||||
format!("CW-{normalized_digits}")
|
||||
}
|
||||
|
||||
fn build_custom_world_library_list_profile_payload(
|
||||
item: &CustomWorldWorkSummaryRecord,
|
||||
profile_id: &str,
|
||||
) -> Value {
|
||||
json!({
|
||||
"id": profile_id,
|
||||
"name": item.title,
|
||||
"subtitle": item.subtitle,
|
||||
"summary": item.summary,
|
||||
"tone": "",
|
||||
"playerGoal": "",
|
||||
"settingText": "",
|
||||
"themeMode": "mythic",
|
||||
"templateWorldType": "WUXIA",
|
||||
"compatibilityTemplateWorldType": Value::Null,
|
||||
"cover": item.cover_image_src.as_ref().map(|image_src| json!({
|
||||
"sourceType": "generated",
|
||||
"imageSrc": image_src,
|
||||
})),
|
||||
"majorFactions": [],
|
||||
"coreConflicts": [],
|
||||
"playableNpcs": [],
|
||||
"storyNpcs": [],
|
||||
"items": [],
|
||||
"camp": Value::Null,
|
||||
"landmarks": [],
|
||||
"ownedSettingLayers": Value::Null,
|
||||
})
|
||||
}
|
||||
|
||||
fn map_custom_world_gallery_card_response(
|
||||
entry: CustomWorldGalleryEntryRecord,
|
||||
) -> CustomWorldGalleryCardResponse {
|
||||
@@ -2737,6 +2824,7 @@ fn map_custom_world_gallery_card_response(
|
||||
play_count: entry.play_count,
|
||||
remix_count: entry.remix_count,
|
||||
like_count: entry.like_count,
|
||||
recent_play_count_7d: entry.recent_play_count_7d,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3308,7 +3396,7 @@ fn resolve_author_public_user_code(
|
||||
request_context,
|
||||
AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR).with_details(json!({
|
||||
"provider": "custom-world-library",
|
||||
"message": format!("作者叙世号读取失败:{error}"),
|
||||
"message": format!("作者陶泥号读取失败:{error}"),
|
||||
})),
|
||||
)
|
||||
})?
|
||||
@@ -3319,7 +3407,7 @@ fn resolve_author_public_user_code(
|
||||
request_context,
|
||||
AppError::from_status(StatusCode::UNAUTHORIZED).with_details(json!({
|
||||
"provider": "custom-world-library",
|
||||
"message": "当前登录用户缺少叙世号",
|
||||
"message": "当前登录用户缺少陶泥号",
|
||||
})),
|
||||
)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user