1
This commit is contained in:
@@ -3,6 +3,7 @@ use crate::mapper::*;
|
||||
use crate::module_bindings::delete_big_fish_work_procedure::delete_big_fish_work;
|
||||
use crate::module_bindings::record_big_fish_play_procedure::record_big_fish_play;
|
||||
use crate::module_bindings::remix_big_fish_work_procedure::remix_big_fish_work;
|
||||
use module_big_fish::PUBLIC_BIG_FISH_GALLERY_OWNER_USER_ID;
|
||||
|
||||
impl SpacetimeClient {
|
||||
pub async fn create_big_fish_session(
|
||||
@@ -71,7 +72,8 @@ impl SpacetimeClient {
|
||||
&self,
|
||||
) -> Result<Vec<BigFishWorkSummaryRecord>, SpacetimeClientError> {
|
||||
self.list_big_fish_works_with_input(BigFishWorksListInput {
|
||||
owner_user_id: String::new(),
|
||||
// 中文注释:公开广场读取只依赖 published_only,但旧部署模块会先校验 owner_user_id 非空。
|
||||
owner_user_id: PUBLIC_BIG_FISH_GALLERY_OWNER_USER_ID.to_string(),
|
||||
published_only: true,
|
||||
})
|
||||
.await
|
||||
|
||||
@@ -225,14 +225,15 @@ impl SpacetimeClient {
|
||||
};
|
||||
|
||||
self.call_after_connect(move |connection, sender| {
|
||||
connection
|
||||
.procedures()
|
||||
.remix_custom_world_profile_then(procedure_input, move |_, result| {
|
||||
connection.procedures().remix_custom_world_profile_then(
|
||||
procedure_input,
|
||||
move |_, result| {
|
||||
let mapped = result
|
||||
.map_err(|error| SpacetimeClientError::Procedure(error.to_string()))
|
||||
.and_then(map_custom_world_library_mutation_result);
|
||||
send_once(&sender, mapped);
|
||||
});
|
||||
},
|
||||
);
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
@@ -11,18 +11,18 @@ pub use mapper::{
|
||||
BigFishAssetSlotRecord, BigFishBackgroundBlueprintRecord, BigFishDraftCompileRecordInput,
|
||||
BigFishGameDraftRecord, BigFishLevelBlueprintRecord, BigFishMessageFinalizeRecordInput,
|
||||
BigFishMessageSubmitRecordInput, BigFishPlayReportRecordInput, BigFishRuntimeParamsRecord,
|
||||
BigFishSessionCreateRecordInput, BigFishSessionRecord, BigFishWorkSummaryRecord,
|
||||
CustomWorldAgentActionExecuteRecord, CustomWorldAgentActionExecuteRecordInput,
|
||||
CustomWorldAgentCheckpointRecord, CustomWorldAgentMessageFinalizeRecordInput,
|
||||
CustomWorldAgentMessageRecord, CustomWorldAgentMessageSubmitRecordInput,
|
||||
CustomWorldAgentOperationProgressRecordInput, CustomWorldAgentOperationRecord,
|
||||
CustomWorldAgentSessionCreateRecordInput, CustomWorldAgentSessionRecord,
|
||||
CustomWorldCheckpointRecord, CustomWorldDraftCardDetailRecord,
|
||||
BigFishSessionCreateRecordInput, BigFishSessionRecord, BigFishWorkRemixRecordInput,
|
||||
BigFishWorkSummaryRecord, CustomWorldAgentActionExecuteRecord,
|
||||
CustomWorldAgentActionExecuteRecordInput, CustomWorldAgentCheckpointRecord,
|
||||
CustomWorldAgentMessageFinalizeRecordInput, CustomWorldAgentMessageRecord,
|
||||
CustomWorldAgentMessageSubmitRecordInput, CustomWorldAgentOperationProgressRecordInput,
|
||||
CustomWorldAgentOperationRecord, CustomWorldAgentSessionCreateRecordInput,
|
||||
CustomWorldAgentSessionRecord, CustomWorldCheckpointRecord, CustomWorldDraftCardDetailRecord,
|
||||
CustomWorldDraftCardDetailSectionRecord, CustomWorldDraftCardRecord,
|
||||
CustomWorldGalleryEntryRecord, CustomWorldLibraryEntryRecord, CustomWorldLibraryMutationRecord,
|
||||
CustomWorldProfilePlayReportRecordInput, CustomWorldProfileRemixRecordInput,
|
||||
CustomWorldProfileUpsertRecordInput, CustomWorldPublishGateRecord, CustomWorldPublishWorldRecord,
|
||||
CustomWorldPublishWorldRecordInput,
|
||||
CustomWorldProfileUpsertRecordInput, CustomWorldPublishGateRecord,
|
||||
CustomWorldPublishWorldRecord, CustomWorldPublishWorldRecordInput,
|
||||
CustomWorldPublishedProfileCompileRecord, CustomWorldResultPreviewBlockerRecord,
|
||||
CustomWorldSupportedActionRecord, CustomWorldWorkSummaryRecord, NpcBattleInteractionRecord,
|
||||
NpcInteractionRecord, NpcStateRecord, PuzzleAgentMessageFinalizeRecordInput,
|
||||
@@ -34,10 +34,11 @@ pub use mapper::{
|
||||
PuzzleLeaderboardEntryRecord, PuzzleLeaderboardSubmitRecordInput, PuzzleMergedGroupRecord,
|
||||
PuzzlePieceStateRecord, PuzzlePublishRecordInput, PuzzleResultDraftRecord,
|
||||
PuzzleResultPreviewBlockerRecord, PuzzleResultPreviewFindingRecord, PuzzleResultPreviewRecord,
|
||||
PuzzleRunDragRecordInput, PuzzleRunNextLevelRecordInput, PuzzleRunRecord, PuzzleWorkRemixRecordInput,
|
||||
PuzzleRunStartRecordInput, PuzzleRunSwapRecordInput, PuzzleRuntimeLevelRecord,
|
||||
PuzzleSelectCoverImageRecordInput, PuzzleWorkProfileRecord, PuzzleWorkUpsertRecordInput,
|
||||
ResolveCombatActionRecord, ResolveNpcBattleInteractionInput, BigFishWorkRemixRecordInput,
|
||||
PuzzleRunDragRecordInput, PuzzleRunNextLevelRecordInput, PuzzleRunPauseRecordInput,
|
||||
PuzzleRunPropRecordInput, PuzzleRunRecord, PuzzleRunStartRecordInput, PuzzleRunSwapRecordInput,
|
||||
PuzzleRuntimeLevelRecord, PuzzleSelectCoverImageRecordInput, PuzzleWorkProfileRecord,
|
||||
PuzzleWorkRemixRecordInput, PuzzleWorkUpsertRecordInput, ResolveCombatActionRecord,
|
||||
ResolveNpcBattleInteractionInput,
|
||||
};
|
||||
|
||||
pub mod ai;
|
||||
@@ -175,6 +176,7 @@ pub struct SpacetimeClientConfig {
|
||||
pub database: String,
|
||||
pub token: Option<String>,
|
||||
pub pool_size: u32,
|
||||
pub procedure_timeout: Duration,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
@@ -205,7 +207,7 @@ pub enum SpacetimeClientError {
|
||||
Timeout,
|
||||
}
|
||||
|
||||
const CONFIRM_ASSET_OBJECT_TIMEOUT: Duration = Duration::from_secs(10);
|
||||
const DEFAULT_PROCEDURE_TIMEOUT: Duration = Duration::from_secs(30);
|
||||
|
||||
type ProcedureResultSender<T> =
|
||||
Arc<Mutex<Option<oneshot::Sender<Result<T, SpacetimeClientError>>>>>;
|
||||
@@ -236,6 +238,14 @@ struct PooledConnectionLease {
|
||||
impl SpacetimeClient {
|
||||
pub fn new(config: SpacetimeClientConfig) -> Self {
|
||||
let pool_size = config.pool_size.max(1) as usize;
|
||||
let config = SpacetimeClientConfig {
|
||||
procedure_timeout: if config.procedure_timeout.is_zero() {
|
||||
DEFAULT_PROCEDURE_TIMEOUT
|
||||
} else {
|
||||
config.procedure_timeout
|
||||
},
|
||||
..config
|
||||
};
|
||||
let slots = (0..pool_size)
|
||||
.map(|_| {
|
||||
tokio::sync::Mutex::new(PooledConnectionSlot {
|
||||
@@ -264,7 +274,7 @@ impl SpacetimeClient {
|
||||
let lease = self.acquire_connection().await?;
|
||||
let final_result = if let Some(connection) = lease.connection.as_ref() {
|
||||
call(&connection.connection, result_sender.clone());
|
||||
match timeout(CONFIRM_ASSET_OBJECT_TIMEOUT, receiver).await {
|
||||
match timeout(self.config.procedure_timeout, receiver).await {
|
||||
Ok(inner) => match inner {
|
||||
Ok(value) => value,
|
||||
Err(_) => Err(SpacetimeClientError::ConnectDropped),
|
||||
@@ -290,7 +300,7 @@ impl SpacetimeClient {
|
||||
let lease = self.acquire_connection().await?;
|
||||
let final_result = if let Some(connection) = lease.connection.as_ref() {
|
||||
call(&connection.connection, result_sender.clone());
|
||||
match timeout(CONFIRM_ASSET_OBJECT_TIMEOUT, receiver).await {
|
||||
match timeout(self.config.procedure_timeout, receiver).await {
|
||||
Ok(inner) => match inner {
|
||||
Ok(value) => value,
|
||||
Err(_) => Err(SpacetimeClientError::ConnectDropped),
|
||||
@@ -309,7 +319,7 @@ impl SpacetimeClient {
|
||||
|
||||
async fn acquire_connection(&self) -> Result<PooledConnectionLease, SpacetimeClientError> {
|
||||
let permit = timeout(
|
||||
CONFIRM_ASSET_OBJECT_TIMEOUT,
|
||||
self.config.procedure_timeout,
|
||||
self.pool.permits.clone().acquire_owned(),
|
||||
)
|
||||
.await
|
||||
@@ -386,7 +396,7 @@ impl SpacetimeClient {
|
||||
.map_err(|error| SpacetimeClientError::Runtime(error.to_string()))??;
|
||||
|
||||
let runner = connection.run_threaded();
|
||||
timeout(CONFIRM_ASSET_OBJECT_TIMEOUT, receiver)
|
||||
timeout(self.config.procedure_timeout, receiver)
|
||||
.await
|
||||
.map_err(|_| SpacetimeClientError::Timeout)?
|
||||
.map_err(|_| SpacetimeClientError::ConnectDropped)??;
|
||||
|
||||
@@ -1888,6 +1888,7 @@ pub(crate) fn map_custom_world_library_entry_from_profile_snapshot(
|
||||
play_count: snapshot.play_count,
|
||||
remix_count: snapshot.remix_count,
|
||||
like_count: snapshot.like_count,
|
||||
recent_play_count_7d: 0,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1916,6 +1917,7 @@ pub(crate) fn map_custom_world_gallery_entry_snapshot(
|
||||
play_count: snapshot.play_count,
|
||||
remix_count: snapshot.remix_count,
|
||||
like_count: snapshot.like_count,
|
||||
recent_play_count_7d: snapshot.recent_play_count_7d,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -2395,6 +2397,7 @@ pub(crate) fn map_puzzle_work_profile(
|
||||
play_count: snapshot.play_count,
|
||||
remix_count: snapshot.remix_count,
|
||||
like_count: snapshot.like_count,
|
||||
recent_play_count_7d: snapshot.recent_play_count_7d,
|
||||
publish_ready: snapshot.publish_ready,
|
||||
anchor_pack: map_puzzle_anchor_pack(snapshot.anchor_pack),
|
||||
}
|
||||
@@ -2438,6 +2441,13 @@ pub(crate) fn map_puzzle_runtime_level_snapshot(
|
||||
started_at_ms: snapshot.started_at_ms,
|
||||
cleared_at_ms: snapshot.cleared_at_ms,
|
||||
elapsed_ms: snapshot.elapsed_ms,
|
||||
time_limit_ms: snapshot.time_limit_ms,
|
||||
remaining_ms: snapshot.remaining_ms,
|
||||
paused_accumulated_ms: snapshot.paused_accumulated_ms,
|
||||
pause_started_at_ms: snapshot.pause_started_at_ms,
|
||||
freeze_accumulated_ms: snapshot.freeze_accumulated_ms,
|
||||
freeze_started_at_ms: snapshot.freeze_started_at_ms,
|
||||
freeze_until_ms: snapshot.freeze_until_ms,
|
||||
leaderboard_entries: snapshot
|
||||
.leaderboard_entries
|
||||
.into_iter()
|
||||
@@ -3948,6 +3958,7 @@ pub struct CustomWorldLibraryEntryRecord {
|
||||
pub play_count: u32,
|
||||
pub remix_count: u32,
|
||||
pub like_count: u32,
|
||||
pub recent_play_count_7d: u32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
@@ -3970,6 +3981,7 @@ pub struct CustomWorldGalleryEntryRecord {
|
||||
pub play_count: u32,
|
||||
pub remix_count: u32,
|
||||
pub like_count: u32,
|
||||
pub recent_play_count_7d: u32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
@@ -4411,6 +4423,22 @@ pub struct PuzzleRunNextLevelRecordInput {
|
||||
pub advanced_at_micros: i64,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct PuzzleRunPauseRecordInput {
|
||||
pub run_id: String,
|
||||
pub owner_user_id: String,
|
||||
pub paused: bool,
|
||||
pub updated_at_micros: i64,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct PuzzleRunPropRecordInput {
|
||||
pub run_id: String,
|
||||
pub owner_user_id: String,
|
||||
pub prop_kind: String,
|
||||
pub used_at_micros: i64,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct BigFishPlayReportRecordInput {
|
||||
pub session_id: String,
|
||||
@@ -4556,6 +4584,7 @@ pub struct PuzzleWorkProfileRecord {
|
||||
pub play_count: u32,
|
||||
pub remix_count: u32,
|
||||
pub like_count: u32,
|
||||
pub recent_play_count_7d: u32,
|
||||
pub publish_ready: bool,
|
||||
pub anchor_pack: PuzzleAnchorPackRecord,
|
||||
}
|
||||
@@ -4616,6 +4645,13 @@ pub struct PuzzleRuntimeLevelRecord {
|
||||
pub started_at_ms: u64,
|
||||
pub cleared_at_ms: Option<u64>,
|
||||
pub elapsed_ms: Option<u64>,
|
||||
pub time_limit_ms: u64,
|
||||
pub remaining_ms: u64,
|
||||
pub paused_accumulated_ms: u64,
|
||||
pub pause_started_at_ms: Option<u64>,
|
||||
pub freeze_accumulated_ms: u64,
|
||||
pub freeze_started_at_ms: Option<u64>,
|
||||
pub freeze_until_ms: Option<u64>,
|
||||
pub leaderboard_entries: Vec<PuzzleLeaderboardEntryRecord>,
|
||||
}
|
||||
|
||||
@@ -4834,6 +4870,7 @@ pub struct BigFishWorkSummaryRecord {
|
||||
pub play_count: u32,
|
||||
pub remix_count: u32,
|
||||
pub like_count: u32,
|
||||
pub recent_play_count_7d: u32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)]
|
||||
@@ -4861,6 +4898,8 @@ struct CompatibleBigFishWorkSummaryRecord {
|
||||
remix_count: u32,
|
||||
#[serde(default)]
|
||||
like_count: u32,
|
||||
#[serde(default)]
|
||||
recent_play_count_7d: u32,
|
||||
}
|
||||
|
||||
impl CompatibleBigFishWorkSummaryRecord {
|
||||
@@ -4889,6 +4928,7 @@ impl CompatibleBigFishWorkSummaryRecord {
|
||||
play_count: self.play_count,
|
||||
remix_count: self.remix_count,
|
||||
like_count: self.like_count,
|
||||
recent_play_count_7d: self.recent_play_count_7d,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4964,6 +5004,62 @@ mod tests {
|
||||
assert_eq!(items[0].like_count, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn puzzle_run_mapper_backfills_missing_timer_fields() {
|
||||
let result = PuzzleRunProcedureResult {
|
||||
ok: true,
|
||||
run_json: Some(
|
||||
r#"{
|
||||
"run_id":"puzzle-run-1",
|
||||
"entry_profile_id":"puzzle-profile-1",
|
||||
"cleared_level_count":0,
|
||||
"current_level_index":1,
|
||||
"current_grid_size":3,
|
||||
"played_profile_ids":["puzzle-profile-1"],
|
||||
"previous_level_tags":["雨夜","猫咪","神庙"],
|
||||
"current_level":{
|
||||
"run_id":"puzzle-run-1",
|
||||
"level_index":1,
|
||||
"grid_size":3,
|
||||
"profile_id":"puzzle-profile-1",
|
||||
"level_name":"雨夜拼图",
|
||||
"author_display_name":"测试作者",
|
||||
"theme_tags":["雨夜","猫咪","神庙"],
|
||||
"cover_image_src":null,
|
||||
"board":{
|
||||
"rows":3,
|
||||
"cols":3,
|
||||
"pieces":[{
|
||||
"piece_id":"piece-1",
|
||||
"correct_row":0,
|
||||
"correct_col":0,
|
||||
"current_row":0,
|
||||
"current_col":0,
|
||||
"merged_group_id":null
|
||||
}],
|
||||
"merged_groups":[],
|
||||
"selected_piece_id":null
|
||||
},
|
||||
"status":"Playing"
|
||||
},
|
||||
"recommended_next_profile_id":null
|
||||
}"#
|
||||
.to_string(),
|
||||
),
|
||||
error_message: None,
|
||||
};
|
||||
|
||||
let run = map_puzzle_run_procedure_result(result)
|
||||
.expect("旧 puzzle run JSON 缺计时字段时应按默认值兼容");
|
||||
let level = run.current_level.expect("兼容后仍应保留当前关卡");
|
||||
|
||||
assert_eq!(run.run_id, "puzzle-run-1");
|
||||
assert!(level.started_at_ms > 0);
|
||||
assert_eq!(level.time_limit_ms, 0);
|
||||
assert_eq!(level.remaining_ms, 0);
|
||||
assert!(level.leaderboard_entries.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn big_fish_works_mapper_backfills_missing_owner_user_id_for_private_lists() {
|
||||
let result = BigFishWorksProcedureResult {
|
||||
|
||||
@@ -24,6 +24,7 @@ pub struct CustomWorldGalleryEntrySnapshot {
|
||||
pub play_count: u32,
|
||||
pub remix_count: u32,
|
||||
pub like_count: u32,
|
||||
pub recent_play_count_7d: u32,
|
||||
pub published_at_micros: i64,
|
||||
pub updated_at_micros: i64,
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
|
||||
|
||||
use super::database_migration_table_stat_type::DatabaseMigrationTableStat;
|
||||
use super::database_migration_warning_type::DatabaseMigrationWarning;
|
||||
|
||||
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
|
||||
#[sats(crate = __lib)]
|
||||
@@ -13,6 +14,7 @@ pub struct DatabaseMigrationProcedureResult {
|
||||
pub schema_version: u32,
|
||||
pub migration_json: Option<String>,
|
||||
pub table_stats: Vec<DatabaseMigrationTableStat>,
|
||||
pub warnings: Vec<DatabaseMigrationWarning>,
|
||||
pub error_message: Option<String>,
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
|
||||
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
|
||||
|
||||
#![allow(unused, clippy::all)]
|
||||
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
|
||||
|
||||
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
|
||||
#[sats(crate = __lib)]
|
||||
pub struct DatabaseMigrationWarning {
|
||||
pub table_name: String,
|
||||
pub warning_kind: String,
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
impl __sdk::InModule for DatabaseMigrationWarning {
|
||||
type Module = super::RemoteModule;
|
||||
}
|
||||
@@ -195,6 +195,7 @@ pub mod database_migration_operator_type;
|
||||
pub mod database_migration_procedure_result_type;
|
||||
pub mod database_migration_revoke_operator_input_type;
|
||||
pub mod database_migration_table_stat_type;
|
||||
pub mod database_migration_warning_type;
|
||||
pub mod delete_big_fish_work_procedure;
|
||||
pub mod delete_custom_world_agent_session_procedure;
|
||||
pub mod delete_custom_world_profile_and_return_procedure;
|
||||
@@ -312,7 +313,9 @@ pub mod puzzle_publish_input_type;
|
||||
pub mod puzzle_run_drag_input_type;
|
||||
pub mod puzzle_run_get_input_type;
|
||||
pub mod puzzle_run_next_level_input_type;
|
||||
pub mod puzzle_run_pause_input_type;
|
||||
pub mod puzzle_run_procedure_result_type;
|
||||
pub mod puzzle_run_prop_input_type;
|
||||
pub mod puzzle_run_start_input_type;
|
||||
pub mod puzzle_run_swap_input_type;
|
||||
pub mod puzzle_runtime_run_row_type;
|
||||
@@ -483,6 +486,7 @@ pub mod turn_in_quest_reducer;
|
||||
pub mod unequip_inventory_item_input_type;
|
||||
pub mod unpublish_custom_world_profile_and_return_procedure;
|
||||
pub mod unpublish_custom_world_profile_reducer;
|
||||
pub mod update_puzzle_run_pause_procedure;
|
||||
pub mod update_puzzle_work_procedure;
|
||||
pub mod upsert_auth_store_snapshot_procedure;
|
||||
pub mod upsert_chapter_progression_and_return_procedure;
|
||||
@@ -495,6 +499,7 @@ pub mod upsert_npc_state_reducer;
|
||||
pub mod upsert_platform_browse_history_and_return_procedure;
|
||||
pub mod upsert_runtime_setting_and_return_procedure;
|
||||
pub mod upsert_runtime_snapshot_and_return_procedure;
|
||||
pub mod use_puzzle_runtime_prop_procedure;
|
||||
pub mod user_account_type;
|
||||
pub mod user_browse_history_type;
|
||||
|
||||
@@ -687,6 +692,7 @@ pub use database_migration_operator_type::DatabaseMigrationOperator;
|
||||
pub use database_migration_procedure_result_type::DatabaseMigrationProcedureResult;
|
||||
pub use database_migration_revoke_operator_input_type::DatabaseMigrationRevokeOperatorInput;
|
||||
pub use database_migration_table_stat_type::DatabaseMigrationTableStat;
|
||||
pub use database_migration_warning_type::DatabaseMigrationWarning;
|
||||
pub use delete_big_fish_work_procedure::delete_big_fish_work;
|
||||
pub use delete_custom_world_agent_session_procedure::delete_custom_world_agent_session;
|
||||
pub use delete_custom_world_profile_and_return_procedure::delete_custom_world_profile_and_return;
|
||||
@@ -804,7 +810,9 @@ pub use puzzle_publish_input_type::PuzzlePublishInput;
|
||||
pub use puzzle_run_drag_input_type::PuzzleRunDragInput;
|
||||
pub use puzzle_run_get_input_type::PuzzleRunGetInput;
|
||||
pub use puzzle_run_next_level_input_type::PuzzleRunNextLevelInput;
|
||||
pub use puzzle_run_pause_input_type::PuzzleRunPauseInput;
|
||||
pub use puzzle_run_procedure_result_type::PuzzleRunProcedureResult;
|
||||
pub use puzzle_run_prop_input_type::PuzzleRunPropInput;
|
||||
pub use puzzle_run_start_input_type::PuzzleRunStartInput;
|
||||
pub use puzzle_run_swap_input_type::PuzzleRunSwapInput;
|
||||
pub use puzzle_runtime_run_row_type::PuzzleRuntimeRunRow;
|
||||
@@ -975,6 +983,7 @@ pub use turn_in_quest_reducer::turn_in_quest;
|
||||
pub use unequip_inventory_item_input_type::UnequipInventoryItemInput;
|
||||
pub use unpublish_custom_world_profile_and_return_procedure::unpublish_custom_world_profile_and_return;
|
||||
pub use unpublish_custom_world_profile_reducer::unpublish_custom_world_profile;
|
||||
pub use update_puzzle_run_pause_procedure::update_puzzle_run_pause;
|
||||
pub use update_puzzle_work_procedure::update_puzzle_work;
|
||||
pub use upsert_auth_store_snapshot_procedure::upsert_auth_store_snapshot;
|
||||
pub use upsert_chapter_progression_and_return_procedure::upsert_chapter_progression_and_return;
|
||||
@@ -987,6 +996,7 @@ pub use upsert_npc_state_reducer::upsert_npc_state;
|
||||
pub use upsert_platform_browse_history_and_return_procedure::upsert_platform_browse_history_and_return;
|
||||
pub use upsert_runtime_setting_and_return_procedure::upsert_runtime_setting_and_return;
|
||||
pub use upsert_runtime_snapshot_and_return_procedure::upsert_runtime_snapshot_and_return;
|
||||
pub use use_puzzle_runtime_prop_procedure::use_puzzle_runtime_prop;
|
||||
pub use user_account_type::UserAccount;
|
||||
pub use user_browse_history_type::UserBrowseHistory;
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
|
||||
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
|
||||
|
||||
#![allow(unused, clippy::all)]
|
||||
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
|
||||
|
||||
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
|
||||
#[sats(crate = __lib)]
|
||||
pub struct PuzzleRunPauseInput {
|
||||
pub run_id: String,
|
||||
pub owner_user_id: String,
|
||||
pub paused: bool,
|
||||
pub updated_at_micros: i64,
|
||||
}
|
||||
|
||||
impl __sdk::InModule for PuzzleRunPauseInput {
|
||||
type Module = super::RemoteModule;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
|
||||
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
|
||||
|
||||
#![allow(unused, clippy::all)]
|
||||
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
|
||||
|
||||
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
|
||||
#[sats(crate = __lib)]
|
||||
pub struct PuzzleRunPropInput {
|
||||
pub run_id: String,
|
||||
pub owner_user_id: String,
|
||||
pub prop_kind: String,
|
||||
pub used_at_micros: i64,
|
||||
}
|
||||
|
||||
impl __sdk::InModule for PuzzleRunPropInput {
|
||||
type Module = super::RemoteModule;
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
|
||||
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
|
||||
|
||||
#![allow(unused, clippy::all)]
|
||||
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
|
||||
|
||||
use super::puzzle_run_pause_input_type::PuzzleRunPauseInput;
|
||||
use super::puzzle_run_procedure_result_type::PuzzleRunProcedureResult;
|
||||
|
||||
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
|
||||
#[sats(crate = __lib)]
|
||||
struct UpdatePuzzleRunPauseArgs {
|
||||
pub input: PuzzleRunPauseInput,
|
||||
}
|
||||
|
||||
impl __sdk::InModule for UpdatePuzzleRunPauseArgs {
|
||||
type Module = super::RemoteModule;
|
||||
}
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
/// Extension trait for access to the procedure `update_puzzle_run_pause`.
|
||||
///
|
||||
/// Implemented for [`super::RemoteProcedures`].
|
||||
pub trait update_puzzle_run_pause {
|
||||
fn update_puzzle_run_pause(&self, input: PuzzleRunPauseInput) {
|
||||
self.update_puzzle_run_pause_then(input, |_, _| {});
|
||||
}
|
||||
|
||||
fn update_puzzle_run_pause_then(
|
||||
&self,
|
||||
input: PuzzleRunPauseInput,
|
||||
|
||||
__callback: impl FnOnce(
|
||||
&super::ProcedureEventContext,
|
||||
Result<PuzzleRunProcedureResult, __sdk::InternalError>,
|
||||
) + Send
|
||||
+ 'static,
|
||||
);
|
||||
}
|
||||
|
||||
impl update_puzzle_run_pause for super::RemoteProcedures {
|
||||
fn update_puzzle_run_pause_then(
|
||||
&self,
|
||||
input: PuzzleRunPauseInput,
|
||||
|
||||
__callback: impl FnOnce(
|
||||
&super::ProcedureEventContext,
|
||||
Result<PuzzleRunProcedureResult, __sdk::InternalError>,
|
||||
) + Send
|
||||
+ 'static,
|
||||
) {
|
||||
self.imp
|
||||
.invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>(
|
||||
"update_puzzle_run_pause",
|
||||
UpdatePuzzleRunPauseArgs { input },
|
||||
__callback,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
|
||||
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
|
||||
|
||||
#![allow(unused, clippy::all)]
|
||||
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
|
||||
|
||||
use super::puzzle_run_procedure_result_type::PuzzleRunProcedureResult;
|
||||
use super::puzzle_run_prop_input_type::PuzzleRunPropInput;
|
||||
|
||||
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
|
||||
#[sats(crate = __lib)]
|
||||
struct UsePuzzleRuntimePropArgs {
|
||||
pub input: PuzzleRunPropInput,
|
||||
}
|
||||
|
||||
impl __sdk::InModule for UsePuzzleRuntimePropArgs {
|
||||
type Module = super::RemoteModule;
|
||||
}
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
/// Extension trait for access to the procedure `use_puzzle_runtime_prop`.
|
||||
///
|
||||
/// Implemented for [`super::RemoteProcedures`].
|
||||
pub trait use_puzzle_runtime_prop {
|
||||
fn use_puzzle_runtime_prop(&self, input: PuzzleRunPropInput) {
|
||||
self.use_puzzle_runtime_prop_then(input, |_, _| {});
|
||||
}
|
||||
|
||||
fn use_puzzle_runtime_prop_then(
|
||||
&self,
|
||||
input: PuzzleRunPropInput,
|
||||
|
||||
__callback: impl FnOnce(
|
||||
&super::ProcedureEventContext,
|
||||
Result<PuzzleRunProcedureResult, __sdk::InternalError>,
|
||||
) + Send
|
||||
+ 'static,
|
||||
);
|
||||
}
|
||||
|
||||
impl use_puzzle_runtime_prop for super::RemoteProcedures {
|
||||
fn use_puzzle_runtime_prop_then(
|
||||
&self,
|
||||
input: PuzzleRunPropInput,
|
||||
|
||||
__callback: impl FnOnce(
|
||||
&super::ProcedureEventContext,
|
||||
Result<PuzzleRunProcedureResult, __sdk::InternalError>,
|
||||
) + Send
|
||||
+ 'static,
|
||||
) {
|
||||
self.imp
|
||||
.invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>(
|
||||
"use_puzzle_runtime_prop",
|
||||
UsePuzzleRuntimePropArgs { input },
|
||||
__callback,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ pub struct UserAccount {
|
||||
pub public_user_code: String,
|
||||
pub username: String,
|
||||
pub display_name: String,
|
||||
pub avatar_url: Option<String>,
|
||||
pub phone_number_masked: Option<String>,
|
||||
pub phone_number_e_164: Option<String>,
|
||||
pub login_method: String,
|
||||
@@ -33,6 +34,7 @@ pub struct UserAccountCols {
|
||||
pub public_user_code: __sdk::__query_builder::Col<UserAccount, String>,
|
||||
pub username: __sdk::__query_builder::Col<UserAccount, String>,
|
||||
pub display_name: __sdk::__query_builder::Col<UserAccount, String>,
|
||||
pub avatar_url: __sdk::__query_builder::Col<UserAccount, Option<String>>,
|
||||
pub phone_number_masked: __sdk::__query_builder::Col<UserAccount, Option<String>>,
|
||||
pub phone_number_e_164: __sdk::__query_builder::Col<UserAccount, Option<String>>,
|
||||
pub login_method: __sdk::__query_builder::Col<UserAccount, String>,
|
||||
@@ -51,6 +53,7 @@ impl __sdk::__query_builder::HasCols for UserAccount {
|
||||
public_user_code: __sdk::__query_builder::Col::new(table_name, "public_user_code"),
|
||||
username: __sdk::__query_builder::Col::new(table_name, "username"),
|
||||
display_name: __sdk::__query_builder::Col::new(table_name, "display_name"),
|
||||
avatar_url: __sdk::__query_builder::Col::new(table_name, "avatar_url"),
|
||||
phone_number_masked: __sdk::__query_builder::Col::new(
|
||||
table_name,
|
||||
"phone_number_masked",
|
||||
|
||||
@@ -492,6 +492,56 @@ impl SpacetimeClient {
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn update_puzzle_run_pause(
|
||||
&self,
|
||||
input: PuzzleRunPauseRecordInput,
|
||||
) -> Result<PuzzleRunRecord, SpacetimeClientError> {
|
||||
let procedure_input = PuzzleRunPauseInput {
|
||||
run_id: input.run_id,
|
||||
owner_user_id: input.owner_user_id,
|
||||
paused: input.paused,
|
||||
updated_at_micros: input.updated_at_micros,
|
||||
};
|
||||
|
||||
self.call_after_connect(move |connection, sender| {
|
||||
connection.procedures().update_puzzle_run_pause_then(
|
||||
procedure_input,
|
||||
move |_, result| {
|
||||
let mapped = result
|
||||
.map_err(|error| SpacetimeClientError::Procedure(error.to_string()))
|
||||
.and_then(map_puzzle_run_procedure_result);
|
||||
send_once(&sender, mapped);
|
||||
},
|
||||
);
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn use_puzzle_runtime_prop(
|
||||
&self,
|
||||
input: PuzzleRunPropRecordInput,
|
||||
) -> Result<PuzzleRunRecord, SpacetimeClientError> {
|
||||
let procedure_input = PuzzleRunPropInput {
|
||||
run_id: input.run_id,
|
||||
owner_user_id: input.owner_user_id,
|
||||
prop_kind: input.prop_kind,
|
||||
used_at_micros: input.used_at_micros,
|
||||
};
|
||||
|
||||
self.call_after_connect(move |connection, sender| {
|
||||
connection.procedures().use_puzzle_runtime_prop_then(
|
||||
procedure_input,
|
||||
move |_, result| {
|
||||
let mapped = result
|
||||
.map_err(|error| SpacetimeClientError::Procedure(error.to_string()))
|
||||
.and_then(map_puzzle_run_procedure_result);
|
||||
send_once(&sender, mapped);
|
||||
},
|
||||
);
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn submit_puzzle_leaderboard_entry(
|
||||
&self,
|
||||
input: PuzzleLeaderboardSubmitRecordInput,
|
||||
|
||||
Reference in New Issue
Block a user