This commit is contained in:
2026-04-29 20:56:59 +08:00
parent fb6f455530
commit 730f485f48
200 changed files with 9881 additions and 2221 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)??;

View File

@@ -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 {

View File

@@ -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,
}

View File

@@ -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>,
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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,
);
}
}

View File

@@ -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,
);
}
}

View File

@@ -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",

View File

@@ -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,