diff --git a/.codex/skills/genarrative-gameplay-entry-type/agents/openai.yaml b/.codex/skills/genarrative-gameplay-entry-type/agents/openai.yaml deleted file mode 100644 index 1fb1aa12..00000000 --- a/.codex/skills/genarrative-gameplay-entry-type/agents/openai.yaml +++ /dev/null @@ -1,4 +0,0 @@ -interface: - display_name: "新增玩法入口" - short_description: "把新增玩法入口的文档、配置、路由和验证流程一次收口" - default_prompt: "Use $genarrative-gameplay-entry-type to add a new gameplay entry type end to end in Genarrative." diff --git a/docs/README.md b/docs/README.md index cb2263f9..e0c3eb78 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,12 +13,14 @@ 重点补充:RPG 创作与运行时脚本职责地图见 [RPG_CREATION_AND_RUNTIME_SCRIPT_RESPONSIBILITY_MAP_2026-04-28.md](./reference/RPG_CREATION_AND_RUNTIME_SCRIPT_RESPONSIBILITY_MAP_2026-04-28.md)。 - [埋点查询](./tracking/README.md):埋点原始事件与聚合投影的本地 SQL 查询。 - [运营查询](./operations/README.md):任务、领奖、钱包对账等后台核查查询。 -- [PRD](./prd):产品需求与阶段计划;后台管理独立前端工程见 [ADMIN_WEB_CONSOLE_PRD_2026-04-30.md](./prd/ADMIN_WEB_CONSOLE_PRD_2026-04-30.md),新增 RPG 开场动画方案见 [AI_NATIVE_RPG_OPENING_ANIMATION_PRD_2026-04-25.md](./prd/AI_NATIVE_RPG_OPENING_ANIMATION_PRD_2026-04-25.md),新增抓大鹅 Match3D 玩法方案见 [AI_NATIVE_MATCH3D_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-04-30.md](./prd/AI_NATIVE_MATCH3D_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-04-30.md)。 +- [PRD](./prd):产品需求与阶段计划;后台管理独立前端工程见 [ADMIN_WEB_CONSOLE_PRD_2026-04-30.md](./prd/ADMIN_WEB_CONSOLE_PRD_2026-04-30.md),新增 RPG 开场动画方案见 [AI_NATIVE_RPG_OPENING_ANIMATION_PRD_2026-04-25.md](./prd/AI_NATIVE_RPG_OPENING_ANIMATION_PRD_2026-04-25.md),新增抓大鹅 Match3D 玩法方案见 [AI_NATIVE_MATCH3D_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-04-30.md](./prd/AI_NATIVE_MATCH3D_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-04-30.md),方洞挑战创作、发布与试玩闭环见 [AI_NATIVE_SQUARE_HOLE_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-05-04.md](./prd/AI_NATIVE_SQUARE_HOLE_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-05-04.md)。 生产部署切换到 systemd + Nginx + SpacetimeDB 自托管的总方案见 [PRODUCTION_DEPLOYMENT_PLAN_2026-05-02.md](./technical/PRODUCTION_DEPLOYMENT_PLAN_2026-05-02.md),该文档也是当前生产 Jenkinsfile 的唯一入口。SpacetimeDB 表结构变更、自动迁移边界和保留旧数据的分阶段迁移流程见 [SPACETIMEDB_SCHEMA_CHANGE_CONSTRAINTS.md](./technical/SPACETIMEDB_SCHEMA_CHANGE_CONSTRAINTS.md);private 表迁移 JSON 导入导出、HTTP 413 分片导入和旧数据库迁移流水线经验见 [SPACETIMEDB_JSON_STRING_MIGRATION_PROCEDURE_2026-04-27.md](./technical/SPACETIMEDB_JSON_STRING_MIGRATION_PROCEDURE_2026-04-27.md) 与 [JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md](./technical/JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md);后台管理独立前端工程技术方案见 [ADMIN_WEB_CONSOLE_TECHNICAL_SOLUTION_2026-04-30.md](./technical/ADMIN_WEB_CONSOLE_TECHNICAL_SOLUTION_2026-04-30.md)。 SpacetimeDB 表结构变更、自动迁移边界和保留旧数据的分阶段迁移流程见 [SPACETIMEDB_SCHEMA_CHANGE_CONSTRAINTS.md](./technical/SPACETIMEDB_SCHEMA_CHANGE_CONSTRAINTS.md)。 +创作 Agent 问答流式失败时保留已显示回复、并透出更具体上游错误的契约见 [CREATION_AGENT_STREAM_FAILURE_RETENTION_FIX_2026-05-05.md](./technical/CREATION_AGENT_STREAM_FAILURE_RETENTION_FIX_2026-05-05.md)。 + ## 推荐阅读顺序 1. 先看 [经验沉淀](./experience/README.md),快速建立这个项目的开发共识。 diff --git a/docs/prd/AI_NATIVE_SQUARE_HOLE_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-05-04.md b/docs/prd/AI_NATIVE_SQUARE_HOLE_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-05-04.md new file mode 100644 index 00000000..8fd06305 --- /dev/null +++ b/docs/prd/AI_NATIVE_SQUARE_HOLE_CREATOR_AND_GAMEPLAY_SYSTEM_PRD_2026-05-04.md @@ -0,0 +1,278 @@ +# AI 原生方洞挑战玩法创作工具与玩法系统 PRD + +更新时间:`2026-05-04` + +## 0. 文档目的 + +这份 PRD 用于在当前平台内新增一条“方洞挑战”玩法类型,并先冻结它从入口占位到完整可创建闭环的产品边界。 + +本玩法来自参考视频中的核心反差:玩家看到不同形状的积木与多个洞口,会本能判断“形状应放入对应洞口”,但演示不断把不同形状都放进同一个方洞,形成“规则预期被打破”的喜剧张力。 + +本次不是简单复制视频内容,也不是只新增一个前端小游戏。正式版本需要把这种反直觉机制抽象成平台内可创作、可试玩、可发布的玩法类型。 + +--- + +## 1. 一句话定义 + +“方洞挑战”是一个反直觉形状分拣玩法:百梦主通过 Agent 设定形状主题、洞口规则、误导节奏和反差演出,系统生成一个移动端优先的单局挑战;玩家在限时内把连续出现的形状投入正确洞口,后端根据当前关卡的真实兼容规则裁决成功、失败和连击。 + +--- + +## 2. 当前接入级别 + +根据 `genarrative-play-type-integration` 的接入分级,本次落地到 **完整玩法闭环**: + +1. 新增玩法 ID:`square-hole`。 +2. 新增展示名称:`方洞挑战`。 +3. 新增子标题:`反直觉形状分拣`。 +4. 在新建作品入口、创作类型弹层、结果页、运行态和作品架展示。 +5. 支持 Agent 创作、草稿生成、结果页编辑、试玩、发布和公开运行。 +6. 后端以 `server-rs + Axum + SpacetimeDB` 为真相源,前端只渲染快照与交互。 + +不允许把运行规则临时写成前端本地真相,也不复用 `server-node`、Express 或 PostgreSQL。 + +--- + +## 3. 产品定位 + +## 3.1 模板名称 + +1. 对外模板名称:`方洞挑战`。 +2. 对外子标题:`反直觉形状分拣`。 +3. 开发代号:`SquareHole`。 +4. 工程玩法域:`square-hole`。 +5. 后端模块命名预期:`square_hole`。 + +## 3.2 核心乐趣 + +1. 玩家先根据形状轮廓做直觉判断。 +2. 关卡通过洞口、提示、视觉遮挡和演出制造误导。 +3. 真实规则可以是“方洞万能”“指定洞口万能”“颜色优先于形状”“本轮只看尺寸”等反直觉规则。 +4. 玩家通过连续试探和反馈理解规则,形成短局重复挑战。 + +## 3.3 与现有玩法的区别 + +1. 不等同于拼图:不切图、不交换、不合并拼块。 +2. 不等同于抓大鹅:不做三消备选栏,不做堆叠遮挡点击。 +3. 不等同于大鱼吃小鱼:不做摇杆移动、吞噬、成长等级。 +4. 不复用 RPG 的世界、角色、章节或剧情推进结构。 +5. 运行态只保留“当前形状 + 洞口选择 + 后端裁决”,不在前端写正式规则真相。 + +--- + +## 4. 完整闭环目标 + +本次完整闭环必须补齐: + +1. 平台创作入口选择“方洞挑战”。 +2. Agent 对话收集玩法锚点。 +3. 生成方洞挑战草稿。 +4. 进入结果页编辑作品名、标签、封面、形状数量、反差规则和视觉主题。 +5. 支持发布前试玩。 +6. 发布作品。 +7. 玩家从作品详情或广场进入运行态。 +8. 后端初始化单局形状队列、洞口兼容规则和计分状态。 +9. 玩家拖拽或点击形状投入洞口。 +10. 后端裁决投入结果、连击、扣时、失败、胜利和成绩。 +11. 前端只渲染后端快照与即时反馈,不承接正式规则真相。 + +--- + +## 5. 创作锚点设计 + +Agent 型创作版本至少收集下面 5 个锚点: + +| 锚点 | 字段建议 | 用途 | +| --- | --- | --- | +| 主题外观 | `themePrompt` | 决定玩具、洞板、背景、形状材质和色彩风格。 | +| 反差规则 | `twistRule` | 决定“为什么不是按形状匹配”的真实判定规则。 | +| 洞口组 | `holeSet` | 决定本局出现的洞口种类、数量、位置和视觉误导强度。 | +| 形状队列 | `shapeSequence` | 决定连续出现的形状、颜色、大小和难度递增。 | +| 反馈节奏 | `feedbackRhythm` | 决定成功、错误、连击、惊讶和结算演出风格。 | + +Agent 需要把玩家一句灵感收束为上述锚点,不允许逐项盘问低价值字段。 + +## 5.1 Agent AI 生成契约 + +方洞挑战的创作对话必须接入 `api-server` 的现有 LLM 能力,不能把用户输入解析成固定模板后直接写回会话。工程实现以 `state.llm_client()` 为唯一模型入口,通过方洞专属 Agent turn 生成回复与下一轮配置。 + +单轮模型输出必须是严格 JSON: + +```json +{ + "replyText": "", + "progressPercent": 0, + "nextConfig": { + "themeText": "", + "twistRule": "", + "shapeCount": 12, + "difficulty": 4 + } +} +``` + +落地约束: + +1. `replyText` 是直接展示给百梦主的中文回复,不得出现 JSON、字段名、内部结构等说明。 +2. `nextConfig` 必须是完整配置,不允许只输出 patch;缺失字段只能由后端用当前会话配置兜底。 +3. `shapeCount` 由后端限制在 `6` 到 `24`,`difficulty` 限制在 `1` 到 `10`。 +4. `quickFillRequested=true` 时,模型应直接补齐剩余配置,后端把 `progressPercent` 固定为 `100`。 +5. 模型不可用或结果无法解析时,接口返回明确错误,不允许用确定性模板伪装成 AI 回复。 +6. 非流式消息接口和 SSE 流式消息接口都必须走同一套方洞 Agent turn,SSE 只额外负责把 `replyText` 增量回传。 + +--- + +## 6. 运行规则设计 + +## 6.1 单局结构 + +1. 单局默认 `60` 秒。 +2. 每局默认 `12` 个形状。 +3. 洞口数量默认 `4` 到 `6` 个。 +4. 玩家每次只能操作当前形状。 +5. 正确投入后进入下一个形状。 +6. 错误投入扣除时间或清空连击。 +7. 全部形状完成即胜利。 +8. 时间归零即失败。 + +## 6.2 真实兼容规则 + +首版可支持下面几类规则: + +1. `shape_match`:形状轮廓匹配。 +2. `square_hole_priority`:方洞兼容所有形状,其他洞口只作为误导。 +3. `color_match`:颜色优先于形状。 +4. `size_match`:尺寸优先于形状。 +5. `round_prompt`:本轮按后端给出的短提示规则判定。 + +其中 `square_hole_priority` 是参考视频核心反差的首选默认规则。 + +## 6.3 前端表现 + +1. 竖屏优先,桌面端居中显示游戏台。 +2. 当前形状位于屏幕下半区域,洞板位于上半区域。 +3. 只显示必要状态:剩余时间、连击、当前进度。 +4. 不默认展示长篇规则说明。 +5. 错误反馈用短促动画、颜色闪烁和轻量文字状态,不堆解释。 +6. 点击按钮弹出的配置或结算必须使用独立面板,不在当前面板下方展开。 + +--- + +## 7. 后端分层边界 + +完整实现时必须遵循当前 `server-rs + Axum + SpacetimeDB` 路线: + +1. `server-rs/crates/module-square-hole` + - 纯领域规则、形状队列生成、兼容性裁决、分数计算。 + - 不依赖 Axum、SpacetimeDB、OSS 或 LLM。 +2. `server-rs/crates/shared-contracts` + - 暴露 Agent、作品、运行态 DTO。 +3. `server-rs/crates/spacetime-module` + - 存储 session、message、work profile、runtime run。 + - 表结构变化必须同步 `migration.rs` 与表目录。 +4. `server-rs/crates/spacetime-client` + - 提供 api-server 调用 SpacetimeDB 的 typed facade。 +5. `server-rs/crates/api-server` + - 暴露 `/api/creation/square-hole/*` 与 `/api/runtime/square-hole/*`。 + - 处理鉴权、错误 envelope、LLM turn 和 HTTP facade。 + +--- + +## 8. 数据模型 + +## 8.1 创作 session + +1. `sessionId` +2. `ownerUserId` +3. `currentTurn` +4. `progressPercent` +5. `stage` +6. `config` +7. `draft` +8. `messages` +9. `lastAssistantReply` +10. `publishedProfileId` + +## 8.2 结果页 work profile + +1. `workId` +2. `profileId` +3. `ownerUserId` +4. `sourceSessionId` +5. `gameName` +6. `themeText` +7. `twistRule` +8. `summary` +9. `tags` +10. `coverImageSrc` +11. `shapeCount` +12. `difficulty` +13. `publicationStatus` +14. `playCount` +15. `updatedAt` +16. `publishedAt` + +## 8.3 运行态 run snapshot + +1. `runId` +2. `profileId` +3. `ownerUserId` +4. `status` +5. `snapshotVersion` +6. `startedAtMs` +7. `durationLimitMs` +8. `remainingMs` +9. `totalShapeCount` +10. `completedShapeCount` +11. `combo` +12. `bestCombo` +13. `score` +14. `ruleLabel` +15. `currentShape` +16. `holes` +17. `lastFeedback` + +--- + +## 9. API 设计 + +## 9.1 创作接口 + +1. `POST /api/creation/square-hole/sessions` +2. `GET /api/creation/square-hole/sessions/{sessionId}` +3. `POST /api/creation/square-hole/sessions/{sessionId}/messages` +4. `POST /api/creation/square-hole/sessions/{sessionId}/messages/stream` +5. `POST /api/creation/square-hole/sessions/{sessionId}/actions` +6. `POST /api/creation/square-hole/sessions/{sessionId}/compile` +7. `GET /api/creation/square-hole/works` +8. `GET /api/creation/square-hole/works/{profileId}` +9. `PUT /api/creation/square-hole/works/{profileId}` +10. `POST /api/creation/square-hole/works/{profileId}/publish` +11. `DELETE /api/creation/square-hole/works/{profileId}` + +## 9.2 运行接口 + +1. `GET /api/runtime/square-hole/gallery` +2. `GET /api/runtime/square-hole/gallery/{profileId}` +3. `POST /api/runtime/square-hole/works/{profileId}/runs` +4. `GET /api/runtime/square-hole/runs/{runId}` +5. `POST /api/runtime/square-hole/runs/{runId}/drop` +6. `POST /api/runtime/square-hole/runs/{runId}/stop` +7. `POST /api/runtime/square-hole/runs/{runId}/restart` +8. `POST /api/runtime/square-hole/runs/{runId}/time-up` + +--- + +## 10. 验收标准 + +1. `src/config/newWorkEntryConfig.ts` 中存在 `square-hole` 类型且开放创建。 +2. 新建作品入口和创作类型弹层能展示“方洞挑战”。 +3. 能进入 `square-hole` Agent 工作台。 +4. 能生成草稿并进入结果页。 +5. 能编辑结果页并保存、发布。 +6. 能从作品详情或广场进入运行态。 +7. 能点击或拖拽当前形状投入洞口。 +8. 后端裁决命中规则、连击、失败和胜利。 +9. 刷新后可恢复作品与运行态快照。 +10. `docs/technical/NEW_WORK_ENTRY_CONFIG_2026-05-01.md` 记录该入口开放状态。 +11. 后端改动完成后必须执行 `npm run api-server:maincloud`,以 `GET /healthz` 返回 `200` 作为主云配置启动 smoke 通过标准,并在 smoke 后清理本次启动进程。 diff --git a/docs/technical/CREATION_AGENT_STREAM_FAILURE_RETENTION_FIX_2026-05-05.md b/docs/technical/CREATION_AGENT_STREAM_FAILURE_RETENTION_FIX_2026-05-05.md new file mode 100644 index 00000000..61e93408 --- /dev/null +++ b/docs/technical/CREATION_AGENT_STREAM_FAILURE_RETENTION_FIX_2026-05-05.md @@ -0,0 +1,53 @@ +# 创作 Agent 流式失败保留可见回复修复 2026-05-05 + +## 1. 问题 + +方洞挑战等轻量玩法复用 `usePlatformCreationAgentFlowController` 与 `creationAgentSse.ts` 消费 `reply_delta / session / error`。当上游 LLM 已经返回部分 `replyText`,但后续因为超时、上游断流、SSE 解析或最终 JSON 解析失败而发送 `error` 事件时,前端会在 `finally` 里退出流式态。 + +旧 UI 只在 `isStreamingReply=true` 时展示临时 assistant 气泡,因此用户会先看到一段回答,然后回答突然消失,只剩错误提示。 + +## 2. 目标 + +1. 已经展示给用户的流式回复不能因为最终失败从聊天区消失。 +2. SSE `error` 仍然终止本轮提交,并保留错误提示。 +3. 后端错误不能只压成 `上游服务请求失败`,应优先把 LLM 流错误原因放到业务 `message`。 +4. 不修改 SpacetimeDB schema、消息表结构或玩法运行规则。 + +## 3. 前端契约 + +`readCreationAgentSessionFromSse()` 在收到 `reply_delta` 后再收到 `error` 时,必须先触发 `onUpdate(text)`,再抛出错误。调用方可以从最近一次可见文本中恢复 UI。 + +`usePlatformCreationAgentFlowController.submitMessage()` 的失败收尾规则: + +1. 提交时仍先追加 optimistic user message。 +2. 每次 `onUpdate` 同步更新 `streamingReplyText` 与最近可见回复引用。 +3. 如果 `streamMessage()` 抛错且最近可见回复非空,把该文本追加为本地 assistant `warning` 消息。 +4. 再设置 `error`,最后关闭 `isStreamingReply`。 +5. 成功拿到最终 session 时,以后端 session snapshot 为准,并清空最近可见回复。 + +这条本地 `warning` 消息只用于失败态 UI 保留,不代表该 assistant 消息已经写入 SpacetimeDB。 + +## 4. 后端契约 + +`creation_agent_llm_turn` 在 `LlmClient::stream_text()` 失败时,返回: + +```text +<玩法 generation_failed 文案>: +``` + +同时写 `warn` 日志,便于结合 `logs/llm-raw` 定位上游原始输入输出。 + +方洞挑战 SSE 错误提取优先级: + +1. `error.details.message` +2. `error.message` +3. 其它嵌套 JSON message +4. 原始 body 文本 +5. 状态码兜底 + +## 5. 验收 + +1. `reply_delta` 后收到 `error` 时,测试应断言 `onUpdate` 已经收到可见文本。 +2. 控制器测试应断言失败后本地消息列表包含 user 消息和 assistant warning 消息。 +3. `cargo check -p api-server` 通过。 +4. `npm run typecheck` 与编码检查通过。 diff --git a/docs/technical/NEW_WORK_ENTRY_CONFIG_2026-05-01.md b/docs/technical/NEW_WORK_ENTRY_CONFIG_2026-05-01.md index 4847ac0d..8f889204 100644 --- a/docs/technical/NEW_WORK_ENTRY_CONFIG_2026-05-01.md +++ b/docs/technical/NEW_WORK_ENTRY_CONFIG_2026-05-01.md @@ -22,6 +22,7 @@ | 大鱼吃小鱼 | 否 | 是 | 功能仍保留,不在新建作品入口展示 | | 拼图 | 是 | 是 | 点击后进入拼图 Agent 共创工作台 | | 抓大鹅 | 是 | 是 | 点击后进入抓大鹅 Agent 共创工作台 | +| 方洞挑战 | 是 | 是 | 点击后进入方洞挑战 Agent 共创工作台,支持草稿、结果页、发布、试玩、作品架与广场 | | AIRP | 是 | 否 | 保留入口,显示敬请期待 | | 视觉小说 | 是 | 否 | 保留入口,显示敬请期待 | @@ -31,3 +32,4 @@ 2. 隐藏玩法不触发入口预加载,也不出现在新建作品入口中。 3. 未开放玩法点击态保持禁用,不应进入鉴权或创建会话链路。 4. 已开放玩法点击后必须进入对应创建链路;若用户未登录,先走登录保护。 +5. 方洞挑战作品发布后应生成 `SH-` 作品号,并能从作品架、广场详情和试玩 runtime 回到同一作品详情。 diff --git a/docs/technical/SPACETIMEDB_TABLE_CATALOG.md b/docs/technical/SPACETIMEDB_TABLE_CATALOG.md index 2541a58a..b2fd99a0 100644 --- a/docs/technical/SPACETIMEDB_TABLE_CATALOG.md +++ b/docs/technical/SPACETIMEDB_TABLE_CATALOG.md @@ -29,6 +29,7 @@ spacetime sql "SELECT * FROM custom_world_gallery_entry" | 世界创作 | `custom_world_profile`, `custom_world_session`, `custom_world_agent_session`, `custom_world_agent_message`, `custom_world_agent_operation`, `custom_world_draft_card`, `custom_world_gallery_entry` | | 拼图 | `puzzle_agent_session`, `puzzle_agent_message`, `puzzle_work_profile`, `puzzle_event`, `puzzle_runtime_run`, `puzzle_leaderboard_entry` | | 抓大鹅 Match3D | `match3d_agent_session`, `match3d_agent_message`, `match3d_work_profile`, `match3d_runtime_run` | +| 方洞挑战 | `square_hole_agent_session`, `square_hole_agent_message`, `square_hole_work_profile`, `square_hole_runtime_run` | | 大鱼吃小鱼 | `big_fish_creation_session`, `big_fish_agent_message`, `big_fish_asset_slot`, `big_fish_event`, `big_fish_runtime_run` | | 资产 | `asset_object`, `asset_entity_binding`, `asset_event` | | AI 任务 | `ai_task`, `ai_task_stage`, `ai_text_chunk`, `ai_result_reference`, `ai_task_event` | @@ -669,6 +670,53 @@ SELECT * FROM match3d_runtime_run WHERE owner_user_id = '' ORDER BY upd SELECT * FROM match3d_runtime_run WHERE profile_id = ''; ``` +## 方洞挑战表 + +### `square_hole_agent_session` + +- 作用:方洞挑战创作 Agent 会话表,保存种子、配置 JSON、草稿 JSON 和发布 profile 指针。 +- 结构:`session_id PK: String`, `owner_user_id: String`, `seed_text: String`, `current_turn: u32`, `progress_percent: u32`, `stage: String`, `config_json: String`, `draft_json: String`, `last_assistant_reply: String`, `published_profile_id: String`, `created_at: Timestamp`, `updated_at: Timestamp`。 +- 索引:`owner_user_id`。 + +```sql +SELECT * FROM square_hole_agent_session WHERE session_id = ''; +SELECT * FROM square_hole_agent_session WHERE owner_user_id = '' ORDER BY updated_at DESC; +``` + +### `square_hole_agent_message` + +- 作用:方洞挑战创作 Agent 消息流水。 +- 结构:`message_id PK: String`, `session_id: String`, `role: String`, `kind: String`, `text: String`, `created_at: Timestamp`。 +- 索引:`session_id`。 + +```sql +SELECT * FROM square_hole_agent_message WHERE session_id = '' ORDER BY created_at ASC; +``` + +### `square_hole_work_profile` + +- 作用:方洞挑战作品主表,保存作品基础信息、反直觉规则、配置、发布状态和游玩次数。 +- 结构:`profile_id PK: String`, `work_id: String`, `owner_user_id: String`, `source_session_id: String`, `author_display_name: String`, `game_name: String`, `theme_text: String`, `twist_rule: String`, `summary_text: String`, `tags_json: String`, `cover_image_src: String`, `shape_count: u32`, `difficulty: u32`, `config_json: String`, `publication_status: String`, `play_count: u32`, `updated_at: Timestamp`, `published_at: Option`。 +- 索引:`owner_user_id`, `publication_status`。 + +```sql +SELECT * FROM square_hole_work_profile WHERE profile_id = ''; +SELECT * FROM square_hole_work_profile WHERE owner_user_id = '' ORDER BY updated_at DESC; +SELECT * FROM square_hole_work_profile WHERE publication_status = 'Published'; +``` + +### `square_hole_runtime_run` + +- 作用:方洞挑战单局运行态表,保存后端权威快照、快照版本、胜负状态和成绩基础字段。 +- 结构:`run_id PK: String`, `owner_user_id: String`, `profile_id: String`, `status: String`, `snapshot_version: u64`, `started_at_ms: i64`, `duration_limit_ms: i64`, `finished_at_ms: i64`, `elapsed_ms: i64`, `total_shape_count: u32`, `completed_shape_count: u32`, `score: u32`, `snapshot_json: String`, `created_at: Timestamp`, `updated_at: Timestamp`。 +- 索引:`owner_user_id`, `profile_id`。 + +```sql +SELECT * FROM square_hole_runtime_run WHERE run_id = ''; +SELECT * FROM square_hole_runtime_run WHERE owner_user_id = '' ORDER BY updated_at DESC; +SELECT * FROM square_hole_runtime_run WHERE profile_id = ''; +``` + ## 大鱼吃小鱼表 ### `big_fish_creation_session` diff --git a/package.json b/package.json index 75c82caf..f4491d63 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "admin-web:preview": "npm --prefix apps/admin-web run preview --", "spacetime:generate": "node scripts/generate-spacetime-bindings.mjs", "api-server": "node scripts/api-server-dev.mjs", + "api-server:maincloud": "node scripts/api-server-maincloud.mjs", "deploy:rust:remote": "node scripts/run-bash-script.mjs scripts/deploy-rust-remote.sh", "build:production-release": "node scripts/run-bash-script.mjs scripts/build-production-release.sh", "build:rust:ubuntu": "node scripts/run-bash-script.mjs scripts/deploy-rust-remote.sh", diff --git a/packages/shared/src/contracts/squareHoleAgent.ts b/packages/shared/src/contracts/squareHoleAgent.ts new file mode 100644 index 00000000..65ca2c70 --- /dev/null +++ b/packages/shared/src/contracts/squareHoleAgent.ts @@ -0,0 +1,100 @@ +/** + * 方洞挑战创作 Agent 共享契约。 + * 字段按 HTTP facade 的 camelCase DTO 命名,后端领域层 snake_case 字段由 facade 映射。 + */ +export type SquareHoleCreationStage = + | 'collecting_config' + | 'draft_ready' + | string; + +export type SquareHoleAnchorStatus = + | 'confirmed' + | 'missing' + | 'inferred' + | string; + +export interface CreateSquareHoleSessionRequest { + seedText?: string; + themeText?: string; + twistRule?: string; + shapeCount?: number; + difficulty?: number; +} + +export interface SendSquareHoleMessageRequest { + clientMessageId: string; + text: string; + quickFillRequested?: boolean; +} + +export interface ExecuteSquareHoleActionRequest { + action: string; + gameName?: string; + summary?: string; + tags?: string[]; + coverImageSrc?: string | null; +} + +export interface SquareHoleAnchorItemResponse { + key: string; + label: string; + value: string; + status: SquareHoleAnchorStatus; +} + +export interface SquareHoleAnchorPackResponse { + theme: SquareHoleAnchorItemResponse; + twistRule: SquareHoleAnchorItemResponse; + shapeCount: SquareHoleAnchorItemResponse; + difficulty: SquareHoleAnchorItemResponse; +} + +export interface SquareHoleCreatorConfig { + themeText: string; + twistRule: string; + shapeCount: number; + difficulty: number; +} + +export interface SquareHoleResultDraft { + profileId: string; + gameName: string; + themeText: string; + twistRule: string; + summary: string; + tags: string[]; + shapeCount: number; + difficulty: number; + publishReady: boolean; + blockers: string[]; +} + +export interface SquareHoleAgentMessage { + id: string; + role: 'user' | 'assistant' | 'system' | string; + kind: 'chat' | 'summary' | 'action_result' | 'warning' | string; + text: string; + createdAt: string; +} + +export interface SquareHoleSessionSnapshot { + sessionId: string; + currentTurn: number; + progressPercent: number; + stage: SquareHoleCreationStage; + anchorPack: SquareHoleAnchorPackResponse; + config: SquareHoleCreatorConfig; + draft?: SquareHoleResultDraft | null; + messages: SquareHoleAgentMessage[]; + lastAssistantReply?: string | null; + publishedProfileId?: string | null; + updatedAt: string; +} + +export interface SquareHoleSessionResponse { + session: SquareHoleSessionSnapshot; +} + +export interface SquareHoleActionResponse { + session: SquareHoleSessionSnapshot; +} diff --git a/packages/shared/src/contracts/squareHoleRuntime.ts b/packages/shared/src/contracts/squareHoleRuntime.ts new file mode 100644 index 00000000..910de894 --- /dev/null +++ b/packages/shared/src/contracts/squareHoleRuntime.ts @@ -0,0 +1,99 @@ +/** + * 方洞挑战运行态共享契约。 + * 后端负责当前形状、洞口兼容、胜负和连击真相;前端只提交洞口选择并渲染快照。 + */ +export type SquareHoleRunStatus = + | 'running' + | 'won' + | 'failed' + | 'stopped' + | string; +export type SquareHoleShapeKind = + | 'square' + | 'circle' + | 'triangle' + | 'star' + | 'arch' + | 'diamond' + | string; +export type SquareHoleHoleKind = + | 'square' + | 'circle' + | 'triangle' + | 'star' + | 'arch' + | 'diamond' + | string; +export type SquareHoleDropRejectReason = + | 'run_not_active' + | 'snapshot_version_mismatch' + | 'hole_not_found' + | 'incompatible' + | 'time_up' + | string; + +export interface SquareHoleShapeSnapshot { + shapeId: string; + shapeKind: SquareHoleShapeKind; + label: string; + color: string; +} + +export interface SquareHoleHoleSnapshot { + holeId: string; + holeKind: SquareHoleHoleKind; + label: string; + x: number; + y: number; +} + +export interface SquareHoleRunSnapshot { + runId: string; + profileId: string; + ownerUserId: string; + status: SquareHoleRunStatus; + snapshotVersion: number; + startedAtMs: number; + durationLimitMs: number; + remainingMs: number; + totalShapeCount: number; + completedShapeCount: number; + combo: number; + bestCombo: number; + score: number; + ruleLabel: string; + currentShape?: SquareHoleShapeSnapshot | null; + holes: SquareHoleHoleSnapshot[]; + lastFeedback?: SquareHoleDropFeedback | null; +} + +export interface StartSquareHoleRunRequest { + profileId: string; +} + +export interface DropSquareHoleShapeRequest { + runId?: string; + holeId: string; + clientSnapshotVersion: number; + clientEventId: string; + droppedAtMs: number; +} + +export interface StopSquareHoleRunRequest { + clientActionId: string; +} + +export interface SquareHoleDropFeedback { + accepted: boolean; + rejectReason?: SquareHoleDropRejectReason | null; + message: string; +} + +export interface SquareHoleDropResponse { + feedback: SquareHoleDropFeedback; + run: SquareHoleRunSnapshot; +} + +export interface SquareHoleRunResponse { + run: SquareHoleRunSnapshot; +} diff --git a/packages/shared/src/contracts/squareHoleWorks.ts b/packages/shared/src/contracts/squareHoleWorks.ts new file mode 100644 index 00000000..a45c7876 --- /dev/null +++ b/packages/shared/src/contracts/squareHoleWorks.ts @@ -0,0 +1,50 @@ +/** + * 方洞挑战作品读写共享契约。 + * 作品字段只表达结果页可编辑信息;运行规则真相由后端 runtime 快照负责。 + */ +export type SquareHoleWorkPublicationStatus = 'draft' | 'published' | string; + +export interface PutSquareHoleWorkRequest { + gameName: string; + themeText?: string; + twistRule: string; + summary: string; + tags: string[]; + coverImageSrc?: string | null; + shapeCount: number; + difficulty: number; +} + +export interface SquareHoleWorkSummary { + workId: string; + profileId: string; + ownerUserId: string; + sourceSessionId?: string | null; + gameName: string; + themeText: string; + twistRule: string; + summary: string; + tags: string[]; + coverImageSrc?: string | null; + shapeCount: number; + difficulty: number; + publicationStatus: SquareHoleWorkPublicationStatus; + playCount: number; + updatedAt: string; + publishedAt?: string | null; + publishReady: boolean; +} + +export interface SquareHoleWorkProfile extends SquareHoleWorkSummary {} + +export interface SquareHoleWorksResponse { + items: SquareHoleWorkSummary[]; +} + +export interface SquareHoleWorkDetailResponse { + item: SquareHoleWorkProfile; +} + +export interface SquareHoleWorkMutationResponse { + item: SquareHoleWorkProfile; +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 683cfc5d..152b76f3 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -13,6 +13,9 @@ export * from './contracts/puzzleAgentSession'; export * from './contracts/puzzleResultPreview'; export * from './contracts/puzzleRuntimeSession'; export * from './contracts/puzzleWorkSummary'; +export * from './contracts/squareHoleAgent'; +export * from './contracts/squareHoleRuntime'; +export * from './contracts/squareHoleWorks'; export * from './contracts/rpgAgentActions'; export * from './contracts/rpgAgentAnchors'; export * from './contracts/rpgAgentDraft'; diff --git a/scripts/api-server-maincloud.mjs b/scripts/api-server-maincloud.mjs new file mode 100644 index 00000000..6d7d1989 --- /dev/null +++ b/scripts/api-server-maincloud.mjs @@ -0,0 +1,220 @@ +import { execFileSync, spawn } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { setTimeout as delay } from 'node:timers/promises'; + +const repoRoot = process.cwd(); +const apiServerExePath = resolve( + repoRoot, + 'server-rs/target/debug/api-server.exe', +); +const defaultHealthHost = '127.0.0.1'; +const defaultHealthPort = '3100'; +const healthTimeoutMs = + Number(process.env.GENARRATIVE_API_SERVER_MAINCLOUD_SMOKE_TIMEOUT_SECONDS) * + 1000 || 180_000; + +function loadEnvFile(path, target) { + if (!existsSync(path)) { + return; + } + + const rawText = readFileSync(path, 'utf8'); + for (const rawLine of rawText.split(/\r?\n/u)) { + const line = rawLine.trim(); + if (!line || line.startsWith('#')) { + continue; + } + + const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/u); + if (!match) { + continue; + } + + const [, key, rawValue] = match; + if (target[key] !== undefined) { + continue; + } + + target[key] = rawValue.replace(/^['"]|['"]$/gu, ''); + } +} + +function stopExistingWindowsApiServer() { + if (process.platform !== 'win32') { + return; + } + + // Windows 下 cargo 重编译不能覆盖正在运行的 exe,只清理本仓库 target 内的 api-server。 + const command = [ + '$ErrorActionPreference = "Continue"', + '$target = [System.IO.Path]::GetFullPath($env:GENARRATIVE_API_SERVER_EXE_TARGET)', + '$processes = Get-Process -Name api-server -ErrorAction SilentlyContinue | Where-Object {', + ' $_.Path -and ([System.IO.Path]::GetFullPath($_.Path) -ieq $target)', + '}', + 'foreach ($process in $processes) {', + ' try {', + ' Stop-Process -Id $process.Id -Force -ErrorAction Stop', + ' Wait-Process -Id $process.Id -Timeout 5 -ErrorAction SilentlyContinue', + ' Write-Output $process.Id', + ' } catch {', + ' Write-Error "[api-server:maincloud] 忽略旧进程清理瞬时失败 pid=$($process.Id): $($_.Exception.Message)"', + ' }', + '}', + 'exit 0', + ].join('\n'); + + const output = execFileSync( + 'powershell.exe', + ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', command], + { + encoding: 'utf8', + env: { + ...process.env, + GENARRATIVE_API_SERVER_EXE_TARGET: apiServerExePath, + }, + }, + ).trim(); + + if (output) { + console.log(`[api-server:maincloud] 已停止旧 api-server 进程: ${output}`); + } +} + +function stopProcessTree(child) { + if (!child || child.exitCode !== null || child.signalCode) { + return; + } + + if (process.platform === 'win32') { + try { + execFileSync('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { + stdio: 'ignore', + }); + return; + } catch { + // taskkill 可能已经被进程自然退出抢先;继续走兜底清理。 + } + } + + child.kill('SIGTERM'); +} + +async function waitForHealthz({ child, healthUrl }) { + const deadline = Date.now() + healthTimeoutMs; + let childExit = null; + child.once('exit', (code, signal) => { + childExit = { code, signal }; + }); + + while (Date.now() < deadline) { + if (childExit) { + throw new Error( + `api-server 在 healthz 就绪前退出:code=${childExit.code ?? ''} signal=${ + childExit.signal ?? '' + }`, + ); + } + + try { + const response = await fetch(healthUrl, { + signal: AbortSignal.timeout(1_000), + }); + const body = await response.text(); + if (response.status === 200) { + return body; + } + } catch { + // 服务启动期间连接失败是预期状态,继续轮询。 + } + + await delay(500); + } + + throw new Error(`等待 /healthz 超时:${healthUrl}`); +} + +const mergedEnv = { ...process.env }; +loadEnvFile(resolve(repoRoot, '.env'), mergedEnv); +loadEnvFile(resolve(repoRoot, '.env.local'), mergedEnv); +loadEnvFile(resolve(repoRoot, '.env.secrets.local'), mergedEnv); + +mergedEnv.GENARRATIVE_API_HOST = + mergedEnv.GENARRATIVE_API_HOST || defaultHealthHost; +mergedEnv.GENARRATIVE_API_PORT = + mergedEnv.GENARRATIVE_API_PORT || defaultHealthPort; +mergedEnv.GENARRATIVE_SPACETIME_SERVER_URL = + mergedEnv.GENARRATIVE_SPACETIME_MAINCLOUD_SERVER_URL || + mergedEnv.GENARRATIVE_SPACETIME_SERVER_URL || + 'https://maincloud.spacetimedb.com'; +mergedEnv.GENARRATIVE_SPACETIME_DATABASE = + mergedEnv.GENARRATIVE_SPACETIME_MAINCLOUD_DATABASE || + mergedEnv.GENARRATIVE_SPACETIME_DATABASE || + ''; +mergedEnv.GENARRATIVE_SPACETIME_TOKEN = + mergedEnv.GENARRATIVE_SPACETIME_MAINCLOUD_TOKEN || + mergedEnv.GENARRATIVE_SPACETIME_TOKEN || + ''; + +if (!mergedEnv.GENARRATIVE_SPACETIME_DATABASE) { + console.error( + '[api-server:maincloud] 缺少 GENARRATIVE_SPACETIME_MAINCLOUD_DATABASE 或 GENARRATIVE_SPACETIME_DATABASE。', + ); + process.exit(1); +} + +try { + stopExistingWindowsApiServer(); +} catch (error) { + console.error( + `[api-server:maincloud] 清理旧 api-server 进程失败: ${error.message}`, + ); + process.exit(1); +} + +console.log( + `[api-server:maincloud] SpacetimeDB ${mergedEnv.GENARRATIVE_SPACETIME_DATABASE} @ ${mergedEnv.GENARRATIVE_SPACETIME_SERVER_URL}`, +); + +const child = spawn( + 'cargo', + ['run', '-p', 'api-server', '--manifest-path', 'server-rs/Cargo.toml'], + { + cwd: repoRoot, + env: mergedEnv, + stdio: 'inherit', + }, +); + +const cleanup = () => { + stopProcessTree(child); + try { + stopExistingWindowsApiServer(); + } catch { + // 退出阶段只做 best-effort 清理,不能覆盖真实 smoke 结果。 + } +}; + +process.once('SIGINT', () => { + cleanup(); + process.exit(130); +}); +process.once('SIGTERM', () => { + cleanup(); + process.exit(143); +}); + +try { + const healthHost = + mergedEnv.GENARRATIVE_API_HOST === '0.0.0.0' + ? defaultHealthHost + : mergedEnv.GENARRATIVE_API_HOST; + const healthUrl = `http://${healthHost}:${mergedEnv.GENARRATIVE_API_PORT}/healthz`; + const body = await waitForHealthz({ child, healthUrl }); + console.log(`[api-server:maincloud] /healthz 通过:${body}`); + cleanup(); +} catch (error) { + console.error(`[api-server:maincloud] smoke 失败:${error.message}`); + cleanup(); + process.exit(1); +} diff --git a/server-rs/Cargo.lock b/server-rs/Cargo.lock index a9fb3e5b..8e1a4fba 100644 --- a/server-rs/Cargo.lock +++ b/server-rs/Cargo.lock @@ -90,6 +90,7 @@ dependencies = [ "module-runtime", "module-runtime-item", "module-runtime-story", + "module-square-hole", "module-story", "platform-auth", "platform-llm", @@ -1639,6 +1640,15 @@ dependencies = [ "time", ] +[[package]] +name = "module-square-hole" +version = "0.1.0" +dependencies = [ + "serde", + "shared-kernel", + "spacetimedb", +] + [[package]] name = "module-story" version = "0.1.0" @@ -2681,6 +2691,7 @@ dependencies = [ "module-runtime", "module-runtime-item", "module-runtime-story", + "module-square-hole", "module-story", "serde", "serde_json", @@ -2708,6 +2719,7 @@ dependencies = [ "module-quest", "module-runtime", "module-runtime-item", + "module-square-hole", "module-story", "serde", "serde_json", diff --git a/server-rs/Cargo.toml b/server-rs/Cargo.toml index 44bca7a9..ae27db5d 100644 --- a/server-rs/Cargo.toml +++ b/server-rs/Cargo.toml @@ -23,6 +23,7 @@ members = [ "crates/module-runtime", "crates/module-runtime-story", "crates/module-runtime-item", + "crates/module-square-hole", "crates/module-story", "crates/platform-oss", "crates/platform-auth", diff --git a/server-rs/crates/api-server/Cargo.toml b/server-rs/crates/api-server/Cargo.toml index ecf14ecb..dcb23ed2 100644 --- a/server-rs/crates/api-server/Cargo.toml +++ b/server-rs/crates/api-server/Cargo.toml @@ -25,6 +25,7 @@ module-puzzle = { path = "../module-puzzle" } module-runtime = { path = "../module-runtime" } module-runtime-story = { path = "../module-runtime-story" } module-runtime-item = { path = "../module-runtime-item" } +module-square-hole = { path = "../module-square-hole" } module-story = { path = "../module-story" } platform-auth = { path = "../platform-auth" } platform-llm = { path = "../platform-llm" } diff --git a/server-rs/crates/api-server/src/app.rs b/server-rs/crates/api-server/src/app.rs index 7bb27d64..de4b79c6 100644 --- a/server-rs/crates/api-server/src/app.rs +++ b/server-rs/crates/api-server/src/app.rs @@ -119,6 +119,14 @@ use crate::{ put_runtime_snapshot, resume_profile_save_archive, }, runtime_settings::{get_runtime_settings, put_runtime_settings}, + square_hole::{ + compile_square_hole_agent_draft, create_square_hole_agent_session, delete_square_hole_work, + drop_square_hole_shape, execute_square_hole_agent_action, finish_square_hole_time_up, + get_square_hole_agent_session, get_square_hole_run, get_square_hole_work_detail, + get_square_hole_works, list_square_hole_gallery, publish_square_hole_work, + put_square_hole_work, restart_square_hole_run, start_square_hole_run, stop_square_hole_run, + stream_square_hole_agent_message, submit_square_hole_agent_message, + }, state::AppState, story_battles::{ create_story_battle, create_story_npc_battle, get_story_battle_state, resolve_story_battle, @@ -829,6 +837,119 @@ pub fn build_router(state: AppState) -> Router { require_bearer_auth, )), ) + .route( + "/api/creation/square-hole/sessions", + post(create_square_hole_agent_session).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/sessions/{session_id}", + get(get_square_hole_agent_session).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/sessions/{session_id}/messages", + post(submit_square_hole_agent_message).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/sessions/{session_id}/messages/stream", + post(stream_square_hole_agent_message).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/sessions/{session_id}/actions", + post(execute_square_hole_agent_action).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/sessions/{session_id}/compile", + post(compile_square_hole_agent_draft).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/works", + get(get_square_hole_works).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/works/{profile_id}", + get(get_square_hole_work_detail) + .patch(put_square_hole_work) + .put(put_square_hole_work) + .delete(delete_square_hole_work) + .route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/creation/square-hole/works/{profile_id}/publish", + post(publish_square_hole_work).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/runtime/square-hole/gallery", + get(list_square_hole_gallery), + ) + .route( + "/api/runtime/square-hole/works/{profile_id}/runs", + post(start_square_hole_run).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/runtime/square-hole/runs/{run_id}", + get(get_square_hole_run).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/runtime/square-hole/runs/{run_id}/drop", + post(drop_square_hole_shape).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/runtime/square-hole/runs/{run_id}/stop", + post(stop_square_hole_run).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/runtime/square-hole/runs/{run_id}/restart", + post(restart_square_hole_run).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/runtime/square-hole/runs/{run_id}/time-up", + post(finish_square_hole_time_up).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) .route( "/api/runtime/puzzle/agent/sessions", post(create_puzzle_agent_session) diff --git a/server-rs/crates/api-server/src/creation_agent_llm_turn.rs b/server-rs/crates/api-server/src/creation_agent_llm_turn.rs index ffd92d65..4ace99a4 100644 --- a/server-rs/crates/api-server/src/creation_agent_llm_turn.rs +++ b/server-rs/crates/api-server/src/creation_agent_llm_turn.rs @@ -64,8 +64,12 @@ where }; turn_output.map_err(|error| match error { - CreationAgentJsonTurnFailure::Stream(_) => { - build_error(messages.generation_failed.to_string()) + CreationAgentJsonTurnFailure::Stream(error) => { + tracing::warn!( + error = %error, + "创作 Agent 流式 LLM 请求失败" + ); + build_error(format!("{}:{error}", messages.generation_failed)) } CreationAgentJsonTurnFailure::Parse => build_error(messages.parse_failed.to_string()), }) diff --git a/server-rs/crates/api-server/src/main.rs b/server-rs/crates/api-server/src/main.rs index 84a86ed1..6917d6b1 100644 --- a/server-rs/crates/api-server/src/main.rs +++ b/server-rs/crates/api-server/src/main.rs @@ -61,6 +61,8 @@ mod runtime_profile; mod runtime_save; mod runtime_settings; mod session_client; +mod square_hole; +mod square_hole_agent_turn; mod state; mod story_battles; mod story_sessions; diff --git a/server-rs/crates/api-server/src/prompt/mod.rs b/server-rs/crates/api-server/src/prompt/mod.rs index 026a6877..ed6eb86c 100644 --- a/server-rs/crates/api-server/src/prompt/mod.rs +++ b/server-rs/crates/api-server/src/prompt/mod.rs @@ -4,6 +4,7 @@ pub(crate) mod character_visual; pub(crate) mod puzzle; pub(crate) mod rpg; pub(crate) mod scene_background; +pub(crate) mod square_hole; pub(crate) use rpg::agent_chat; pub(crate) use rpg::foundation_draft; diff --git a/server-rs/crates/api-server/src/prompt/square_hole.rs b/server-rs/crates/api-server/src/prompt/square_hole.rs new file mode 100644 index 00000000..0620df4b --- /dev/null +++ b/server-rs/crates/api-server/src/prompt/square_hole.rs @@ -0,0 +1,164 @@ +use serde_json::{Value as JsonValue, json}; +use spacetime_client::{SquareHoleAgentMessageRecord, SquareHoleAgentSessionRecord}; + +use crate::creation_agent_chat::render_quick_fill_extra_rules; + +/// 方洞挑战共创 Agent 的系统提示词。 +/// +/// 这里只定义模型职责与输出约束,具体的模型调用、解析和写库由方洞 Agent turn 负责。 +pub(crate) const SQUARE_HOLE_AGENT_SYSTEM_PROMPT: &str = r#"你是一个负责和百梦主共创“方洞挑战”竖屏玩法的中文创意策划。 + +你要把用户灵感收束成一个反直觉形状分拣小游戏:玩家会本能把形状投入对应洞口,但真实规则可能让所有形状都优先进入方洞,形成类似参考视频“所有东西都进方洞”的喜剧反差。 + +你必须同时输出: +1. 一段直接发给用户的中文回复 replyText +2. 当前进度 progressPercent +3. 下一轮完整可用的 nextConfig + +硬约束: +1. 只能输出 JSON,不能输出代码块或解释 +2. nextConfig 必须是完整对象,不能只输出 patch +3. replyText 必须是自然中文,不能提“字段”“结构”“JSON”“后端”等内部词 +4. replyText 一次最多推进一个最关键问题 +5. 如果用户要求自动配置,就直接补齐可发布草稿需要的题材、反差规则、形状数量和难度,不要继续提问 +6. 默认核心反差优先使用“方洞万能”或“方洞优先”,但可以根据用户题材包装成更有记忆点的规则 +7. progressPercent 范围只能是 0 到 100 +8. shapeCount 只能是 6 到 24 的整数,difficulty 只能是 1 到 10 的整数 +"#; + +const SQUARE_HOLE_AGENT_OUTPUT_CONTRACT: &str = r#"请严格按以下 JSON 输出,不要输出其他文字: +{ + "replyText": "", + "progressPercent": 0, + "nextConfig": { + "themeText": "", + "twistRule": "", + "shapeCount": 12, + "difficulty": 4 + } +}"#; + +pub(crate) const SQUARE_HOLE_AGENT_JSON_TURN_USER_PROMPT: &str = "请按约定输出这一轮的 JSON。"; + +/// 方洞挑战草稿生成对话提示词脚本。 +/// +/// 方洞首版只需要四个可写回 SpacetimeDB 的配置项,因此提示词直接围绕配置收束, +/// 不在模型输出层引入额外锚点,避免和当前持久化 schema 产生漂移。 +pub(crate) fn build_square_hole_agent_prompt( + session: &SquareHoleAgentSessionRecord, + quick_fill_requested: bool, +) -> String { + let quick_fill_rules = if quick_fill_requested { + format!( + "\n\n{}", + render_quick_fill_extra_rules( + "当前方洞挑战方向里的题材、反差规则、形状数量和难度", + "不要要求用户再提供洞口、形状、演出或难度信息", + "输出完整 nextConfig,直接补齐空缺或仍过于泛化的项", + "生成结果页", + ) + ) + } else { + String::new() + }; + format!( + "模板目标:收束成可试玩、可发布的方洞挑战玩法草稿。{quick_fill_rules}\n\n当前是第 {turn} 轮,当前进度 {progress}% 。\n\n是否要求自动配置:{quick_fill_requested_text}\n\n当前配置:\n{current_config}\n\n最近聊天记录:\n{chat_history}\n\n收束要求:\n1. themeText 描述本局的玩具、道具或场景题材,保持短句。\n2. twistRule 描述真实判定规则,优先体现方洞优先或类似反直觉逻辑。\n3. shapeCount 决定单局形状数量,移动端短局建议 8 到 16。\n4. difficulty 决定误导强度和节奏,建议 3 到 7。\n5. 用户给出明确方向时优先吸收并推进,不要机械问完四个问题。\n\n{contract}", + quick_fill_rules = quick_fill_rules, + turn = session.current_turn.saturating_add(1), + progress = session.progress_percent, + quick_fill_requested_text = if quick_fill_requested { "是" } else { "否" }, + current_config = serialize_square_hole_session_config(session), + chat_history = + serde_json::to_string_pretty(&build_chat_history(session.messages.as_slice())) + .unwrap_or_else(|_| "[]".to_string()), + contract = SQUARE_HOLE_AGENT_OUTPUT_CONTRACT, + ) +} + +fn serialize_square_hole_session_config(session: &SquareHoleAgentSessionRecord) -> String { + serde_json::to_string_pretty(&json!({ + "themeText": session.config.theme_text, + "twistRule": session.config.twist_rule, + "shapeCount": session.config.shape_count, + "difficulty": session.config.difficulty, + })) + .unwrap_or_else(|_| "{}".to_string()) +} + +fn build_chat_history(messages: &[SquareHoleAgentMessageRecord]) -> Vec { + messages + .iter() + .map(|message| { + json!({ + "role": message.role, + "kind": message.kind, + "content": message.text, + }) + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::build_square_hole_agent_prompt; + + fn message(role: &str, text: &str) -> spacetime_client::SquareHoleAgentMessageRecord { + spacetime_client::SquareHoleAgentMessageRecord { + id: format!("message-{role}"), + role: role.to_string(), + kind: "chat".to_string(), + text: text.to_string(), + created_at: "2026-05-04T10:00:00.000Z".to_string(), + } + } + + fn session_record() -> spacetime_client::SquareHoleAgentSessionRecord { + spacetime_client::SquareHoleAgentSessionRecord { + session_id: "square-hole-session-test".to_string(), + current_turn: 1, + progress_percent: 25, + stage: "collecting_config".to_string(), + anchor_pack: spacetime_client::SquareHoleAnchorPackRecord { + theme: anchor("theme", "题材主题", "积木纸箱"), + twist_rule: anchor("twistRule", "反差规则", ""), + shape_count: anchor("shapeCount", "形状数量", "12"), + difficulty: anchor("difficulty", "难度", "4"), + }, + config: spacetime_client::SquareHoleCreatorConfigRecord { + theme_text: "积木纸箱".to_string(), + twist_rule: "方洞万能".to_string(), + shape_count: 12, + difficulty: 4, + }, + draft: None, + messages: vec![message("user", "做成办公室文具版")], + last_assistant_reply: Some("这次可以从办公室文具题材开始。".to_string()), + published_profile_id: None, + updated_at: "2026-05-04T10:00:00.000Z".to_string(), + } + } + + fn anchor(key: &str, label: &str, value: &str) -> spacetime_client::SquareHoleAnchorItemRecord { + spacetime_client::SquareHoleAnchorItemRecord { + key: key.to_string(), + label: label.to_string(), + value: value.to_string(), + status: if value.is_empty() { + "missing" + } else { + "confirmed" + } + .to_string(), + } + } + + #[test] + fn quick_fill_prompt_requires_complete_config() { + let prompt = build_square_hole_agent_prompt(&session_record(), true); + + assert!(prompt.contains("用户刚刚主动要求你自动补充剩余关键字")); + assert!(prompt.contains("不要再继续提问")); + assert!(prompt.contains("nextConfig")); + assert!(prompt.contains("progressPercent 直接输出为 100")); + } +} diff --git a/server-rs/crates/api-server/src/square_hole.rs b/server-rs/crates/api-server/src/square_hole.rs new file mode 100644 index 00000000..d324ab7c --- /dev/null +++ b/server-rs/crates/api-server/src/square_hole.rs @@ -0,0 +1,1481 @@ +use std::{ + convert::Infallible, + time::{SystemTime, UNIX_EPOCH}, +}; + +use axum::{ + Json, + body::to_bytes, + extract::{Extension, Path, State, rejection::JsonRejection}, + http::{HeaderName, StatusCode, header}, + response::{ + IntoResponse, Response, + sse::{Event, Sse}, + }, +}; +use module_square_hole::{ + SQUARE_HOLE_MESSAGE_ID_PREFIX, SQUARE_HOLE_PROFILE_ID_PREFIX, SQUARE_HOLE_RUN_ID_PREFIX, + SQUARE_HOLE_SESSION_ID_PREFIX, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{Value, json}; +use shared_contracts::{ + square_hole_agent::{ + CreateSquareHoleSessionRequest, ExecuteSquareHoleActionRequest, + SendSquareHoleMessageRequest, SquareHoleActionResponse, SquareHoleAgentMessageResponse, + SquareHoleAnchorItemResponse, SquareHoleAnchorPackResponse, + SquareHoleCreatorConfigResponse, SquareHoleResultDraftResponse, SquareHoleSessionResponse, + SquareHoleSessionSnapshotResponse, + }, + square_hole_runtime::{ + DropSquareHoleShapeRequest, SquareHoleDropFeedbackResponse, SquareHoleDropResponse, + SquareHoleHoleSnapshotResponse, SquareHoleRunResponse, SquareHoleRunSnapshotResponse, + SquareHoleShapeSnapshotResponse, StartSquareHoleRunRequest, StopSquareHoleRunRequest, + }, + square_hole_works::{ + PutSquareHoleWorkRequest, SquareHoleWorkDetailResponse, SquareHoleWorkMutationResponse, + SquareHoleWorkProfileResponse, SquareHoleWorkSummaryResponse, SquareHoleWorksResponse, + }, +}; +use shared_kernel::build_prefixed_uuid_id; +use spacetime_client::{ + SpacetimeClientError, SquareHoleAgentMessageRecord, SquareHoleAgentMessageSubmitRecordInput, + SquareHoleAgentSessionCreateRecordInput, SquareHoleAgentSessionRecord, + SquareHoleAnchorItemRecord, SquareHoleAnchorPackRecord, SquareHoleCompileDraftRecordInput, + SquareHoleCreatorConfigRecord, SquareHoleDropFeedbackRecord, SquareHoleHoleSnapshotRecord, + SquareHoleResultDraftRecord, SquareHoleRunDropRecordInput, SquareHoleRunRecord, + SquareHoleRunRestartRecordInput, SquareHoleRunStartRecordInput, SquareHoleRunStopRecordInput, + SquareHoleRunTimeUpRecordInput, SquareHoleShapeSnapshotRecord, SquareHoleWorkProfileRecord, + SquareHoleWorkUpdateRecordInput, +}; + +use crate::{ + ai_generation_drafts::{AiGenerationDraftContext, AiGenerationDraftWriter}, + api_response::json_success_body, + auth::AuthenticatedAccessToken, + http_error::AppError, + request_context::RequestContext, + square_hole_agent_turn::{ + SquareHoleAgentTurnRequest, build_finalize_record_input, run_square_hole_agent_turn, + }, + state::AppState, +}; + +const SQUARE_HOLE_AGENT_PROVIDER: &str = "square-hole-agent"; +const SQUARE_HOLE_WORKS_PROVIDER: &str = "square-hole-works"; +const SQUARE_HOLE_RUNTIME_PROVIDER: &str = "square-hole-runtime"; +const SQUARE_HOLE_DEFAULT_THEME: &str = "纸箱"; +const SQUARE_HOLE_DEFAULT_TWIST_RULE: &str = "方洞万能"; +const SQUARE_HOLE_DEFAULT_SHAPE_COUNT: u32 = 12; +const SQUARE_HOLE_DEFAULT_DIFFICULTY: u32 = 4; +const SQUARE_HOLE_QUESTION_THEME: &str = "你想做什么题材"; + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleConfigJson { + theme_text: String, + twist_rule: String, + shape_count: u32, + difficulty: u32, +} + +#[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct CompileSquareHoleDraftRequest { + #[serde(default)] + game_name: Option, + #[serde(default)] + summary: Option, + #[serde(default)] + tags: Option>, + #[serde(default)] + cover_image_src: Option, +} + +pub async fn create_square_hole_agent_session( + State(state): State, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let Json(payload) = square_hole_json(payload, &request_context, SQUARE_HOLE_AGENT_PROVIDER)?; + let config = build_config_from_create_request(&payload); + let seed_text = build_seed_text(&payload, &config); + let welcome_message_text = SQUARE_HOLE_QUESTION_THEME.to_string(); + + let session = state + .spacetime_client() + .create_square_hole_agent_session(SquareHoleAgentSessionCreateRecordInput { + session_id: build_prefixed_uuid_id(SQUARE_HOLE_SESSION_ID_PREFIX), + owner_user_id: authenticated.claims().user_id().to_string(), + seed_text, + welcome_message_id: build_prefixed_uuid_id(SQUARE_HOLE_MESSAGE_ID_PREFIX), + welcome_message_text, + config_json: serialize_square_hole_config(&config), + created_at_micros: current_utc_micros(), + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleSessionResponse { + session: map_square_hole_agent_session_response(session), + }, + )) +} + +pub async fn get_square_hole_agent_session( + State(state): State, + Path(session_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &session_id, + "sessionId", + )?; + + let session = state + .spacetime_client() + .get_square_hole_agent_session(session_id, authenticated.claims().user_id().to_string()) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleSessionResponse { + session: map_square_hole_agent_session_response(session), + }, + )) +} + +pub async fn submit_square_hole_agent_message( + State(state): State, + Path(session_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let Json(payload) = square_hole_json(payload, &request_context, SQUARE_HOLE_AGENT_PROVIDER)?; + let session = submit_and_finalize_square_hole_message( + &state, + &request_context, + authenticated.claims().user_id(), + session_id, + payload, + |_| {}, + ) + .await?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleSessionResponse { + session: map_square_hole_agent_session_response(session), + }, + )) +} + +pub async fn stream_square_hole_agent_message( + State(state): State, + Path(session_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result { + let Json(payload) = square_hole_json(payload, &request_context, SQUARE_HOLE_AGENT_PROVIDER)?; + ensure_non_empty( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &session_id, + "sessionId", + )?; + + let owner_user_id = authenticated.claims().user_id().to_string(); + let request_context_for_stream = request_context.clone(); + let state = state.clone(); + let stream = async_stream::stream! { + let mut draft_writer = AiGenerationDraftWriter::new(AiGenerationDraftContext::new( + "square-hole", + owner_user_id.as_str(), + session_id.as_str(), + payload.client_message_id.as_str(), + "方洞挑战生成草稿", + )); + if let Err(error) = draft_writer.ensure_started(state.spacetime_client()).await { + tracing::warn!(error = %error, "方洞挑战生成草稿任务启动失败,主生成流程继续执行"); + } + + let (reply_tx, mut reply_rx) = tokio::sync::mpsc::unbounded_channel::(); + let result = { + let run_turn = submit_and_finalize_square_hole_message( + &state, + &request_context_for_stream, + owner_user_id.as_str(), + session_id.clone(), + payload, + move |text| { + let _ = reply_tx.send(text.to_string()); + }, + ); + tokio::pin!(run_turn); + + loop { + tokio::select! { + result = &mut run_turn => break result, + maybe_text = reply_rx.recv() => { + if let Some(text) = maybe_text { + draft_writer.persist_visible_text(state.spacetime_client(), text.as_str()).await; + yield Ok::(square_hole_sse_json_event_or_error( + "reply_delta", + json!({ "text": text }), + )); + } + } + } + } + }; + + while let Some(text) = reply_rx.recv().await { + draft_writer.persist_visible_text(state.spacetime_client(), text.as_str()).await; + yield Ok::(square_hole_sse_json_event_or_error( + "reply_delta", + json!({ "text": text }), + )); + } + + let session = match result { + Ok(session) => session, + Err(response) => { + let message = extract_square_hole_response_error_message(response).await; + yield Ok::(square_hole_sse_json_event_or_error( + "error", + json!({ "message": message }), + )); + return; + } + }; + + let session_response = map_square_hole_agent_session_response(session); + yield Ok::(square_hole_sse_json_event_or_error( + "session", + json!({ "session": session_response }), + )); + yield Ok::(square_hole_sse_json_event_or_error( + "done", + json!({ "ok": true }), + )); + }; + + Ok(Sse::new(stream).into_response()) +} + +pub async fn execute_square_hole_agent_action( + State(state): State, + Path(session_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let Json(payload) = square_hole_json(payload, &request_context, SQUARE_HOLE_AGENT_PROVIDER)?; + ensure_non_empty( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &session_id, + "sessionId", + )?; + + if payload.action.trim() != "square_hole_compile_draft" { + return Err(square_hole_bad_request( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + "unknown square hole action", + )); + } + + let session = compile_square_hole_draft_for_session( + &state, + &request_context, + &authenticated, + session_id, + payload.game_name, + payload.summary, + payload.tags, + payload.cover_image_src, + ) + .await?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleActionResponse { + session: map_square_hole_agent_session_response(session), + }, + )) +} + +pub async fn compile_square_hole_agent_draft( + State(state): State, + Path(session_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let payload = payload + .map(|Json(payload)| payload) + .unwrap_or(CompileSquareHoleDraftRequest { + game_name: None, + summary: None, + tags: None, + cover_image_src: None, + }); + ensure_non_empty( + &request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &session_id, + "sessionId", + )?; + + let session = compile_square_hole_draft_for_session( + &state, + &request_context, + &authenticated, + session_id, + payload.game_name, + payload.summary, + payload.tags, + payload.cover_image_src, + ) + .await?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleActionResponse { + session: map_square_hole_agent_session_response(session), + }, + )) +} + +pub async fn get_square_hole_works( + State(state): State, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + let items = state + .spacetime_client() + .list_square_hole_works(authenticated.claims().user_id().to_string()) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleWorksResponse { + items: items + .into_iter() + .map(map_square_hole_work_summary_response) + .collect(), + }, + )) +} + +pub async fn list_square_hole_gallery( + State(state): State, + Extension(request_context): Extension, +) -> Result, Response> { + let items = state + .spacetime_client() + .list_square_hole_gallery() + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleWorksResponse { + items: items + .into_iter() + .map(map_square_hole_work_summary_response) + .collect(), + }, + )) +} + +pub async fn get_square_hole_work_detail( + State(state): State, + Path(profile_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + &profile_id, + "profileId", + )?; + + let item = state + .spacetime_client() + .get_square_hole_work_detail(profile_id, authenticated.claims().user_id().to_string()) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleWorkDetailResponse { + item: map_square_hole_work_profile_response(item), + }, + )) +} + +pub async fn put_square_hole_work( + State(state): State, + Path(profile_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let Json(payload) = square_hole_json(payload, &request_context, SQUARE_HOLE_WORKS_PROVIDER)?; + ensure_non_empty( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + &profile_id, + "profileId", + )?; + + let existing = state + .spacetime_client() + .get_square_hole_work_detail( + profile_id.clone(), + authenticated.claims().user_id().to_string(), + ) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + let theme_text = payload + .theme_text + .clone() + .filter(|value| !value.trim().is_empty()) + .unwrap_or(existing.theme_text); + let item = state + .spacetime_client() + .update_square_hole_work(SquareHoleWorkUpdateRecordInput { + profile_id, + owner_user_id: authenticated.claims().user_id().to_string(), + game_name: payload.game_name, + theme_text, + twist_rule: payload.twist_rule, + summary_text: payload.summary, + tags_json: serde_json::to_string(&normalize_tags(payload.tags)).unwrap_or_default(), + cover_image_src: payload.cover_image_src.unwrap_or_default(), + shape_count: payload.shape_count, + difficulty: payload.difficulty, + updated_at_micros: current_utc_micros(), + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleWorkMutationResponse { + item: map_square_hole_work_profile_response(item), + }, + )) +} + +pub async fn publish_square_hole_work( + State(state): State, + Path(profile_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + &profile_id, + "profileId", + )?; + + let item = state + .spacetime_client() + .publish_square_hole_work( + profile_id, + authenticated.claims().user_id().to_string(), + current_utc_micros(), + ) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleWorkMutationResponse { + item: map_square_hole_work_profile_response(item), + }, + )) +} + +pub async fn delete_square_hole_work( + State(state): State, + Path(profile_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + &profile_id, + "profileId", + )?; + + let items = state + .spacetime_client() + .delete_square_hole_work(profile_id, authenticated.claims().user_id().to_string()) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_WORKS_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleWorksResponse { + items: items + .into_iter() + .map(map_square_hole_work_summary_response) + .collect(), + }, + )) +} + +pub async fn start_square_hole_run( + State(state): State, + Path(profile_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let maybe_payload = payload.ok().map(|Json(payload)| payload); + let profile_id = maybe_payload + .map(|payload| payload.profile_id) + .filter(|value| !value.trim().is_empty()) + .unwrap_or(profile_id); + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &profile_id, + "profileId", + )?; + + let run = state + .spacetime_client() + .start_square_hole_run(SquareHoleRunStartRecordInput { + run_id: build_prefixed_uuid_id(SQUARE_HOLE_RUN_ID_PREFIX), + owner_user_id: authenticated.claims().user_id().to_string(), + profile_id, + started_at_ms: current_utc_ms(), + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleRunResponse { + run: map_square_hole_run_response(run), + }, + )) +} + +pub async fn get_square_hole_run( + State(state): State, + Path(run_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &run_id, + "runId", + )?; + + let run = state + .spacetime_client() + .get_square_hole_run(run_id, authenticated.claims().user_id().to_string()) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleRunResponse { + run: map_square_hole_run_response(run), + }, + )) +} + +pub async fn drop_square_hole_shape( + State(state): State, + Path(run_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let Json(payload) = square_hole_json(payload, &request_context, SQUARE_HOLE_RUNTIME_PROVIDER)?; + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &run_id, + "runId", + )?; + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &payload.hole_id, + "holeId", + )?; + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &payload.client_event_id, + "clientEventId", + )?; + + let confirmation = state + .spacetime_client() + .drop_square_hole_shape(SquareHoleRunDropRecordInput { + run_id: payload.run_id.unwrap_or(run_id), + owner_user_id: authenticated.claims().user_id().to_string(), + hole_id: payload.hole_id, + client_snapshot_version: payload.client_snapshot_version, + client_event_id: payload.client_event_id, + dropped_at_ms: payload.dropped_at_ms.min(i64::MAX as u64) as i64, + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleDropResponse { + feedback: map_square_hole_feedback_response(confirmation.feedback), + run: map_square_hole_run_response(confirmation.run), + }, + )) +} + +pub async fn stop_square_hole_run( + State(state): State, + Path(run_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, + payload: Result, JsonRejection>, +) -> Result, Response> { + let _ = payload.ok(); + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &run_id, + "runId", + )?; + + let run = state + .spacetime_client() + .stop_square_hole_run(SquareHoleRunStopRecordInput { + run_id, + owner_user_id: authenticated.claims().user_id().to_string(), + stopped_at_ms: current_utc_ms(), + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleRunResponse { + run: map_square_hole_run_response(run), + }, + )) +} + +pub async fn restart_square_hole_run( + State(state): State, + Path(run_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &run_id, + "runId", + )?; + + let run = state + .spacetime_client() + .restart_square_hole_run(SquareHoleRunRestartRecordInput { + source_run_id: run_id, + next_run_id: build_prefixed_uuid_id(SQUARE_HOLE_RUN_ID_PREFIX), + owner_user_id: authenticated.claims().user_id().to_string(), + restarted_at_ms: current_utc_ms(), + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleRunResponse { + run: map_square_hole_run_response(run), + }, + )) +} + +pub async fn finish_square_hole_time_up( + State(state): State, + Path(run_id): Path, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, Response> { + ensure_non_empty( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + &run_id, + "runId", + )?; + + let run = state + .spacetime_client() + .finish_square_hole_time_up(SquareHoleRunTimeUpRecordInput { + run_id, + owner_user_id: authenticated.claims().user_id().to_string(), + finished_at_ms: current_utc_ms(), + }) + .await + .map_err(|error| { + square_hole_error_response( + &request_context, + SQUARE_HOLE_RUNTIME_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + + Ok(json_success_body( + Some(&request_context), + SquareHoleRunResponse { + run: map_square_hole_run_response(run), + }, + )) +} + +async fn submit_and_finalize_square_hole_message( + state: &AppState, + request_context: &RequestContext, + owner_user_id: &str, + session_id: String, + payload: SendSquareHoleMessageRequest, + on_reply_update: impl FnMut(&str), +) -> Result { + ensure_non_empty( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &session_id, + "sessionId", + )?; + ensure_non_empty( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &payload.client_message_id, + "clientMessageId", + )?; + ensure_non_empty( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + &payload.text, + "text", + )?; + + let submitted = state + .spacetime_client() + .submit_square_hole_agent_message(SquareHoleAgentMessageSubmitRecordInput { + session_id: session_id.clone(), + owner_user_id: owner_user_id.to_string(), + user_message_id: payload.client_message_id.clone(), + user_message_text: payload.text.clone(), + submitted_at_micros: current_utc_micros(), + }) + .await + .map_err(|error| { + square_hole_error_response( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + let turn_result = run_square_hole_agent_turn( + SquareHoleAgentTurnRequest { + llm_client: state.llm_client(), + session: &submitted, + quick_fill_requested: payload.quick_fill_requested.unwrap_or(false), + enable_web_search: state.config.creation_agent_llm_web_search_enabled, + }, + on_reply_update, + ) + .await + .map_err(|error| { + square_hole_error_response( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({ + "provider": SQUARE_HOLE_AGENT_PROVIDER, + "message": error.to_string(), + })), + ) + })?; + + let finalize_input = build_finalize_record_input( + session_id, + owner_user_id.to_string(), + build_prefixed_uuid_id(SQUARE_HOLE_MESSAGE_ID_PREFIX), + turn_result, + current_utc_micros(), + ); + + state + .spacetime_client() + .finalize_square_hole_agent_message(finalize_input) + .await + .map_err(|error| { + square_hole_error_response( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + map_square_hole_client_error(error), + ) + }) +} + +async fn compile_square_hole_draft_for_session( + state: &AppState, + request_context: &RequestContext, + authenticated: &AuthenticatedAccessToken, + session_id: String, + game_name: Option, + summary: Option, + tags: Option>, + cover_image_src: Option, +) -> Result { + let owner_user_id = authenticated.claims().user_id().to_string(); + let session = state + .spacetime_client() + .get_square_hole_agent_session(session_id.clone(), owner_user_id.clone()) + .await + .map_err(|error| { + square_hole_error_response( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + map_square_hole_client_error(error), + ) + })?; + if session.current_turn < 2 || session.progress_percent < 100 { + return Err(square_hole_bad_request( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + "square hole 创作配置尚未确认完成", + )); + } + + let config = resolve_config_or_default(Some(&session.config)); + let tags_json = tags + .as_ref() + .map(|tags| serde_json::to_string(&normalize_tags(tags.clone())).unwrap_or_default()); + + state + .spacetime_client() + .compile_square_hole_draft(SquareHoleCompileDraftRecordInput { + session_id, + owner_user_id, + profile_id: build_prefixed_uuid_id(SQUARE_HOLE_PROFILE_ID_PREFIX), + author_display_name: resolve_author_display_name(state, authenticated), + game_name: game_name.or_else(|| Some(format!("{}方洞挑战", config.theme_text))), + summary_text: summary, + tags_json, + cover_image_src, + compiled_at_micros: current_utc_micros(), + }) + .await + .map_err(|error| { + square_hole_error_response( + request_context, + SQUARE_HOLE_AGENT_PROVIDER, + map_square_hole_client_error(error), + ) + }) +} + +fn map_square_hole_agent_session_response( + session: SquareHoleAgentSessionRecord, +) -> SquareHoleSessionSnapshotResponse { + SquareHoleSessionSnapshotResponse { + session_id: session.session_id, + current_turn: session.current_turn, + progress_percent: session.progress_percent, + stage: session.stage.clone(), + anchor_pack: map_square_hole_anchor_pack_response_for_turn( + session.anchor_pack, + session.current_turn, + session.stage.as_str(), + ), + config: map_square_hole_config_response(session.config), + draft: session.draft.map(map_square_hole_draft_response), + messages: session + .messages + .into_iter() + .map(map_square_hole_message_response) + .collect(), + last_assistant_reply: session.last_assistant_reply, + published_profile_id: session.published_profile_id, + updated_at: session.updated_at, + } +} + +fn map_square_hole_anchor_pack_response_for_turn( + anchor: SquareHoleAnchorPackRecord, + current_turn: u32, + stage: &str, +) -> SquareHoleAnchorPackResponse { + let is_ready = matches!( + stage, + "ReadyToCompile" + | "ready_to_compile" + | "DraftCompiled" + | "draft_compiled" + | "draft_ready" + | "Published" + | "published" + ); + let collected_count = if is_ready { 4 } else { current_turn.min(4) }; + + SquareHoleAnchorPackResponse { + theme: map_square_hole_anchor_item_response_for_collected( + anchor.theme, + collected_count >= 1, + ), + twist_rule: map_square_hole_anchor_item_response_for_collected( + anchor.twist_rule, + collected_count >= 2, + ), + shape_count: map_square_hole_anchor_item_response_for_collected( + anchor.shape_count, + collected_count >= 3, + ), + difficulty: map_square_hole_anchor_item_response_for_collected( + anchor.difficulty, + collected_count >= 4, + ), + } +} + +fn map_square_hole_anchor_item_response( + anchor: SquareHoleAnchorItemRecord, +) -> SquareHoleAnchorItemResponse { + SquareHoleAnchorItemResponse { + key: anchor.key, + label: anchor.label, + value: anchor.value, + status: anchor.status, + } +} + +fn map_square_hole_anchor_item_response_for_collected( + anchor: SquareHoleAnchorItemRecord, + collected: bool, +) -> SquareHoleAnchorItemResponse { + if collected { + return map_square_hole_anchor_item_response(anchor); + } + + SquareHoleAnchorItemResponse { + key: anchor.key, + label: anchor.label, + value: String::new(), + status: "missing".to_string(), + } +} + +fn map_square_hole_config_response( + config: SquareHoleCreatorConfigRecord, +) -> SquareHoleCreatorConfigResponse { + SquareHoleCreatorConfigResponse { + theme_text: config.theme_text, + twist_rule: config.twist_rule, + shape_count: config.shape_count, + difficulty: config.difficulty, + } +} + +fn map_square_hole_draft_response( + draft: SquareHoleResultDraftRecord, +) -> SquareHoleResultDraftResponse { + SquareHoleResultDraftResponse { + profile_id: draft.profile_id, + game_name: draft.game_name, + theme_text: draft.theme_text, + twist_rule: draft.twist_rule, + summary: draft.summary, + tags: draft.tags, + shape_count: draft.shape_count, + difficulty: draft.difficulty, + publish_ready: draft.publish_ready, + blockers: draft.blockers, + } +} + +fn map_square_hole_message_response( + message: SquareHoleAgentMessageRecord, +) -> SquareHoleAgentMessageResponse { + SquareHoleAgentMessageResponse { + id: message.id, + role: message.role, + kind: message.kind, + text: message.text, + created_at: message.created_at, + } +} + +fn map_square_hole_work_summary_response( + item: SquareHoleWorkProfileRecord, +) -> SquareHoleWorkSummaryResponse { + SquareHoleWorkSummaryResponse { + work_id: item.work_id, + profile_id: item.profile_id, + owner_user_id: item.owner_user_id, + source_session_id: item.source_session_id, + game_name: item.game_name, + theme_text: item.theme_text, + twist_rule: item.twist_rule, + summary: item.summary, + tags: item.tags, + cover_image_src: item.cover_image_src, + shape_count: item.shape_count, + difficulty: item.difficulty, + publication_status: item.publication_status, + play_count: item.play_count, + updated_at: item.updated_at, + published_at: item.published_at, + publish_ready: item.publish_ready, + } +} + +fn map_square_hole_work_profile_response( + item: SquareHoleWorkProfileRecord, +) -> SquareHoleWorkProfileResponse { + SquareHoleWorkProfileResponse { + summary: map_square_hole_work_summary_response(item), + } +} + +fn map_square_hole_run_response(run: SquareHoleRunRecord) -> SquareHoleRunSnapshotResponse { + SquareHoleRunSnapshotResponse { + run_id: run.run_id, + profile_id: run.profile_id, + owner_user_id: run.owner_user_id, + status: normalize_square_hole_run_status(run.status.as_str()).to_string(), + snapshot_version: run.snapshot_version, + started_at_ms: run.started_at_ms, + duration_limit_ms: run.duration_limit_ms, + remaining_ms: run.remaining_ms, + total_shape_count: run.total_shape_count, + completed_shape_count: run.completed_shape_count, + combo: run.combo, + best_combo: run.best_combo, + score: run.score, + rule_label: run.rule_label, + current_shape: run.current_shape.map(map_square_hole_shape_response), + holes: run + .holes + .into_iter() + .map(map_square_hole_hole_response) + .collect(), + last_feedback: run.last_feedback.map(map_square_hole_feedback_response), + } +} + +fn map_square_hole_shape_response( + item: SquareHoleShapeSnapshotRecord, +) -> SquareHoleShapeSnapshotResponse { + SquareHoleShapeSnapshotResponse { + shape_id: item.shape_id, + shape_kind: item.shape_kind, + label: item.label, + color: item.color, + } +} + +fn map_square_hole_hole_response( + slot: SquareHoleHoleSnapshotRecord, +) -> SquareHoleHoleSnapshotResponse { + SquareHoleHoleSnapshotResponse { + hole_id: slot.hole_id, + hole_kind: slot.hole_kind, + label: slot.label, + x: slot.x, + y: slot.y, + } +} + +fn map_square_hole_feedback_response( + feedback: SquareHoleDropFeedbackRecord, +) -> SquareHoleDropFeedbackResponse { + SquareHoleDropFeedbackResponse { + accepted: feedback.accepted, + reject_reason: feedback.reject_reason, + message: feedback.message, + } +} + +fn build_config_from_create_request( + payload: &CreateSquareHoleSessionRequest, +) -> SquareHoleConfigJson { + SquareHoleConfigJson { + theme_text: payload + .theme_text + .as_deref() + .or(payload.seed_text.as_deref()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(SQUARE_HOLE_DEFAULT_THEME) + .to_string(), + twist_rule: payload + .twist_rule + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(SQUARE_HOLE_DEFAULT_TWIST_RULE) + .to_string(), + shape_count: payload + .shape_count + .unwrap_or(SQUARE_HOLE_DEFAULT_SHAPE_COUNT) + .max(1), + difficulty: payload + .difficulty + .unwrap_or(SQUARE_HOLE_DEFAULT_DIFFICULTY) + .clamp(1, 10), + } +} + +fn resolve_config_or_default( + config: Option<&SquareHoleCreatorConfigRecord>, +) -> SquareHoleConfigJson { + config + .map(|config| SquareHoleConfigJson { + theme_text: config.theme_text.clone(), + twist_rule: config.twist_rule.clone(), + shape_count: config.shape_count.max(1), + difficulty: config.difficulty.clamp(1, 10), + }) + .unwrap_or_else(|| SquareHoleConfigJson { + theme_text: SQUARE_HOLE_DEFAULT_THEME.to_string(), + twist_rule: SQUARE_HOLE_DEFAULT_TWIST_RULE.to_string(), + shape_count: SQUARE_HOLE_DEFAULT_SHAPE_COUNT, + difficulty: SQUARE_HOLE_DEFAULT_DIFFICULTY, + }) +} + +fn serialize_square_hole_config(config: &SquareHoleConfigJson) -> Option { + serde_json::to_string(config).ok() +} + +fn build_seed_text( + payload: &CreateSquareHoleSessionRequest, + config: &SquareHoleConfigJson, +) -> String { + payload + .seed_text + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) + .unwrap_or_else(|| { + format!( + "{}题材,{},{} 个形状,难度{}", + config.theme_text, config.twist_rule, config.shape_count, config.difficulty + ) + }) +} + +fn normalize_tags(tags: Vec) -> Vec { + let mut result = Vec::new(); + for tag in tags { + let trimmed = tag.trim(); + if !trimmed.is_empty() && !result.iter().any(|value| value == trimmed) { + result.push(trimmed.to_string()); + } + if result.len() >= 6 { + break; + } + } + result +} + +fn resolve_author_display_name( + state: &AppState, + authenticated: &AuthenticatedAccessToken, +) -> String { + state + .auth_user_service() + .get_user_by_id(authenticated.claims().user_id()) + .ok() + .flatten() + .map(|user| user.display_name) + .filter(|value| !value.trim().is_empty()) + .unwrap_or_else(|| "玩家".to_string()) +} + +fn normalize_square_hole_run_status(value: &str) -> &str { + match value { + "Running" | "running" => "running", + "Won" | "won" => "won", + "Failed" | "failed" => "failed", + "Stopped" | "stopped" => "stopped", + _ => value, + } +} + +fn ensure_non_empty( + request_context: &RequestContext, + provider: &str, + value: &str, + field_name: &str, +) -> Result<(), Response> { + if value.trim().is_empty() { + return Err(square_hole_bad_request( + request_context, + provider, + format!("{field_name} is required").as_str(), + )); + } + Ok(()) +} + +fn square_hole_json( + payload: Result, JsonRejection>, + request_context: &RequestContext, + provider: &str, +) -> Result, Response> { + payload.map_err(|error| { + square_hole_error_response( + request_context, + provider, + AppError::from_status(StatusCode::BAD_REQUEST).with_details(json!({ + "provider": provider, + "message": error.body_text(), + })), + ) + }) +} + +async fn extract_square_hole_response_error_message(response: Response) -> String { + let status = response.status(); + let body = match to_bytes(response.into_body(), 64 * 1024).await { + Ok(body) => body, + Err(_) => return format!("方洞挑战生成失败:{status}"), + }; + let body_text = String::from_utf8_lossy(&body).trim().to_string(); + if body_text.is_empty() { + return format!("方洞挑战生成失败:{status}"); + } + + if let Ok(body_json) = serde_json::from_str::(&body_text) + && let Some(message) = find_square_hole_error_message(&body_json) + { + return message; + } + + body_text +} + +fn find_square_hole_error_message(value: &Value) -> Option { + if let Some(message) = value + .get("details") + .and_then(|details| details.get("message")) + .and_then(Value::as_str) + .map(str::trim) + .filter(|message| !message.is_empty()) + { + return Some(message.to_string()); + } + + if let Some(message) = value + .get("message") + .and_then(Value::as_str) + .map(str::trim) + .filter(|message| !message.is_empty()) + { + return Some(message.to_string()); + } + + match value { + Value::Array(items) => items.iter().find_map(find_square_hole_error_message), + Value::Object(object) => object.values().find_map(find_square_hole_error_message), + _ => None, + } +} + +fn square_hole_bad_request( + request_context: &RequestContext, + provider: &str, + message: &str, +) -> Response { + square_hole_error_response( + request_context, + provider, + AppError::from_status(StatusCode::BAD_REQUEST).with_details(json!({ + "provider": provider, + "message": message, + })), + ) +} + +fn map_square_hole_client_error(error: SpacetimeClientError) -> AppError { + let status = match &error { + SpacetimeClientError::Runtime(_) => StatusCode::BAD_REQUEST, + SpacetimeClientError::Procedure(message) + if message.contains("不存在") + || message.contains("not found") + || message.contains("does not exist") => + { + StatusCode::NOT_FOUND + } + SpacetimeClientError::Procedure(message) + if message.contains("发布需要") + || message.contains("不能为空") + || message.contains("必须") => + { + StatusCode::BAD_REQUEST + } + _ => StatusCode::BAD_GATEWAY, + }; + + AppError::from_status(status).with_details(json!({ + "provider": "spacetimedb", + "message": error.to_string(), + })) +} + +fn square_hole_error_response( + request_context: &RequestContext, + provider: &str, + error: AppError, +) -> Response { + let mut response = error.into_response_with_context(Some(request_context)); + response.headers_mut().insert( + HeaderName::from_static("x-genarrative-provider"), + header::HeaderValue::from_str(provider) + .unwrap_or_else(|_| header::HeaderValue::from_static("square-hole")), + ); + response +} + +fn square_hole_sse_json_event(event_name: &str, payload: Value) -> Result { + Event::default() + .event(event_name) + .json_data(payload) + .map_err(|error| { + AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR).with_details(json!({ + "provider": "sse", + "message": format!("SSE payload 序列化失败:{error}"), + })) + }) +} + +fn square_hole_sse_json_event_or_error(event_name: &str, payload: Value) -> Event { + match square_hole_sse_json_event(event_name, payload) { + Ok(event) => event, + Err(error) => Event::default().event("error").data(format!("{error:?}")), + } +} + +fn current_utc_micros() -> i64 { + let duration = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default(); + (duration.as_secs() as i64) * 1_000_000 + i64::from(duration.subsec_micros()) +} + +fn current_utc_ms() -> i64 { + current_utc_micros().saturating_div(1000) +} diff --git a/server-rs/crates/api-server/src/square_hole_agent_turn.rs b/server-rs/crates/api-server/src/square_hole_agent_turn.rs new file mode 100644 index 00000000..961662ab --- /dev/null +++ b/server-rs/crates/api-server/src/square_hole_agent_turn.rs @@ -0,0 +1,307 @@ +use module_square_hole::{ + SQUARE_HOLE_MAX_DIFFICULTY, SQUARE_HOLE_MAX_SHAPE_COUNT, SQUARE_HOLE_MIN_DIFFICULTY, + SQUARE_HOLE_MIN_SHAPE_COUNT, +}; +use platform_llm::LlmClient; +use serde::{Deserialize, Serialize}; +use serde_json::Value as JsonValue; +use spacetime_client::{SquareHoleAgentMessageFinalizeRecordInput, SquareHoleAgentSessionRecord}; + +use crate::creation_agent_llm_turn::{ + CreationAgentLlmTurnErrorMessages, stream_creation_agent_json_turn, +}; +use crate::prompt::square_hole::{ + SQUARE_HOLE_AGENT_JSON_TURN_USER_PROMPT, SQUARE_HOLE_AGENT_SYSTEM_PROMPT, + build_square_hole_agent_prompt, +}; + +#[derive(Clone, Debug)] +pub(crate) struct SquareHoleAgentTurnRequest<'a> { + pub llm_client: Option<&'a LlmClient>, + pub session: &'a SquareHoleAgentSessionRecord, + pub quick_fill_requested: bool, + pub enable_web_search: bool, +} + +#[derive(Clone, Debug)] +pub(crate) struct SquareHoleAgentTurnResult { + pub assistant_reply_text: String, + pub stage: String, + pub progress_percent: u32, + pub config_json: String, + pub error_message: Option, +} + +#[derive(Clone, Debug)] +pub(crate) struct SquareHoleAgentTurnError { + message: String, +} + +impl SquareHoleAgentTurnError { + fn new(message: impl Into) -> Self { + Self { + message: message.into(), + } + } +} + +impl std::fmt::Display for SquareHoleAgentTurnError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str(&self.message) + } +} + +impl std::error::Error for SquareHoleAgentTurnError {} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleAgentModelOutput { + reply_text: String, + progress_percent: u32, + next_config: SquareHoleAgentConfigOutput, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleAgentConfigOutput { + theme_text: String, + twist_rule: String, + shape_count: u32, + difficulty: u32, +} + +pub(crate) async fn run_square_hole_agent_turn( + request: SquareHoleAgentTurnRequest<'_>, + on_reply_update: F, +) -> Result +where + F: FnMut(&str), +{ + let prompt = build_square_hole_agent_prompt(request.session, request.quick_fill_requested); + let turn_output = stream_creation_agent_json_turn( + request.llm_client, + format!("{SQUARE_HOLE_AGENT_SYSTEM_PROMPT}\n\n{prompt}"), + SQUARE_HOLE_AGENT_JSON_TURN_USER_PROMPT, + request.enable_web_search, + CreationAgentLlmTurnErrorMessages { + model_unavailable: "当前模型不可用,请稍后重试。", + generation_failed: "方洞挑战聊天生成失败,请稍后重试。", + parse_failed: "方洞挑战聊天结果解析失败,请稍后重试。", + }, + on_reply_update, + SquareHoleAgentTurnError::new, + ) + .await?; + let output = parse_model_output(&turn_output.parsed, request.session)?; + let progress_percent = if request.quick_fill_requested { + 100 + } else { + output.progress_percent.min(100) + }; + + Ok(SquareHoleAgentTurnResult { + assistant_reply_text: output.reply_text, + stage: resolve_stage(progress_percent), + progress_percent, + config_json: serde_json::to_string(&output.next_config) + .map_err(|_| SquareHoleAgentTurnError::new("方洞挑战配置序列化失败。"))?, + error_message: None, + }) +} + +pub(crate) fn build_finalize_record_input( + session_id: String, + owner_user_id: String, + assistant_message_id: String, + result: SquareHoleAgentTurnResult, + updated_at_micros: i64, +) -> SquareHoleAgentMessageFinalizeRecordInput { + SquareHoleAgentMessageFinalizeRecordInput { + session_id, + owner_user_id, + assistant_message_id: Some(assistant_message_id), + assistant_reply_text: Some(result.assistant_reply_text), + config_json: Some(result.config_json), + progress_percent: result.progress_percent, + stage: result.stage, + updated_at_micros, + error_message: result.error_message, + } +} + +fn parse_model_output( + parsed: &JsonValue, + session: &SquareHoleAgentSessionRecord, +) -> Result { + let reply_text = parsed + .get("replyText") + .and_then(JsonValue::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| SquareHoleAgentTurnError::new("方洞挑战聊天结果缺少有效回复,请稍后重试。"))? + .to_string(); + let progress_percent = parsed + .get("progressPercent") + .and_then(JsonValue::as_u64) + .map(|value| value.min(100) as u32) + .unwrap_or(session.progress_percent); + let next_config_value = parsed + .get("nextConfig") + .ok_or_else(|| SquareHoleAgentTurnError::new("方洞挑战聊天结果缺少 nextConfig。"))?; + let next_config = parse_model_config(next_config_value, session)?; + Ok(SquareHoleAgentModelOutput { + reply_text, + progress_percent, + next_config, + }) +} + +fn parse_model_config( + value: &JsonValue, + session: &SquareHoleAgentSessionRecord, +) -> Result { + if !value.is_object() { + return Err(SquareHoleAgentTurnError::new( + "方洞挑战聊天结果中的 nextConfig 必须是对象。", + )); + } + + Ok(SquareHoleAgentConfigOutput { + theme_text: read_text_field(value, "themeText") + .unwrap_or_else(|| session.config.theme_text.clone()), + twist_rule: read_text_field(value, "twistRule") + .unwrap_or_else(|| session.config.twist_rule.clone()), + shape_count: read_u32_field(value, "shapeCount") + .unwrap_or(session.config.shape_count) + .clamp(SQUARE_HOLE_MIN_SHAPE_COUNT, SQUARE_HOLE_MAX_SHAPE_COUNT), + difficulty: read_u32_field(value, "difficulty") + .unwrap_or(session.config.difficulty) + .clamp(SQUARE_HOLE_MIN_DIFFICULTY, SQUARE_HOLE_MAX_DIFFICULTY), + }) +} + +fn read_text_field(value: &JsonValue, field_name: &str) -> Option { + value + .get(field_name) + .and_then(JsonValue::as_str) + .map(str::trim) + .filter(|text| !text.is_empty()) + .map(str::to_string) +} + +fn read_u32_field(value: &JsonValue, field_name: &str) -> Option { + value + .get(field_name) + .and_then(JsonValue::as_u64) + .and_then(|number| u32::try_from(number).ok()) +} + +fn resolve_stage(progress_percent: u32) -> String { + if progress_percent >= 100 { + "ReadyToCompile" + } else { + "Collecting" + } + .to_string() +} + +#[cfg(test)] +mod tests { + use serde_json::json; + + use super::{parse_model_output, resolve_stage}; + + fn session_record() -> spacetime_client::SquareHoleAgentSessionRecord { + spacetime_client::SquareHoleAgentSessionRecord { + session_id: "square-hole-session-test".to_string(), + current_turn: 1, + progress_percent: 25, + stage: "collecting_config".to_string(), + anchor_pack: spacetime_client::SquareHoleAnchorPackRecord { + theme: anchor("theme", "题材主题", "纸箱"), + twist_rule: anchor("twistRule", "反差规则", "方洞万能"), + shape_count: anchor("shapeCount", "形状数量", "12"), + difficulty: anchor("difficulty", "难度", "4"), + }, + config: spacetime_client::SquareHoleCreatorConfigRecord { + theme_text: "纸箱".to_string(), + twist_rule: "方洞万能".to_string(), + shape_count: 12, + difficulty: 4, + }, + draft: None, + messages: Vec::new(), + last_assistant_reply: None, + published_profile_id: None, + updated_at: "2026-05-04T10:00:00.000Z".to_string(), + } + } + + fn anchor(key: &str, label: &str, value: &str) -> spacetime_client::SquareHoleAnchorItemRecord { + spacetime_client::SquareHoleAnchorItemRecord { + key: key.to_string(), + label: label.to_string(), + value: value.to_string(), + status: if value.is_empty() { + "missing" + } else { + "confirmed" + } + .to_string(), + } + } + + #[test] + fn parse_model_output_accepts_camel_case_config_contract() { + let model_output = json!({ + "replyText": "可以,把办公室文具都做成会被方洞吞进去的挑战。", + "progressPercent": 86, + "nextConfig": { + "themeText": "办公室文具", + "twistRule": "所有文具最终都优先进入方洞", + "shapeCount": 14, + "difficulty": 6 + } + }); + + let output = + parse_model_output(&model_output, &session_record()).expect("模型输出应能解析"); + + assert_eq!( + output.reply_text, + "可以,把办公室文具都做成会被方洞吞进去的挑战。" + ); + assert_eq!(output.progress_percent, 86); + assert_eq!(output.next_config.theme_text, "办公室文具"); + assert_eq!(output.next_config.twist_rule, "所有文具最终都优先进入方洞"); + assert_eq!(output.next_config.shape_count, 14); + assert_eq!(output.next_config.difficulty, 6); + } + + #[test] + fn parse_model_output_clamps_numeric_config() { + let model_output = json!({ + "replyText": "我先把数字压到可试玩范围里。", + "progressPercent": 120, + "nextConfig": { + "themeText": "霓虹积木", + "twistRule": "方洞优先", + "shapeCount": 99, + "difficulty": 0 + } + }); + + let output = + parse_model_output(&model_output, &session_record()).expect("模型输出应能解析"); + + assert_eq!(output.progress_percent, 100); + assert_eq!(output.next_config.shape_count, 24); + assert_eq!(output.next_config.difficulty, 1); + } + + #[test] + fn resolve_stage_switches_to_compile_only_at_complete_progress() { + assert_eq!(resolve_stage(99), "Collecting"); + assert_eq!(resolve_stage(100), "ReadyToCompile"); + } +} diff --git a/server-rs/crates/module-square-hole/Cargo.toml b/server-rs/crates/module-square-hole/Cargo.toml new file mode 100644 index 00000000..4d9c8e23 --- /dev/null +++ b/server-rs/crates/module-square-hole/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "module-square-hole" +edition.workspace = true +version.workspace = true +license.workspace = true + +[features] +default = [] +spacetime-types = ["dep:spacetimedb"] + +[dependencies] +serde = { version = "1", features = ["derive"] } +shared-kernel = { path = "../shared-kernel" } +spacetimedb = { workspace = true, optional = true } diff --git a/server-rs/crates/module-square-hole/src/application.rs b/server-rs/crates/module-square-hole/src/application.rs new file mode 100644 index 00000000..a8693f12 --- /dev/null +++ b/server-rs/crates/module-square-hole/src/application.rs @@ -0,0 +1,456 @@ +use shared_kernel::{normalize_optional_string, normalize_required_string, normalize_string_list}; + +use crate::commands::{default_tags_for_theme, validate_publish_requirements}; +use crate::{ + SQUARE_HOLE_DEFAULT_DURATION_LIMIT_MS, SQUARE_HOLE_MAX_DIFFICULTY, SQUARE_HOLE_MIN_DIFFICULTY, + SquareHoleCreatorConfig, SquareHoleDropConfirmation, SquareHoleDropFeedback, + SquareHoleDropInput, SquareHoleDropRejectReason, SquareHoleError, SquareHoleHoleSnapshot, + SquareHolePublicationStatus, SquareHoleResultDraft, SquareHoleRunSnapshot, SquareHoleRunStatus, + SquareHoleShapeSnapshot, SquareHoleWorkProfile, +}; + +pub fn compile_result_draft( + profile_id: String, + config: &SquareHoleCreatorConfig, +) -> SquareHoleResultDraft { + let game_name = format!("{}方洞挑战", config.theme_text); + let summary = format!( + "{}主题,{} 个形状,难度 {},真实规则:{}。", + config.theme_text, config.shape_count, config.difficulty, config.twist_rule + ); + let mut draft = SquareHoleResultDraft { + profile_id, + game_name, + theme_text: config.theme_text.clone(), + twist_rule: config.twist_rule.clone(), + summary, + tags: default_tags_for_theme(&config.theme_text), + shape_count: config.shape_count, + difficulty: config.difficulty, + publish_ready: false, + blockers: Vec::new(), + }; + draft.blockers = validate_publish_requirements(&draft); + draft.publish_ready = draft.blockers.is_empty(); + draft +} + +pub fn create_work_profile( + work_id: String, + profile_id: String, + owner_user_id: String, + source_session_id: Option, + draft: &SquareHoleResultDraft, + updated_at_micros: i64, +) -> Result { + let work_id = normalize_required_string(work_id).ok_or(SquareHoleError::MissingText)?; + let profile_id = + normalize_required_string(profile_id).ok_or(SquareHoleError::MissingProfileId)?; + let owner_user_id = + normalize_required_string(owner_user_id).ok_or(SquareHoleError::MissingOwnerUserId)?; + + Ok(SquareHoleWorkProfile { + work_id, + profile_id, + owner_user_id, + source_session_id: normalize_optional_string(source_session_id), + game_name: draft.game_name.clone(), + theme_text: draft.theme_text.clone(), + twist_rule: draft.twist_rule.clone(), + summary: draft.summary.clone(), + tags: normalize_string_list(draft.tags.clone()), + cover_image_src: None, + shape_count: draft.shape_count, + difficulty: draft.difficulty, + publication_status: SquareHolePublicationStatus::Draft, + play_count: 0, + updated_at_micros, + published_at_micros: None, + }) +} + +pub fn publish_work_profile( + profile: &SquareHoleWorkProfile, + published_at_micros: i64, +) -> Result { + if profile.shape_count == 0 { + return Err(SquareHoleError::InvalidShapeCount); + } + if !(SQUARE_HOLE_MIN_DIFFICULTY..=SQUARE_HOLE_MAX_DIFFICULTY).contains(&profile.difficulty) { + return Err(SquareHoleError::InvalidDifficulty); + } + + let mut next = profile.clone(); + next.publication_status = SquareHolePublicationStatus::Published; + next.updated_at_micros = published_at_micros; + next.published_at_micros = Some(published_at_micros); + Ok(next) +} + +pub fn start_run_at( + run_id: String, + owner_user_id: String, + profile_id: String, + config: &SquareHoleCreatorConfig, + started_at_ms: u64, +) -> Result { + let run_id = normalize_required_string(run_id).ok_or(SquareHoleError::MissingRunId)?; + let owner_user_id = + normalize_required_string(owner_user_id).ok_or(SquareHoleError::MissingOwnerUserId)?; + let profile_id = + normalize_required_string(profile_id).ok_or(SquareHoleError::MissingProfileId)?; + + Ok(SquareHoleRunSnapshot { + run_id, + profile_id, + owner_user_id, + status: SquareHoleRunStatus::Running, + snapshot_version: 1, + started_at_ms, + duration_limit_ms: SQUARE_HOLE_DEFAULT_DURATION_LIMIT_MS, + remaining_ms: SQUARE_HOLE_DEFAULT_DURATION_LIMIT_MS, + total_shape_count: config.shape_count, + completed_shape_count: 0, + combo: 0, + best_combo: 0, + score: 0, + rule_label: config.twist_rule.clone(), + current_shape: Some(build_shape_at(0, config.shape_count)), + holes: default_holes(), + last_feedback: None, + }) +} + +pub fn confirm_drop_at( + run: &SquareHoleRunSnapshot, + input: &SquareHoleDropInput, +) -> Result { + let hole_id = + normalize_required_string(&input.hole_id).ok_or(SquareHoleError::MissingHoleId)?; + let mut next = resolve_run_timer_at(run, input.dropped_at_ms); + if next.status != SquareHoleRunStatus::Running { + return Ok(rejected(next, SquareHoleDropRejectReason::RunNotActive)); + } + if input.client_snapshot_version != next.snapshot_version { + return Ok(rejected( + next, + SquareHoleDropRejectReason::SnapshotVersionMismatch, + )); + } + + let Some(hole) = next.holes.iter().find(|item| item.hole_id == hole_id) else { + return Ok(rejected(next, SquareHoleDropRejectReason::HoleNotFound)); + }; + let Some(shape) = next.current_shape.clone() else { + return Ok(rejected(next, SquareHoleDropRejectReason::Incompatible)); + }; + + if !is_shape_accepted_by_hole(&shape, hole) { + next.combo = 0; + next.snapshot_version = next.snapshot_version.saturating_add(1); + return Ok(rejected(next, SquareHoleDropRejectReason::Incompatible)); + } + + let message = format!("{}进入{}", shape.label, hole.label); + let feedback = SquareHoleDropFeedback { + accepted: true, + reject_reason: None, + message, + }; + next.completed_shape_count = next.completed_shape_count.saturating_add(1); + next.combo = next.combo.saturating_add(1); + next.best_combo = next.best_combo.max(next.combo); + next.score = next.score.saturating_add(100 + next.combo * 10); + next.current_shape = if next.completed_shape_count >= next.total_shape_count { + next.status = SquareHoleRunStatus::Won; + None + } else { + Some(build_shape_at( + next.completed_shape_count, + next.total_shape_count, + )) + }; + next.snapshot_version = next.snapshot_version.saturating_add(1); + next.last_feedback = Some(feedback.clone()); + + Ok(SquareHoleDropConfirmation { + feedback, + run: next, + }) +} + +pub fn resolve_run_timer_at(run: &SquareHoleRunSnapshot, now_ms: u64) -> SquareHoleRunSnapshot { + let mut next = run.clone(); + if next.status != SquareHoleRunStatus::Running { + return next; + } + let elapsed_ms = now_ms.saturating_sub(next.started_at_ms); + next.remaining_ms = next.duration_limit_ms.saturating_sub(elapsed_ms); + if next.remaining_ms == 0 { + let feedback = SquareHoleDropFeedback { + accepted: false, + reject_reason: Some(SquareHoleDropRejectReason::TimeUp), + message: "时间到".to_string(), + }; + next.status = SquareHoleRunStatus::Failed; + next.combo = 0; + next.current_shape = None; + next.last_feedback = Some(feedback); + next.snapshot_version = next.snapshot_version.saturating_add(1); + } + next +} + +pub fn stop_run_at(run: &SquareHoleRunSnapshot) -> SquareHoleRunSnapshot { + let mut next = run.clone(); + if next.status == SquareHoleRunStatus::Running { + next.status = SquareHoleRunStatus::Stopped; + next.combo = 0; + next.snapshot_version = next.snapshot_version.saturating_add(1); + next.last_feedback = Some(SquareHoleDropFeedback { + accepted: false, + reject_reason: Some(SquareHoleDropRejectReason::RunNotActive), + message: "已退出本局".to_string(), + }); + } + next +} + +pub fn build_shape_at(index: u32, total: u32) -> SquareHoleShapeSnapshot { + let kind = if index + 1 == total { + "square" + } else if index % 4 == 0 { + "circle" + } else if index % 4 == 1 { + "triangle" + } else if index % 4 == 2 { + "diamond" + } else { + "star" + }; + + SquareHoleShapeSnapshot { + shape_id: format!("square-hole-shape-{index:03}"), + shape_kind: kind.to_string(), + label: match kind { + "square" => "方块", + "circle" => "圆块", + "triangle" => "三角块", + "diamond" => "菱形块", + _ => "星形块", + } + .to_string(), + color: match kind { + "square" => "#facc15", + "circle" => "#22c55e", + "triangle" => "#38bdf8", + "diamond" => "#fb7185", + _ => "#c084fc", + } + .to_string(), + } +} + +pub fn default_holes() -> Vec { + vec![ + SquareHoleHoleSnapshot { + hole_id: "square-hole".to_string(), + hole_kind: "square".to_string(), + label: "方洞".to_string(), + x: 0.5, + y: 0.28, + }, + SquareHoleHoleSnapshot { + hole_id: "circle-hole".to_string(), + hole_kind: "circle".to_string(), + label: "圆洞".to_string(), + x: 0.24, + y: 0.54, + }, + SquareHoleHoleSnapshot { + hole_id: "triangle-hole".to_string(), + hole_kind: "triangle".to_string(), + label: "三角洞".to_string(), + x: 0.76, + y: 0.54, + }, + ] +} + +fn is_shape_accepted_by_hole( + shape: &SquareHoleShapeSnapshot, + hole: &SquareHoleHoleSnapshot, +) -> bool { + // 中文注释:首版核心反差固定为“方洞万能”,保留同形状洞口兼容便于后续扩展规则。 + hole.hole_kind == "square" || hole.hole_kind == shape.shape_kind +} + +fn rejected( + mut run: SquareHoleRunSnapshot, + reject_reason: SquareHoleDropRejectReason, +) -> SquareHoleDropConfirmation { + let message = match reject_reason { + SquareHoleDropRejectReason::RunNotActive => "当前局已结束", + SquareHoleDropRejectReason::SnapshotVersionMismatch => "操作慢了一步", + SquareHoleDropRejectReason::HoleNotFound => "洞口不存在", + SquareHoleDropRejectReason::Incompatible => "这个洞不对", + SquareHoleDropRejectReason::TimeUp => "时间到", + } + .to_string(); + let feedback = SquareHoleDropFeedback { + accepted: false, + reject_reason: Some(reject_reason), + message, + }; + run.last_feedback = Some(feedback.clone()); + SquareHoleDropConfirmation { feedback, run } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::commands::build_creator_config; + + fn test_config(shape_count: u32) -> SquareHoleCreatorConfig { + build_creator_config("玩具", "方洞万能", shape_count, 4).expect("config should be valid") + } + + #[test] + fn draft_is_publishable_with_required_fields() { + let draft = compile_result_draft("profile-1".to_string(), &test_config(8)); + + assert!(draft.publish_ready); + assert!(draft.blockers.is_empty()); + assert!(draft.tags.contains(&"方洞挑战".to_string())); + } + + #[test] + fn run_starts_with_current_shape_and_default_holes() { + let run = start_run_at( + "run-1".to_string(), + "user-1".to_string(), + "profile-1".to_string(), + &test_config(8), + 1_000, + ) + .expect("run should start"); + + assert_eq!(run.status, SquareHoleRunStatus::Running); + assert!(run.current_shape.is_some()); + assert_eq!(run.holes.len(), 3); + } + + #[test] + fn square_hole_accepts_non_square_shape() { + let run = start_run_at( + "run-1".to_string(), + "user-1".to_string(), + "profile-1".to_string(), + &test_config(8), + 1_000, + ) + .expect("run should start"); + let result = confirm_drop_at( + &run, + &SquareHoleDropInput { + run_id: run.run_id.clone(), + owner_user_id: run.owner_user_id.clone(), + hole_id: "square-hole".to_string(), + client_snapshot_version: run.snapshot_version, + client_event_id: "event-1".to_string(), + dropped_at_ms: 1_100, + }, + ) + .expect("drop should resolve"); + + assert!(result.feedback.accepted); + assert_eq!(result.run.completed_shape_count, 1); + assert_eq!(result.run.combo, 1); + } + + #[test] + fn wrong_non_square_hole_rejects_and_resets_combo() { + let mut run = start_run_at( + "run-1".to_string(), + "user-1".to_string(), + "profile-1".to_string(), + &test_config(8), + 1_000, + ) + .expect("run should start"); + run.current_shape = Some(build_shape_at(1, 8)); + run.combo = 2; + + let result = confirm_drop_at( + &run, + &SquareHoleDropInput { + run_id: run.run_id.clone(), + owner_user_id: run.owner_user_id.clone(), + hole_id: "circle-hole".to_string(), + client_snapshot_version: run.snapshot_version, + client_event_id: "event-1".to_string(), + dropped_at_ms: 1_100, + }, + ) + .expect("drop should resolve"); + + assert!(!result.feedback.accepted); + assert_eq!( + result.feedback.reject_reason, + Some(SquareHoleDropRejectReason::Incompatible) + ); + assert_eq!(result.run.combo, 0); + } + + #[test] + fn last_shape_win_finishes_run() { + let mut run = start_run_at( + "run-1".to_string(), + "user-1".to_string(), + "profile-1".to_string(), + &test_config(6), + 1_000, + ) + .expect("run should start"); + run.completed_shape_count = 5; + run.current_shape = Some(build_shape_at(5, 6)); + + let result = confirm_drop_at( + &run, + &SquareHoleDropInput { + run_id: run.run_id.clone(), + owner_user_id: run.owner_user_id.clone(), + hole_id: "square-hole".to_string(), + client_snapshot_version: run.snapshot_version, + client_event_id: "event-1".to_string(), + dropped_at_ms: 1_100, + }, + ) + .expect("drop should resolve"); + + assert_eq!(result.run.status, SquareHoleRunStatus::Won); + assert!(result.run.current_shape.is_none()); + } + + #[test] + fn timer_expiration_fails_running_run() { + let run = start_run_at( + "run-1".to_string(), + "user-1".to_string(), + "profile-1".to_string(), + &test_config(8), + 1_000, + ) + .expect("run should start"); + + let expired = resolve_run_timer_at(&run, 1_000 + SQUARE_HOLE_DEFAULT_DURATION_LIMIT_MS); + + assert_eq!(expired.status, SquareHoleRunStatus::Failed); + assert_eq!( + expired + .last_feedback + .and_then(|feedback| feedback.reject_reason), + Some(SquareHoleDropRejectReason::TimeUp) + ); + } +} diff --git a/server-rs/crates/module-square-hole/src/commands.rs b/server-rs/crates/module-square-hole/src/commands.rs new file mode 100644 index 00000000..0686e363 --- /dev/null +++ b/server-rs/crates/module-square-hole/src/commands.rs @@ -0,0 +1,116 @@ +use shared_kernel::{normalize_required_string, normalize_string_list}; + +use crate::{ + SQUARE_HOLE_MAX_DIFFICULTY, SQUARE_HOLE_MAX_SHAPE_COUNT, SQUARE_HOLE_MIN_DIFFICULTY, + SQUARE_HOLE_MIN_SHAPE_COUNT, SquareHoleCreatorConfig, SquareHoleError, SquareHoleResultDraft, +}; + +pub fn validate_shape_count(value: u32) -> Result { + if (SQUARE_HOLE_MIN_SHAPE_COUNT..=SQUARE_HOLE_MAX_SHAPE_COUNT).contains(&value) { + Ok(value) + } else { + Err(SquareHoleError::InvalidShapeCount) + } +} + +pub fn validate_difficulty(value: u32) -> Result { + if (SQUARE_HOLE_MIN_DIFFICULTY..=SQUARE_HOLE_MAX_DIFFICULTY).contains(&value) { + Ok(value) + } else { + Err(SquareHoleError::InvalidDifficulty) + } +} + +pub fn normalize_theme_text(value: impl AsRef) -> Result { + normalize_required_string(value).ok_or(SquareHoleError::MissingText) +} + +pub fn build_creator_config( + theme_text: &str, + twist_rule: &str, + shape_count: u32, + difficulty: u32, +) -> Result { + Ok(SquareHoleCreatorConfig { + theme_text: normalize_theme_text(theme_text)?, + twist_rule: normalize_required_string(twist_rule).ok_or(SquareHoleError::MissingText)?, + shape_count: validate_shape_count(shape_count)?, + difficulty: validate_difficulty(difficulty)?, + }) +} + +pub fn build_default_tags(theme_text: &str) -> Vec { + normalize_string_list(vec![ + "方洞挑战".to_string(), + theme_text.to_string(), + "反直觉".to_string(), + ]) +} + +pub fn default_tags_for_theme(theme_text: &str) -> Vec { + let mut tags = vec![ + "方洞挑战".to_string(), + "反直觉".to_string(), + theme_text.to_string(), + ]; + tags.sort(); + tags.dedup(); + tags +} + +pub fn validate_publish_requirements(draft: &SquareHoleResultDraft) -> Vec { + let mut blockers = Vec::new(); + if normalize_required_string(&draft.game_name).is_none() { + blockers.push("游戏名称不能为空".to_string()); + } + if normalize_required_string(&draft.summary).is_none() { + blockers.push("简介不能为空".to_string()); + } + if normalize_required_string(&draft.theme_text).is_none() { + blockers.push("题材不能为空".to_string()); + } + if normalize_required_string(&draft.twist_rule).is_none() { + blockers.push("反直觉规则不能为空".to_string()); + } + if normalize_string_list(draft.tags.clone()).is_empty() { + blockers.push("至少需要 1 个标签".to_string()); + } + if validate_shape_count(draft.shape_count).is_err() { + blockers.push(format!( + "形状数量必须在 {} 到 {} 之间", + SQUARE_HOLE_MIN_SHAPE_COUNT, SQUARE_HOLE_MAX_SHAPE_COUNT + )); + } + if validate_difficulty(draft.difficulty).is_err() { + blockers.push("难度必须在 1 到 10 之间".to_string()); + } + blockers +} + +#[deprecated(note = "请使用 compile_result_draft(profile_id, &config)")] +pub fn build_result_draft( + profile_id: String, + theme_text: String, + twist_rule: String, + shape_count: u32, + difficulty: u32, +) -> SquareHoleResultDraft { + let game_name = format!("{theme_text}方洞挑战"); + let summary = format!( + "{theme_text}主题,{} 个形状,难度 {},规则:{twist_rule}", + shape_count, difficulty + ); + let blockers = Vec::new(); + SquareHoleResultDraft { + profile_id, + game_name, + theme_text, + twist_rule, + summary, + tags: build_default_tags("方洞挑战"), + shape_count, + difficulty, + publish_ready: true, + blockers, + } +} diff --git a/server-rs/crates/module-square-hole/src/domain.rs b/server-rs/crates/module-square-hole/src/domain.rs new file mode 100644 index 00000000..9abe5a4a --- /dev/null +++ b/server-rs/crates/module-square-hole/src/domain.rs @@ -0,0 +1,204 @@ +use serde::{Deserialize, Serialize}; +#[cfg(feature = "spacetime-types")] +use spacetimedb::SpacetimeType; + +pub const SQUARE_HOLE_SESSION_ID_PREFIX: &str = "square-hole-session-"; +pub const SQUARE_HOLE_MESSAGE_ID_PREFIX: &str = "square-hole-message-"; +pub const SQUARE_HOLE_PROFILE_ID_PREFIX: &str = "square-hole-profile-"; +pub const SQUARE_HOLE_WORK_ID_PREFIX: &str = "square-hole-work-"; +pub const SQUARE_HOLE_RUN_ID_PREFIX: &str = "square-hole-run-"; +pub const SQUARE_HOLE_MIN_SHAPE_COUNT: u32 = 6; +pub const SQUARE_HOLE_MAX_SHAPE_COUNT: u32 = 24; +pub const SQUARE_HOLE_MIN_DIFFICULTY: u32 = 1; +pub const SQUARE_HOLE_MAX_DIFFICULTY: u32 = 10; +pub const SQUARE_HOLE_DEFAULT_DURATION_LIMIT_MS: u64 = 60_000; + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum SquareHoleCreationStage { + CollectingConfig, + DraftReady, + ReadyToPublish, + Published, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum SquareHolePublicationStatus { + Draft, + Published, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum SquareHoleRunStatus { + Running, + Won, + Failed, + Stopped, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum SquareHoleDropRejectReason { + RunNotActive, + SnapshotVersionMismatch, + HoleNotFound, + Incompatible, + TimeUp, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct SquareHoleCreatorConfig { + pub theme_text: String, + pub twist_rule: String, + pub shape_count: u32, + pub difficulty: u32, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct SquareHoleResultDraft { + pub profile_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + pub shape_count: u32, + pub difficulty: u32, + pub publish_ready: bool, + pub blockers: Vec, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct SquareHoleWorkProfile { + pub work_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub source_session_id: Option, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + pub cover_image_src: Option, + pub shape_count: u32, + pub difficulty: u32, + pub publication_status: SquareHolePublicationStatus, + pub play_count: u32, + pub updated_at_micros: i64, + pub published_at_micros: Option, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct SquareHoleShapeSnapshot { + pub shape_id: String, + pub shape_kind: String, + pub label: String, + pub color: String, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct SquareHoleHoleSnapshot { + pub hole_id: String, + pub hole_kind: String, + pub label: String, + pub x: f32, + pub y: f32, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct SquareHoleDropFeedback { + pub accepted: bool, + pub reject_reason: Option, + pub message: String, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct SquareHoleRunSnapshot { + pub run_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub status: SquareHoleRunStatus, + pub snapshot_version: u64, + pub started_at_ms: u64, + pub duration_limit_ms: u64, + pub remaining_ms: u64, + pub total_shape_count: u32, + pub completed_shape_count: u32, + pub combo: u32, + pub best_combo: u32, + pub score: u32, + pub rule_label: String, + pub current_shape: Option, + pub holes: Vec, + pub last_feedback: Option, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct SquareHoleDropInput { + pub run_id: String, + pub owner_user_id: String, + pub hole_id: String, + pub client_snapshot_version: u64, + pub client_event_id: String, + pub dropped_at_ms: u64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct SquareHoleDropConfirmation { + pub feedback: SquareHoleDropFeedback, + pub run: SquareHoleRunSnapshot, +} + +impl SquareHoleCreationStage { + pub fn as_str(self) -> &'static str { + match self { + Self::CollectingConfig => "collecting_config", + Self::DraftReady => "draft_ready", + Self::ReadyToPublish => "ready_to_publish", + Self::Published => "published", + } + } +} + +impl SquareHolePublicationStatus { + pub fn as_str(self) -> &'static str { + match self { + Self::Draft => "draft", + Self::Published => "published", + } + } +} + +impl SquareHoleRunStatus { + pub fn as_str(self) -> &'static str { + match self { + Self::Running => "running", + Self::Won => "won", + Self::Failed => "failed", + Self::Stopped => "stopped", + } + } +} + +impl SquareHoleDropRejectReason { + pub fn as_str(self) -> &'static str { + match self { + Self::RunNotActive => "run_not_active", + Self::SnapshotVersionMismatch => "snapshot_version_mismatch", + Self::HoleNotFound => "hole_not_found", + Self::Incompatible => "incompatible", + Self::TimeUp => "time_up", + } + } +} diff --git a/server-rs/crates/module-square-hole/src/errors.rs b/server-rs/crates/module-square-hole/src/errors.rs new file mode 100644 index 00000000..42abcaa1 --- /dev/null +++ b/server-rs/crates/module-square-hole/src/errors.rs @@ -0,0 +1,37 @@ +use std::fmt::{self, Display}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum SquareHoleError { + MissingText, + MissingOwnerUserId, + InvalidShapeCount, + InvalidDifficulty, + MissingProfileId, + MissingRunId, + MissingHoleId, + RunNotActive, + SnapshotVersionMismatch, + HoleNotFound, + Incompatible, +} + +impl Display for SquareHoleError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let message = match self { + Self::MissingText => "文本不能为空", + Self::MissingOwnerUserId => "owner_user_id 缺失", + Self::InvalidShapeCount => "形状数量必须在 6 到 24 之间", + Self::InvalidDifficulty => "难度必须在 1 到 10 之间", + Self::MissingProfileId => "缺少 profileId", + Self::MissingRunId => "缺少 runId", + Self::MissingHoleId => "缺少 holeId", + Self::RunNotActive => "当前运行态未激活", + Self::SnapshotVersionMismatch => "快照版本不一致", + Self::HoleNotFound => "洞口不存在", + Self::Incompatible => "当前形状不能投入这个洞口", + }; + write!(f, "{message}") + } +} + +impl std::error::Error for SquareHoleError {} diff --git a/server-rs/crates/module-square-hole/src/events.rs b/server-rs/crates/module-square-hole/src/events.rs new file mode 100644 index 00000000..bdfb9f94 --- /dev/null +++ b/server-rs/crates/module-square-hole/src/events.rs @@ -0,0 +1,25 @@ +//! 方洞挑战领域事件。 +//! +//! 事件只表达已经发生的领域事实,是否持久化、投影或通知前端由 +//! SpacetimeDB adapter 与 BFF 编排层决定。 + +/// 方洞挑战领域事件。 +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum SquareHoleDomainEvent { + DraftCompiled { + profile_id: String, + owner_user_id: String, + occurred_at_micros: i64, + }, + WorkPublished { + profile_id: String, + owner_user_id: String, + occurred_at_micros: i64, + }, + RunSettled { + run_id: String, + owner_user_id: String, + status: String, + occurred_at_micros: i64, + }, +} diff --git a/server-rs/crates/module-square-hole/src/lib.rs b/server-rs/crates/module-square-hole/src/lib.rs new file mode 100644 index 00000000..6acdc7c7 --- /dev/null +++ b/server-rs/crates/module-square-hole/src/lib.rs @@ -0,0 +1,11 @@ +mod application; +mod commands; +mod domain; +mod errors; +mod events; + +pub use application::*; +pub use commands::*; +pub use domain::*; +pub use errors::*; +pub use events::*; diff --git a/server-rs/crates/shared-contracts/src/lib.rs b/server-rs/crates/shared-contracts/src/lib.rs index e71ba254..e9d08daa 100644 --- a/server-rs/crates/shared-contracts/src/lib.rs +++ b/server-rs/crates/shared-contracts/src/lib.rs @@ -16,4 +16,7 @@ pub mod puzzle_runtime; pub mod puzzle_works; pub mod runtime; pub mod runtime_story; +pub mod square_hole_agent; +pub mod square_hole_runtime; +pub mod square_hole_works; pub mod story; diff --git a/server-rs/crates/shared-contracts/src/square_hole_agent.rs b/server-rs/crates/shared-contracts/src/square_hole_agent.rs new file mode 100644 index 00000000..97394b0f --- /dev/null +++ b/server-rs/crates/shared-contracts/src/square_hole_agent.rs @@ -0,0 +1,122 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct CreateSquareHoleSessionRequest { + #[serde(default)] + pub seed_text: Option, + #[serde(default)] + pub theme_text: Option, + #[serde(default)] + pub twist_rule: Option, + #[serde(default)] + pub shape_count: Option, + #[serde(default)] + pub difficulty: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SendSquareHoleMessageRequest { + pub client_message_id: String, + pub text: String, + #[serde(default)] + pub quick_fill_requested: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ExecuteSquareHoleActionRequest { + pub action: String, + #[serde(default)] + pub game_name: Option, + #[serde(default)] + pub summary: Option, + #[serde(default)] + pub tags: Option>, + #[serde(default)] + pub cover_image_src: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleAnchorItemResponse { + pub key: String, + pub label: String, + pub value: String, + pub status: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleAnchorPackResponse { + pub theme: SquareHoleAnchorItemResponse, + pub twist_rule: SquareHoleAnchorItemResponse, + pub shape_count: SquareHoleAnchorItemResponse, + pub difficulty: SquareHoleAnchorItemResponse, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleCreatorConfigResponse { + pub theme_text: String, + pub twist_rule: String, + pub shape_count: u32, + pub difficulty: u32, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleResultDraftResponse { + pub profile_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + pub shape_count: u32, + pub difficulty: u32, + pub publish_ready: bool, + pub blockers: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleAgentMessageResponse { + pub id: String, + pub role: String, + pub kind: String, + pub text: String, + pub created_at: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleSessionSnapshotResponse { + pub session_id: String, + pub current_turn: u32, + pub progress_percent: u32, + pub stage: String, + pub anchor_pack: SquareHoleAnchorPackResponse, + pub config: SquareHoleCreatorConfigResponse, + #[serde(default)] + pub draft: Option, + pub messages: Vec, + #[serde(default)] + pub last_assistant_reply: Option, + #[serde(default)] + pub published_profile_id: Option, + pub updated_at: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleSessionResponse { + pub session: SquareHoleSessionSnapshotResponse, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleActionResponse { + pub session: SquareHoleSessionSnapshotResponse, +} diff --git a/server-rs/crates/shared-contracts/src/square_hole_runtime.rs b/server-rs/crates/shared-contracts/src/square_hole_runtime.rs new file mode 100644 index 00000000..2645362c --- /dev/null +++ b/server-rs/crates/shared-contracts/src/square_hole_runtime.rs @@ -0,0 +1,89 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct StartSquareHoleRunRequest { + pub profile_id: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct DropSquareHoleShapeRequest { + #[serde(default)] + pub run_id: Option, + pub hole_id: String, + pub client_snapshot_version: u64, + pub client_event_id: String, + pub dropped_at_ms: u64, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct StopSquareHoleRunRequest { + pub client_action_id: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleShapeSnapshotResponse { + pub shape_id: String, + pub shape_kind: String, + pub label: String, + pub color: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleHoleSnapshotResponse { + pub hole_id: String, + pub hole_kind: String, + pub label: String, + pub x: f32, + pub y: f32, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleDropFeedbackResponse { + pub accepted: bool, + #[serde(default)] + pub reject_reason: Option, + pub message: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleRunSnapshotResponse { + pub run_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub status: String, + pub snapshot_version: u64, + pub started_at_ms: u64, + pub duration_limit_ms: u64, + pub remaining_ms: u64, + pub total_shape_count: u32, + pub completed_shape_count: u32, + pub combo: u32, + pub best_combo: u32, + pub score: u32, + pub rule_label: String, + #[serde(default)] + pub current_shape: Option, + pub holes: Vec, + #[serde(default)] + pub last_feedback: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleRunResponse { + pub run: SquareHoleRunSnapshotResponse, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleDropResponse { + pub feedback: SquareHoleDropFeedbackResponse, + pub run: SquareHoleRunSnapshotResponse, +} diff --git a/server-rs/crates/shared-contracts/src/square_hole_works.rs b/server-rs/crates/shared-contracts/src/square_hole_works.rs new file mode 100644 index 00000000..c1708b57 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/square_hole_works.rs @@ -0,0 +1,66 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PutSquareHoleWorkRequest { + pub game_name: String, + #[serde(default)] + pub theme_text: Option, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + #[serde(default)] + pub cover_image_src: Option, + pub shape_count: u32, + pub difficulty: u32, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleWorkSummaryResponse { + pub work_id: String, + pub profile_id: String, + pub owner_user_id: String, + #[serde(default)] + pub source_session_id: Option, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + #[serde(default)] + pub cover_image_src: Option, + pub shape_count: u32, + pub difficulty: u32, + pub publication_status: String, + pub play_count: u32, + pub updated_at: String, + #[serde(default)] + pub published_at: Option, + pub publish_ready: bool, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleWorkProfileResponse { + #[serde(flatten)] + pub summary: SquareHoleWorkSummaryResponse, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleWorksResponse { + pub items: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleWorkDetailResponse { + pub item: SquareHoleWorkProfileResponse, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleWorkMutationResponse { + pub item: SquareHoleWorkProfileResponse, +} diff --git a/server-rs/crates/spacetime-client/Cargo.toml b/server-rs/crates/spacetime-client/Cargo.toml index e55b0b00..4b3203e2 100644 --- a/server-rs/crates/spacetime-client/Cargo.toml +++ b/server-rs/crates/spacetime-client/Cargo.toml @@ -17,6 +17,7 @@ module-puzzle = { path = "../module-puzzle" } module-runtime = { path = "../module-runtime" } module-runtime-story = { path = "../module-runtime-story" } module-runtime-item = { path = "../module-runtime-item" } +module-square-hole = { path = "../module-square-hole" } module-story = { path = "../module-story" } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/server-rs/crates/spacetime-client/src/lib.rs b/server-rs/crates/spacetime-client/src/lib.rs index 394c9c93..72b28ae4 100644 --- a/server-rs/crates/spacetime-client/src/lib.rs +++ b/server-rs/crates/spacetime-client/src/lib.rs @@ -51,6 +51,15 @@ pub use mapper::{ PuzzleSelectCoverImageRecordInput, PuzzleWorkLikeReportRecordInput, PuzzleWorkPointIncentiveClaimRecordInput, PuzzleWorkProfileRecord, PuzzleWorkRemixRecordInput, PuzzleWorkUpsertRecordInput, ResolveCombatActionRecord, ResolveNpcBattleInteractionInput, + SquareHoleAgentMessageFinalizeRecordInput, SquareHoleAgentMessageRecord, + SquareHoleAgentMessageSubmitRecordInput, SquareHoleAgentSessionCreateRecordInput, + SquareHoleAgentSessionRecord, SquareHoleAnchorItemRecord, SquareHoleAnchorPackRecord, + SquareHoleCompileDraftRecordInput, SquareHoleCreatorConfigRecord, + SquareHoleDropConfirmationRecord, SquareHoleDropFeedbackRecord, SquareHoleHoleSnapshotRecord, + SquareHoleResultDraftRecord, SquareHoleRunDropRecordInput, SquareHoleRunRecord, + SquareHoleRunRestartRecordInput, SquareHoleRunStartRecordInput, SquareHoleRunStopRecordInput, + SquareHoleRunTimeUpRecordInput, SquareHoleShapeSnapshotRecord, SquareHoleWorkProfileRecord, + SquareHoleWorkUpdateRecordInput, }; pub mod ai; @@ -64,6 +73,7 @@ pub mod match3d; pub mod npc; pub mod puzzle; pub mod runtime; +pub mod square_hole; pub mod story; pub mod story_runtime; diff --git a/server-rs/crates/spacetime-client/src/mapper.rs b/server-rs/crates/spacetime-client/src/mapper.rs index 280dd450..d6c590d8 100644 --- a/server-rs/crates/spacetime-client/src/mapper.rs +++ b/server-rs/crates/spacetime-client/src/mapper.rs @@ -1575,6 +1575,110 @@ pub(crate) fn map_match3d_click_item_procedure_result( }) } +pub(crate) fn map_square_hole_agent_session_procedure_result( + result: SquareHoleAgentSessionProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + + let session_json = result + .session_json + .ok_or_else(|| SpacetimeClientError::missing_snapshot("square hole agent session 快照"))?; + let session = + serde_json::from_str::(&session_json).map_err( + |error| { + SpacetimeClientError::Runtime(format!( + "square hole session_json 非法: {error}" + )) + }, + )?; + + Ok(map_square_hole_agent_session_snapshot(session)) +} + +pub(crate) fn map_square_hole_work_procedure_result( + result: SquareHoleWorkProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + + let work_json = result + .work_json + .ok_or_else(|| SpacetimeClientError::missing_snapshot("square hole work 快照"))?; + let work = serde_json::from_str::(&work_json).map_err(|error| { + SpacetimeClientError::Runtime(format!("square hole work_json 非法: {error}")) + })?; + + Ok(map_square_hole_work_snapshot(work)) +} + +pub(crate) fn map_square_hole_works_procedure_result( + result: SquareHoleWorksProcedureResult, +) -> Result, SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + + let items_json = result + .items_json + .ok_or_else(|| SpacetimeClientError::missing_snapshot("square hole works 快照"))?; + let items = serde_json::from_str::>(&items_json).map_err( + |error| { + SpacetimeClientError::Runtime(format!("square hole works items_json 非法: {error}")) + }, + )?; + + Ok(items.into_iter().map(map_square_hole_work_snapshot).collect()) +} + +pub(crate) fn map_square_hole_run_procedure_result( + result: SquareHoleRunProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + + let run_json = result + .run_json + .ok_or_else(|| SpacetimeClientError::missing_snapshot("square hole run 快照"))?; + map_square_hole_run_json(run_json) +} + +pub(crate) fn map_square_hole_drop_shape_procedure_result( + result: SquareHoleDropShapeProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + + let run_json = result + .run_json + .ok_or_else(|| SpacetimeClientError::missing_snapshot("square hole drop run 快照"))?; + let feedback_json = result.feedback_json.ok_or_else(|| { + SpacetimeClientError::missing_snapshot("square hole drop feedback 快照") + })?; + let run = map_square_hole_run_json(run_json)?; + let feedback = + serde_json::from_str::(&feedback_json).map_err( + |error| { + SpacetimeClientError::Runtime(format!( + "square hole feedback_json 非法: {error}" + )) + }, + )?; + + Ok(SquareHoleDropConfirmationRecord { + status: result.status, + accepted: feedback.accepted, + reject_reason: feedback.reject_reason.clone(), + failure_reason: result.failure_reason, + feedback: map_square_hole_feedback_snapshot(feedback), + run, + }) +} + pub(crate) fn map_story_session_procedure_result( result: StorySessionProcedureResult, ) -> Result { @@ -2815,6 +2919,198 @@ fn build_match3d_anchor_item(key: &str, label: &str, value: &str) -> Match3DAnch } } +fn map_square_hole_agent_session_snapshot( + snapshot: SquareHoleAgentSessionJsonRecord, +) -> SquareHoleAgentSessionRecord { + let config = map_square_hole_creator_config(snapshot.config); + SquareHoleAgentSessionRecord { + session_id: snapshot.session_id, + current_turn: snapshot.current_turn, + progress_percent: snapshot.progress_percent, + stage: normalize_square_hole_stage(&snapshot.stage).to_string(), + anchor_pack: build_square_hole_anchor_pack(&config), + config, + draft: snapshot.draft.map(map_square_hole_result_draft), + messages: snapshot + .messages + .into_iter() + .map(map_square_hole_agent_message_snapshot) + .collect(), + last_assistant_reply: empty_string_to_none(snapshot.last_assistant_reply), + published_profile_id: snapshot.published_profile_id, + updated_at: format_timestamp_micros(snapshot.updated_at_micros), + } +} + +fn map_square_hole_creator_config( + snapshot: SquareHoleCreatorConfigJsonRecord, +) -> SquareHoleCreatorConfigRecord { + SquareHoleCreatorConfigRecord { + theme_text: snapshot.theme_text, + twist_rule: snapshot.twist_rule, + shape_count: snapshot.shape_count, + difficulty: snapshot.difficulty, + } +} + +fn map_square_hole_result_draft( + snapshot: SquareHoleDraftJsonRecord, +) -> SquareHoleResultDraftRecord { + SquareHoleResultDraftRecord { + profile_id: snapshot.profile_id, + game_name: snapshot.game_name, + theme_text: snapshot.theme_text, + twist_rule: snapshot.twist_rule, + summary: snapshot.summary_text, + tags: snapshot.tags, + shape_count: snapshot.shape_count, + difficulty: snapshot.difficulty, + publish_ready: false, + blockers: Vec::new(), + } +} + +fn map_square_hole_agent_message_snapshot( + snapshot: SquareHoleAgentMessageJsonRecord, +) -> SquareHoleAgentMessageRecord { + SquareHoleAgentMessageRecord { + id: snapshot.message_id, + role: snapshot.role, + kind: normalize_square_hole_message_kind(&snapshot.kind).to_string(), + text: snapshot.text, + created_at: format_timestamp_micros(snapshot.created_at_micros), + } +} + +fn map_square_hole_work_snapshot( + snapshot: SquareHoleWorkJsonRecord, +) -> SquareHoleWorkProfileRecord { + SquareHoleWorkProfileRecord { + work_id: snapshot.work_id, + profile_id: snapshot.profile_id, + owner_user_id: snapshot.owner_user_id, + source_session_id: empty_string_to_none(snapshot.source_session_id), + author_display_name: snapshot.author_display_name, + game_name: snapshot.game_name, + theme_text: snapshot.theme_text, + twist_rule: snapshot.twist_rule, + summary: snapshot.summary_text, + tags: snapshot.tags, + cover_image_src: empty_string_to_none(snapshot.cover_image_src), + shape_count: snapshot.shape_count, + difficulty: snapshot.difficulty, + publication_status: normalize_square_hole_publication_status(&snapshot.publication_status) + .to_string(), + play_count: snapshot.play_count, + updated_at: format_timestamp_micros(snapshot.updated_at_micros), + published_at: snapshot.published_at_micros.map(format_timestamp_micros), + publish_ready: snapshot.publish_ready, + } +} + +fn map_square_hole_run_json(run_json: String) -> Result { + let run = serde_json::from_str::(&run_json).map_err(|error| { + SpacetimeClientError::Runtime(format!("square hole run_json 非法: {error}")) + })?; + Ok(map_square_hole_run_snapshot(run)) +} + +fn map_square_hole_run_snapshot(snapshot: SquareHoleRunJsonRecord) -> SquareHoleRunRecord { + SquareHoleRunRecord { + run_id: snapshot.run_id, + profile_id: snapshot.profile_id, + owner_user_id: snapshot.owner_user_id, + status: normalize_square_hole_run_status(&snapshot.status).to_string(), + snapshot_version: snapshot.snapshot_version, + started_at_ms: i64_to_u64_ms(snapshot.started_at_ms), + duration_limit_ms: i64_to_u64_ms(snapshot.duration_limit_ms), + server_now_ms: Some(i64_to_u64_ms(snapshot.server_now_ms)), + remaining_ms: i64_to_u64_ms(snapshot.remaining_ms), + total_shape_count: snapshot.total_shape_count, + completed_shape_count: snapshot.completed_shape_count, + combo: snapshot.combo, + best_combo: snapshot.best_combo, + score: snapshot.score, + rule_label: snapshot.rule_label, + current_shape: snapshot.current_shape.map(map_square_hole_shape_snapshot), + holes: snapshot + .holes + .into_iter() + .map(map_square_hole_hole_snapshot) + .collect(), + last_feedback: snapshot + .last_feedback + .map(map_square_hole_feedback_snapshot), + last_confirmed_action_id: None, + } +} + +fn map_square_hole_shape_snapshot( + snapshot: SquareHoleShapeJsonRecord, +) -> SquareHoleShapeSnapshotRecord { + SquareHoleShapeSnapshotRecord { + shape_id: snapshot.shape_id, + shape_kind: snapshot.shape_kind, + label: snapshot.label, + color: snapshot.color, + } +} + +fn map_square_hole_hole_snapshot( + snapshot: SquareHoleHoleJsonRecord, +) -> SquareHoleHoleSnapshotRecord { + SquareHoleHoleSnapshotRecord { + hole_id: snapshot.hole_id, + hole_kind: snapshot.hole_kind, + label: snapshot.label, + x: snapshot.x, + y: snapshot.y, + } +} + +fn map_square_hole_feedback_snapshot( + snapshot: SquareHoleDropFeedbackJsonRecord, +) -> SquareHoleDropFeedbackRecord { + SquareHoleDropFeedbackRecord { + accepted: snapshot.accepted, + reject_reason: snapshot + .reject_reason + .map(|value| normalize_square_hole_reject_reason(&value).to_string()), + message: snapshot.message, + } +} + +fn build_square_hole_anchor_pack( + config: &SquareHoleCreatorConfigRecord, +) -> SquareHoleAnchorPackRecord { + let shape_count = config.shape_count.to_string(); + let difficulty = config.difficulty.to_string(); + SquareHoleAnchorPackRecord { + theme: build_square_hole_anchor_item("theme", "题材主题", config.theme_text.as_str()), + twist_rule: build_square_hole_anchor_item("twistRule", "反差规则", config.twist_rule.as_str()), + shape_count: build_square_hole_anchor_item("shapeCount", "形状数量", shape_count.as_str()), + difficulty: build_square_hole_anchor_item("difficulty", "难度", difficulty.as_str()), + } +} + +fn build_square_hole_anchor_item( + key: &str, + label: &str, + value: &str, +) -> SquareHoleAnchorItemRecord { + SquareHoleAnchorItemRecord { + key: key.to_string(), + label: label.to_string(), + value: value.to_string(), + status: if value.trim().is_empty() { + "missing" + } else { + "confirmed" + } + .to_string(), + } +} + fn normalize_match3d_stage(value: &str) -> &str { match value { "Collecting" | "collecting" | "collecting_config" => "collecting_config", @@ -2840,6 +3136,54 @@ fn normalize_match3d_message_kind(value: &str) -> &str { } } +fn normalize_square_hole_stage(value: &str) -> &str { + match value { + "Collecting" | "CollectingConfig" | "collecting" | "collecting_config" => { + "collecting_config" + } + "ReadyToCompile" | "ready_to_compile" => "ready_to_compile", + "DraftCompiled" | "DraftReady" | "draft_compiled" | "draft_ready" => "draft_ready", + "Published" | "published" => "published", + _ => value, + } +} + +fn normalize_square_hole_publication_status(value: &str) -> &str { + match value { + "Draft" | "draft" => "draft", + "Published" | "published" => "published", + _ => value, + } +} + +fn normalize_square_hole_run_status(value: &str) -> &str { + match value { + "Running" | "running" => "running", + "Won" | "won" => "won", + "Failed" | "failed" => "failed", + "Stopped" | "stopped" => "stopped", + _ => value, + } +} + +fn normalize_square_hole_message_kind(value: &str) -> &str { + match value { + "text" => "chat", + _ => value, + } +} + +fn normalize_square_hole_reject_reason(value: &str) -> &str { + match value { + "RunNotActive" | "run_not_active" => "run_not_active", + "SnapshotVersionMismatch" | "snapshot_version_mismatch" => "snapshot_version_mismatch", + "HoleNotFound" | "hole_not_found" => "hole_not_found", + "Incompatible" | "incompatible" => "incompatible", + "TimeUp" | "time_up" => "time_up", + _ => value, + } +} + fn empty_string_to_none(value: String) -> Option { let trimmed = value.trim(); if trimmed.is_empty() { @@ -5592,6 +5936,378 @@ struct Match3DRunJsonRecord { failure_reason: Option, } +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAgentSessionCreateRecordInput { + pub session_id: String, + pub owner_user_id: String, + pub seed_text: String, + pub welcome_message_id: String, + pub welcome_message_text: String, + pub config_json: Option, + pub created_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAgentMessageSubmitRecordInput { + pub session_id: String, + pub owner_user_id: String, + pub user_message_id: String, + pub user_message_text: String, + pub submitted_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAgentMessageFinalizeRecordInput { + pub session_id: String, + pub owner_user_id: String, + pub assistant_message_id: Option, + pub assistant_reply_text: Option, + pub config_json: Option, + pub progress_percent: u32, + pub stage: String, + pub updated_at_micros: i64, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleCompileDraftRecordInput { + pub session_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub author_display_name: String, + pub game_name: Option, + pub summary_text: Option, + pub tags_json: Option, + pub cover_image_src: Option, + pub compiled_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleWorkUpdateRecordInput { + pub profile_id: String, + pub owner_user_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary_text: String, + pub tags_json: String, + pub cover_image_src: String, + pub shape_count: u32, + pub difficulty: u32, + pub updated_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleRunStartRecordInput { + pub run_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub started_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleRunDropRecordInput { + pub run_id: String, + pub owner_user_id: String, + pub hole_id: String, + pub client_snapshot_version: u64, + pub client_event_id: String, + pub dropped_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleRunStopRecordInput { + pub run_id: String, + pub owner_user_id: String, + pub stopped_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleRunRestartRecordInput { + pub source_run_id: String, + pub next_run_id: String, + pub owner_user_id: String, + pub restarted_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleRunTimeUpRecordInput { + pub run_id: String, + pub owner_user_id: String, + pub finished_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAnchorItemRecord { + pub key: String, + pub label: String, + pub value: String, + pub status: String, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAnchorPackRecord { + pub theme: SquareHoleAnchorItemRecord, + pub twist_rule: SquareHoleAnchorItemRecord, + pub shape_count: SquareHoleAnchorItemRecord, + pub difficulty: SquareHoleAnchorItemRecord, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleCreatorConfigRecord { + pub theme_text: String, + pub twist_rule: String, + pub shape_count: u32, + pub difficulty: u32, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleResultDraftRecord { + pub profile_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + pub shape_count: u32, + pub difficulty: u32, + pub publish_ready: bool, + pub blockers: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAgentMessageRecord { + pub id: String, + pub role: String, + pub kind: String, + pub text: String, + pub created_at: String, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleAgentSessionRecord { + pub session_id: String, + pub current_turn: u32, + pub progress_percent: u32, + pub stage: String, + pub anchor_pack: SquareHoleAnchorPackRecord, + pub config: SquareHoleCreatorConfigRecord, + pub draft: Option, + pub messages: Vec, + pub last_assistant_reply: Option, + pub published_profile_id: Option, + pub updated_at: String, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleWorkProfileRecord { + pub work_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub source_session_id: Option, + pub author_display_name: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary: String, + pub tags: Vec, + pub cover_image_src: Option, + pub shape_count: u32, + pub difficulty: u32, + pub publication_status: String, + pub play_count: u32, + pub updated_at: String, + pub published_at: Option, + pub publish_ready: bool, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleShapeSnapshotRecord { + pub shape_id: String, + pub shape_kind: String, + pub label: String, + pub color: String, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct SquareHoleHoleSnapshotRecord { + pub hole_id: String, + pub hole_kind: String, + pub label: String, + pub x: f32, + pub y: f32, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SquareHoleDropFeedbackRecord { + pub accepted: bool, + pub reject_reason: Option, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct SquareHoleRunRecord { + pub run_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub status: String, + pub snapshot_version: u64, + pub started_at_ms: u64, + pub duration_limit_ms: u64, + pub server_now_ms: Option, + pub remaining_ms: u64, + pub total_shape_count: u32, + pub completed_shape_count: u32, + pub combo: u32, + pub best_combo: u32, + pub score: u32, + pub rule_label: String, + pub current_shape: Option, + pub holes: Vec, + pub last_feedback: Option, + pub last_confirmed_action_id: Option, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct SquareHoleDropConfirmationRecord { + pub status: String, + pub accepted: bool, + pub reject_reason: Option, + pub failure_reason: Option, + pub feedback: SquareHoleDropFeedbackRecord, + pub run: SquareHoleRunRecord, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleCreatorConfigJsonRecord { + theme_text: String, + twist_rule: String, + shape_count: u32, + difficulty: u32, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleAgentMessageJsonRecord { + message_id: String, + #[allow(dead_code)] + session_id: String, + role: String, + kind: String, + text: String, + created_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleDraftJsonRecord { + profile_id: String, + game_name: String, + theme_text: String, + twist_rule: String, + summary_text: String, + tags: Vec, + shape_count: u32, + difficulty: u32, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleAgentSessionJsonRecord { + session_id: String, + #[allow(dead_code)] + owner_user_id: String, + #[allow(dead_code)] + seed_text: String, + current_turn: u32, + progress_percent: u32, + stage: String, + config: SquareHoleCreatorConfigJsonRecord, + draft: Option, + messages: Vec, + last_assistant_reply: String, + published_profile_id: Option, + #[allow(dead_code)] + created_at_micros: i64, + updated_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleWorkJsonRecord { + work_id: String, + profile_id: String, + owner_user_id: String, + source_session_id: String, + author_display_name: String, + game_name: String, + theme_text: String, + twist_rule: String, + summary_text: String, + tags: Vec, + cover_image_src: String, + shape_count: u32, + difficulty: u32, + #[allow(dead_code)] + config: SquareHoleCreatorConfigJsonRecord, + publication_status: String, + publish_ready: bool, + play_count: u32, + updated_at_micros: i64, + published_at_micros: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleShapeJsonRecord { + shape_id: String, + shape_kind: String, + label: String, + color: String, +} + +#[derive(Clone, Debug, PartialEq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleHoleJsonRecord { + hole_id: String, + hole_kind: String, + label: String, + x: f32, + y: f32, +} + +#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleDropFeedbackJsonRecord { + accepted: bool, + reject_reason: Option, + message: String, +} + +#[derive(Clone, Debug, PartialEq, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SquareHoleRunJsonRecord { + run_id: String, + profile_id: String, + owner_user_id: String, + status: String, + snapshot_version: u64, + started_at_ms: i64, + duration_limit_ms: i64, + server_now_ms: i64, + remaining_ms: i64, + total_shape_count: u32, + completed_shape_count: u32, + combo: u32, + best_combo: u32, + score: u32, + rule_label: String, + current_shape: Option, + holes: Vec, + last_feedback: Option, +} + #[derive(Clone, Debug, PartialEq, Eq)] pub struct PuzzleAnchorItemRecord { pub key: String, diff --git a/server-rs/crates/spacetime-client/src/module_bindings/accept_quest_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/accept_quest_reducer.rs index dfebf903..61e6b9c5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/accept_quest_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/accept_quest_reducer.rs @@ -47,9 +47,11 @@ pub trait accept_quest { &self, input: QuestRecordInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl accept_quest for super::RemoteReducers { &self, input: QuestRecordInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(AcceptQuestArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/acknowledge_quest_completion_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/acknowledge_quest_completion_reducer.rs index 6ae2fd10..b1419fb7 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/acknowledge_quest_completion_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/acknowledge_quest_completion_reducer.rs @@ -47,9 +47,11 @@ pub trait acknowledge_quest_completion { &self, input: QuestCompletionAckInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl acknowledge_quest_completion for super::RemoteReducers { &self, input: QuestCompletionAckInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(AcknowledgeQuestCompletionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_redeem_code_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_redeem_code_procedure.rs index bbdaab4f..9865ace5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_redeem_code_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_redeem_code_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_disable_profile_redeem_code { input: RuntimeProfileRedeemCodeAdminDisableInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_disable_profile_redeem_code for super::RemoteProcedures { input: RuntimeProfileRedeemCodeAdminDisableInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileRedeemCodeAdminProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_task_config_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_task_config_procedure.rs index c968f950..0417bd2e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_task_config_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_disable_profile_task_config_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_disable_profile_task_config { input: RuntimeProfileTaskConfigAdminDisableInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_disable_profile_task_config for super::RemoteProcedures { input: RuntimeProfileTaskConfigAdminDisableInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileTaskConfigAdminProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_invite_codes_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_invite_codes_procedure.rs index cdfa27d9..96d2350f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_invite_codes_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_invite_codes_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_list_profile_invite_codes { input: RuntimeProfileInviteCodeAdminListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_list_profile_invite_codes for super::RemoteProcedures { input: RuntimeProfileInviteCodeAdminListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileInviteCodeAdminListProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_redeem_codes_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_redeem_codes_procedure.rs index 2c9b9dd7..c7d6a78e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_redeem_codes_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_redeem_codes_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_list_profile_redeem_codes { input: RuntimeProfileRedeemCodeAdminListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_list_profile_redeem_codes for super::RemoteProcedures { input: RuntimeProfileRedeemCodeAdminListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileRedeemCodeAdminListProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_task_configs_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_task_configs_procedure.rs index 88ca28d5..a152116d 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_task_configs_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_list_profile_task_configs_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_list_profile_task_configs { input: RuntimeProfileTaskConfigAdminListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_list_profile_task_configs for super::RemoteProcedures { input: RuntimeProfileTaskConfigAdminListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileTaskConfigAdminListProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_invite_code_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_invite_code_procedure.rs index 3601be97..2411092d 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_invite_code_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_invite_code_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_upsert_profile_invite_code { input: RuntimeProfileInviteCodeAdminUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_upsert_profile_invite_code for super::RemoteProcedures { input: RuntimeProfileInviteCodeAdminUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileInviteCodeAdminProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_redeem_code_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_redeem_code_procedure.rs index 7e918220..9c7ae92f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_redeem_code_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_redeem_code_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_upsert_profile_redeem_code { input: RuntimeProfileRedeemCodeAdminUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_upsert_profile_redeem_code for super::RemoteProcedures { input: RuntimeProfileRedeemCodeAdminUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileRedeemCodeAdminProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_task_config_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_task_config_procedure.rs index a3d3e11a..b441a808 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_task_config_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/admin_upsert_profile_task_config_procedure.rs @@ -31,10 +31,10 @@ pub trait admin_upsert_profile_task_config { input: RuntimeProfileTaskConfigAdminUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl admin_upsert_profile_task_config for super::RemoteProcedures { input: RuntimeProfileTaskConfigAdminUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileTaskConfigAdminProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/advance_puzzle_next_level_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/advance_puzzle_next_level_procedure.rs index 6d3e9f79..7cb4f8f4 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/advance_puzzle_next_level_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/advance_puzzle_next_level_procedure.rs @@ -31,10 +31,10 @@ pub trait advance_puzzle_next_level { input: PuzzleRunNextLevelInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl advance_puzzle_next_level for super::RemoteProcedures { input: PuzzleRunNextLevelInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/append_ai_text_chunk_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/append_ai_text_chunk_and_return_procedure.rs index 11323392..191e2ea7 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/append_ai_text_chunk_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/append_ai_text_chunk_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait append_ai_text_chunk_and_return { input: AiTextChunkAppendInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl append_ai_text_chunk_and_return for super::RemoteProcedures { input: AiTextChunkAppendInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_and_return_procedure.rs index bba4c841..4a949906 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_and_return_procedure.rs @@ -34,10 +34,10 @@ pub trait apply_chapter_progression_ledger_entry_and_return { input: ChapterProgressionLedgerInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl apply_chapter_progression_ledger_entry_and_return for super::RemoteProcedur input: ChapterProgressionLedgerInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, ChapterProgressionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_reducer.rs index 98f821ef..44596083 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/apply_chapter_progression_ledger_entry_reducer.rs @@ -50,9 +50,11 @@ pub trait apply_chapter_progression_ledger_entry { &self, input: ChapterProgressionLedgerInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl apply_chapter_progression_ledger_entry for super::RemoteReducers { &self, input: ChapterProgressionLedgerInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp.invoke_reducer_with_callback( ApplyChapterProgressionLedgerEntryArgs { input }, diff --git a/server-rs/crates/spacetime-client/src/module_bindings/apply_inventory_mutation_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/apply_inventory_mutation_reducer.rs index 91f7d2c0..d9b4240d 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/apply_inventory_mutation_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/apply_inventory_mutation_reducer.rs @@ -47,9 +47,11 @@ pub trait apply_inventory_mutation { &self, input: InventoryMutationInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl apply_inventory_mutation for super::RemoteReducers { &self, input: InventoryMutationInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ApplyInventoryMutationArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/apply_quest_signal_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/apply_quest_signal_reducer.rs index afb452b5..6b4c310b 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/apply_quest_signal_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/apply_quest_signal_reducer.rs @@ -47,9 +47,11 @@ pub trait apply_quest_signal { &self, input: QuestSignalApplyInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl apply_quest_signal for super::RemoteReducers { &self, input: QuestSignalApplyInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ApplyQuestSignalArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/attach_ai_result_reference_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/attach_ai_result_reference_and_return_procedure.rs index 2f3edbe2..94d41850 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/attach_ai_result_reference_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/attach_ai_result_reference_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait attach_ai_result_reference_and_return { input: AiResultReferenceInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl attach_ai_result_reference_and_return for super::RemoteProcedures { input: AiResultReferenceInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/authorize_database_migration_operator_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/authorize_database_migration_operator_procedure.rs index b5885022..ac77f7e8 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/authorize_database_migration_operator_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/authorize_database_migration_operator_procedure.rs @@ -34,10 +34,10 @@ pub trait authorize_database_migration_operator { input: DatabaseMigrationAuthorizeOperatorInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl authorize_database_migration_operator for super::RemoteProcedures { input: DatabaseMigrationAuthorizeOperatorInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationOperatorProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_and_return_procedure.rs index eef3de0f..304b2e0c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait begin_story_session_and_return { input: StorySessionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl begin_story_session_and_return for super::RemoteProcedures { input: StorySessionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, StorySessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_reducer.rs index 6a082f41..22bc4add 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/begin_story_session_reducer.rs @@ -47,9 +47,11 @@ pub trait begin_story_session { &self, input: StorySessionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl begin_story_session for super::RemoteReducers { &self, input: StorySessionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(BeginStorySessionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_and_return_procedure.rs index b709d5c2..78c80aee 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait bind_asset_object_to_entity_and_return { input: AssetEntityBindingInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl bind_asset_object_to_entity_and_return for super::RemoteProcedures { input: AssetEntityBindingInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AssetEntityBindingProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_reducer.rs index b20bc5b2..caf48b26 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/bind_asset_object_to_entity_reducer.rs @@ -47,9 +47,11 @@ pub trait bind_asset_object_to_entity { &self, input: AssetEntityBindingInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl bind_asset_object_to_entity for super::RemoteReducers { &self, input: AssetEntityBindingInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(BindAssetObjectToEntityArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/cancel_ai_task_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/cancel_ai_task_and_return_procedure.rs index b239e060..0c5dc3eb 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/cancel_ai_task_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/cancel_ai_task_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait cancel_ai_task_and_return { input: AiTaskCancelInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl cancel_ai_task_and_return for super::RemoteProcedures { input: AiTaskCancelInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/claim_profile_task_reward_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/claim_profile_task_reward_and_return_procedure.rs index 5a386f3c..ea501070 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/claim_profile_task_reward_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/claim_profile_task_reward_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait claim_profile_task_reward_and_return { input: RuntimeProfileTaskClaimInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl claim_profile_task_reward_and_return for super::RemoteProcedures { input: RuntimeProfileTaskClaimInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileTaskClaimProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/claim_puzzle_work_point_incentive_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/claim_puzzle_work_point_incentive_procedure.rs index f7ac8d75..1d787222 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/claim_puzzle_work_point_incentive_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/claim_puzzle_work_point_incentive_procedure.rs @@ -31,10 +31,10 @@ pub trait claim_puzzle_work_point_incentive { input: PuzzleWorkPointIncentiveClaimInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl claim_puzzle_work_point_incentive for super::RemoteProcedures { input: PuzzleWorkPointIncentiveClaimInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/clear_database_migration_import_chunks_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/clear_database_migration_import_chunks_procedure.rs index 51146e99..d05fcdf2 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/clear_database_migration_import_chunks_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/clear_database_migration_import_chunks_procedure.rs @@ -34,10 +34,10 @@ pub trait clear_database_migration_import_chunks { input: DatabaseMigrationImportChunksClearInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl clear_database_migration_import_chunks for super::RemoteProcedures { input: DatabaseMigrationImportChunksClearInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/clear_platform_browse_history_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/clear_platform_browse_history_and_return_procedure.rs index 2e623845..c8ba8d49 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/clear_platform_browse_history_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/clear_platform_browse_history_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait clear_platform_browse_history_and_return { input: RuntimeBrowseHistoryClearInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl clear_platform_browse_history_and_return for super::RemoteProcedures { input: RuntimeBrowseHistoryClearInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeBrowseHistoryProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/click_match_3_d_item_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/click_match_3_d_item_procedure.rs index 6070a62d..278845ba 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/click_match_3_d_item_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/click_match_3_d_item_procedure.rs @@ -31,10 +31,10 @@ pub trait click_match_3_d_item { input: Match3DRunClickInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl click_match_3_d_item for super::RemoteProcedures { input: Match3DRunClickInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DClickItemProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/compile_big_fish_draft_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/compile_big_fish_draft_procedure.rs index 6eea6571..bafe95a6 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/compile_big_fish_draft_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/compile_big_fish_draft_procedure.rs @@ -31,10 +31,10 @@ pub trait compile_big_fish_draft { input: BigFishDraftCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl compile_big_fish_draft for super::RemoteProcedures { input: BigFishDraftCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/compile_custom_world_published_profile_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/compile_custom_world_published_profile_procedure.rs index aefbe602..67706fab 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/compile_custom_world_published_profile_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/compile_custom_world_published_profile_procedure.rs @@ -34,10 +34,10 @@ pub trait compile_custom_world_published_profile { input: CustomWorldPublishedProfileCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl compile_custom_world_published_profile for super::RemoteProcedures { input: CustomWorldPublishedProfileCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldPublishedProfileCompileResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/compile_match_3_d_draft_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/compile_match_3_d_draft_procedure.rs index d6db0787..1a7a97ed 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/compile_match_3_d_draft_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/compile_match_3_d_draft_procedure.rs @@ -31,10 +31,10 @@ pub trait compile_match_3_d_draft { input: Match3DDraftCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl compile_match_3_d_draft for super::RemoteProcedures { input: Match3DDraftCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/compile_puzzle_agent_draft_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/compile_puzzle_agent_draft_procedure.rs index 7badcdae..177c0c40 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/compile_puzzle_agent_draft_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/compile_puzzle_agent_draft_procedure.rs @@ -31,10 +31,10 @@ pub trait compile_puzzle_agent_draft { input: PuzzleDraftCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl compile_puzzle_agent_draft for super::RemoteProcedures { input: PuzzleDraftCompileInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/compile_square_hole_draft_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/compile_square_hole_draft_procedure.rs new file mode 100644 index 00000000..0b715fc4 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/compile_square_hole_draft_procedure.rs @@ -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::square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; +use super::square_hole_draft_compile_input_type::SquareHoleDraftCompileInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct CompileSquareHoleDraftArgs { + pub input: SquareHoleDraftCompileInput, +} + +impl __sdk::InModule for CompileSquareHoleDraftArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `compile_square_hole_draft`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait compile_square_hole_draft { + fn compile_square_hole_draft(&self, input: SquareHoleDraftCompileInput) { + self.compile_square_hole_draft_then(input, |_, _| {}); + } + + fn compile_square_hole_draft_then( + &self, + input: SquareHoleDraftCompileInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl compile_square_hole_draft for super::RemoteProcedures { + fn compile_square_hole_draft_then( + &self, + input: SquareHoleDraftCompileInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleAgentSessionProcedureResult>( + "compile_square_hole_draft", + CompileSquareHoleDraftArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_stage_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_stage_and_return_procedure.rs index 51375935..e59ab8f0 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_stage_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_stage_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait complete_ai_stage_and_return { input: AiStageCompletionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl complete_ai_stage_and_return for super::RemoteProcedures { input: AiStageCompletionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_task_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_task_and_return_procedure.rs index 040af639..ca7eab9f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_task_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/complete_ai_task_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait complete_ai_task_and_return { input: AiTaskFinishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl complete_ai_task_and_return for super::RemoteProcedures { input: AiTaskFinishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_and_return_procedure.rs index 0b4f26b2..cc65f744 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait confirm_asset_object_and_return { input: AssetObjectUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl confirm_asset_object_and_return for super::RemoteProcedures { input: AssetObjectUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AssetObjectProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_reducer.rs index 183c2efa..f5edb63a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/confirm_asset_object_reducer.rs @@ -47,9 +47,11 @@ pub trait confirm_asset_object { &self, input: AssetObjectUpsertInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl confirm_asset_object for super::RemoteReducers { &self, input: AssetObjectUpsertInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ConfirmAssetObjectArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/consume_profile_wallet_points_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/consume_profile_wallet_points_and_return_procedure.rs index 3d3e47a2..11394b66 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/consume_profile_wallet_points_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/consume_profile_wallet_points_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait consume_profile_wallet_points_and_return { input: RuntimeProfileWalletAdjustmentInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl consume_profile_wallet_points_and_return for super::RemoteProcedures { input: RuntimeProfileWalletAdjustmentInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileWalletAdjustmentProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/continue_story_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/continue_story_and_return_procedure.rs index 0d58ec1b..1c2b51d8 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/continue_story_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/continue_story_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait continue_story_and_return { input: StoryContinueInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl continue_story_and_return for super::RemoteProcedures { input: StoryContinueInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, StorySessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/continue_story_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/continue_story_reducer.rs index 4117cfae..fb35bd1f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/continue_story_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/continue_story_reducer.rs @@ -47,9 +47,11 @@ pub trait continue_story { &self, input: StoryContinueInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl continue_story for super::RemoteReducers { &self, input: StoryContinueInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ContinueStoryArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_and_return_procedure.rs index 20d8ceee..a2f40fd0 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait create_ai_task_and_return { input: AiTaskCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl create_ai_task_and_return for super::RemoteProcedures { input: AiTaskCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_reducer.rs index 213f28e5..b87207f0 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_ai_task_reducer.rs @@ -47,9 +47,11 @@ pub trait create_ai_task { &self, input: AiTaskCreateInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl create_ai_task for super::RemoteReducers { &self, input: AiTaskCreateInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(CreateAiTaskArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_and_return_procedure.rs index ef11107a..c028ba4e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait create_battle_state_and_return { input: BattleStateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl create_battle_state_and_return for super::RemoteProcedures { input: BattleStateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BattleStateProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_reducer.rs index 1072f8a5..7f34eab2 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_battle_state_reducer.rs @@ -47,9 +47,11 @@ pub trait create_battle_state { &self, input: BattleStateInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl create_battle_state for super::RemoteReducers { &self, input: BattleStateInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(CreateBattleStateArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_big_fish_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_big_fish_session_procedure.rs index bc67436e..6e48521a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_big_fish_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_big_fish_session_procedure.rs @@ -31,10 +31,10 @@ pub trait create_big_fish_session { input: BigFishSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl create_big_fish_session for super::RemoteProcedures { input: BigFishSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_custom_world_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_custom_world_agent_session_procedure.rs index 6a08bcc7..96a21162 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_custom_world_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_custom_world_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait create_custom_world_agent_session { input: CustomWorldAgentSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl create_custom_world_agent_session for super::RemoteProcedures { input: CustomWorldAgentSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_match_3_d_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_match_3_d_agent_session_procedure.rs index c482c9c6..717ef728 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_match_3_d_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_match_3_d_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait create_match_3_d_agent_session { input: Match3DAgentSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl create_match_3_d_agent_session for super::RemoteProcedures { input: Match3DAgentSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_profile_recharge_order_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_profile_recharge_order_and_return_procedure.rs index 893fbdf6..1c53f6ae 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_profile_recharge_order_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_profile_recharge_order_and_return_procedure.rs @@ -34,10 +34,10 @@ pub trait create_profile_recharge_order_and_return { input: RuntimeProfileRechargeOrderCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl create_profile_recharge_order_and_return for super::RemoteProcedures { input: RuntimeProfileRechargeOrderCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileRechargeCenterProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_puzzle_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_puzzle_agent_session_procedure.rs index 9460692b..62b77081 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/create_puzzle_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_puzzle_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait create_puzzle_agent_session { input: PuzzleAgentSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl create_puzzle_agent_session for super::RemoteProcedures { input: PuzzleAgentSessionCreateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_square_hole_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_square_hole_agent_session_procedure.rs new file mode 100644 index 00000000..d58dbfa6 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_square_hole_agent_session_procedure.rs @@ -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::square_hole_agent_session_create_input_type::SquareHoleAgentSessionCreateInput; +use super::square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct CreateSquareHoleAgentSessionArgs { + pub input: SquareHoleAgentSessionCreateInput, +} + +impl __sdk::InModule for CreateSquareHoleAgentSessionArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `create_square_hole_agent_session`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait create_square_hole_agent_session { + fn create_square_hole_agent_session(&self, input: SquareHoleAgentSessionCreateInput) { + self.create_square_hole_agent_session_then(input, |_, _| {}); + } + + fn create_square_hole_agent_session_then( + &self, + input: SquareHoleAgentSessionCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl create_square_hole_agent_session for super::RemoteProcedures { + fn create_square_hole_agent_session_then( + &self, + input: SquareHoleAgentSessionCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleAgentSessionProcedureResult>( + "create_square_hole_agent_session", + CreateSquareHoleAgentSessionArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_big_fish_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_big_fish_work_procedure.rs index 51cc224f..d2be83ac 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/delete_big_fish_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_big_fish_work_procedure.rs @@ -31,10 +31,10 @@ pub trait delete_big_fish_work { input: BigFishWorkDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl delete_big_fish_work for super::RemoteProcedures { input: BigFishWorkDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_agent_session_procedure.rs index 27341561..39887830 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait delete_custom_world_agent_session { input: CustomWorldAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl delete_custom_world_agent_session for super::RemoteProcedures { input: CustomWorldAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldWorksListResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_profile_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_profile_and_return_procedure.rs index 246d4d00..5dc9da2f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_profile_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_custom_world_profile_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait delete_custom_world_profile_and_return { input: CustomWorldProfileDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl delete_custom_world_profile_and_return for super::RemoteProcedures { input: CustomWorldProfileDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldProfileListResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_match_3_d_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_match_3_d_work_procedure.rs index c26b2dc8..c87cd16a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/delete_match_3_d_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_match_3_d_work_procedure.rs @@ -31,10 +31,10 @@ pub trait delete_match_3_d_work { input: Match3DWorkDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl delete_match_3_d_work for super::RemoteProcedures { input: Match3DWorkDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_puzzle_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_puzzle_work_procedure.rs index 5b7e5375..fc8152c5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/delete_puzzle_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_puzzle_work_procedure.rs @@ -31,10 +31,10 @@ pub trait delete_puzzle_work { input: PuzzleWorkDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl delete_puzzle_work for super::RemoteProcedures { input: PuzzleWorkDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_runtime_snapshot_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_runtime_snapshot_and_return_procedure.rs index 6373a19b..9173255a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/delete_runtime_snapshot_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_runtime_snapshot_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait delete_runtime_snapshot_and_return { input: RuntimeSnapshotDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl delete_runtime_snapshot_and_return for super::RemoteProcedures { input: RuntimeSnapshotDeleteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeSnapshotProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/delete_square_hole_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/delete_square_hole_work_procedure.rs new file mode 100644 index 00000000..3a8db794 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/delete_square_hole_work_procedure.rs @@ -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::square_hole_work_delete_input_type::SquareHoleWorkDeleteInput; +use super::square_hole_works_procedure_result_type::SquareHoleWorksProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct DeleteSquareHoleWorkArgs { + pub input: SquareHoleWorkDeleteInput, +} + +impl __sdk::InModule for DeleteSquareHoleWorkArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `delete_square_hole_work`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait delete_square_hole_work { + fn delete_square_hole_work(&self, input: SquareHoleWorkDeleteInput) { + self.delete_square_hole_work_then(input, |_, _| {}); + } + + fn delete_square_hole_work_then( + &self, + input: SquareHoleWorkDeleteInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl delete_square_hole_work for super::RemoteProcedures { + fn delete_square_hole_work_then( + &self, + input: SquareHoleWorkDeleteInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleWorksProcedureResult>( + "delete_square_hole_work", + DeleteSquareHoleWorkArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/drag_puzzle_piece_or_group_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/drag_puzzle_piece_or_group_procedure.rs index daad89bd..1207f7b5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/drag_puzzle_piece_or_group_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/drag_puzzle_piece_or_group_procedure.rs @@ -31,10 +31,10 @@ pub trait drag_puzzle_piece_or_group { input: PuzzleRunDragInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl drag_puzzle_piece_or_group for super::RemoteProcedures { input: PuzzleRunDragInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/drop_square_hole_shape_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/drop_square_hole_shape_procedure.rs new file mode 100644 index 00000000..4056e06a --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/drop_square_hole_shape_procedure.rs @@ -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::square_hole_drop_shape_procedure_result_type::SquareHoleDropShapeProcedureResult; +use super::square_hole_run_drop_input_type::SquareHoleRunDropInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct DropSquareHoleShapeArgs { + pub input: SquareHoleRunDropInput, +} + +impl __sdk::InModule for DropSquareHoleShapeArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `drop_square_hole_shape`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait drop_square_hole_shape { + fn drop_square_hole_shape(&self, input: SquareHoleRunDropInput) { + self.drop_square_hole_shape_then(input, |_, _| {}); + } + + fn drop_square_hole_shape_then( + &self, + input: SquareHoleRunDropInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl drop_square_hole_shape for super::RemoteProcedures { + fn drop_square_hole_shape_then( + &self, + input: SquareHoleRunDropInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleDropShapeProcedureResult>( + "drop_square_hole_shape", + DropSquareHoleShapeArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/ensure_analytics_date_dimension_for_date_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/ensure_analytics_date_dimension_for_date_reducer.rs index 30b9ba35..a6ea3098 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/ensure_analytics_date_dimension_for_date_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/ensure_analytics_date_dimension_for_date_reducer.rs @@ -50,9 +50,11 @@ pub trait ensure_analytics_date_dimension_for_date { &self, input: AnalyticsDateDimensionEnsureInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl ensure_analytics_date_dimension_for_date for super::RemoteReducers { &self, input: AnalyticsDateDimensionEnsureInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp.invoke_reducer_with_callback( EnsureAnalyticsDateDimensionForDateArgs { input }, diff --git a/server-rs/crates/spacetime-client/src/module_bindings/execute_custom_world_agent_action_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/execute_custom_world_agent_action_procedure.rs index e778877c..c1008466 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/execute_custom_world_agent_action_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/execute_custom_world_agent_action_procedure.rs @@ -31,10 +31,10 @@ pub trait execute_custom_world_agent_action { input: CustomWorldAgentActionExecuteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl execute_custom_world_agent_action for super::RemoteProcedures { input: CustomWorldAgentActionExecuteInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentActionExecuteResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/export_auth_store_snapshot_from_tables_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/export_auth_store_snapshot_from_tables_procedure.rs index 9f8842ad..9e8059fa 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/export_auth_store_snapshot_from_tables_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/export_auth_store_snapshot_from_tables_procedure.rs @@ -27,10 +27,10 @@ pub trait export_auth_store_snapshot_from_tables { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -39,10 +39,10 @@ impl export_auth_store_snapshot_from_tables for super::RemoteProcedures { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AuthStoreSnapshotProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/export_database_migration_to_file_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/export_database_migration_to_file_procedure.rs index 3dfe18f8..d850737b 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/export_database_migration_to_file_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/export_database_migration_to_file_procedure.rs @@ -31,10 +31,10 @@ pub trait export_database_migration_to_file { input: DatabaseMigrationExportInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl export_database_migration_to_file for super::RemoteProcedures { input: DatabaseMigrationExportInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/fail_ai_task_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/fail_ai_task_and_return_procedure.rs index 46090a01..3194799b 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/fail_ai_task_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/fail_ai_task_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait fail_ai_task_and_return { input: AiTaskFailureInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl fail_ai_task_and_return for super::RemoteProcedures { input: AiTaskFailureInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AiTaskProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finalize_big_fish_agent_message_turn_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finalize_big_fish_agent_message_turn_procedure.rs index 9f5c8e7a..a2dd9fd5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/finalize_big_fish_agent_message_turn_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/finalize_big_fish_agent_message_turn_procedure.rs @@ -31,10 +31,10 @@ pub trait finalize_big_fish_agent_message_turn { input: BigFishMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl finalize_big_fish_agent_message_turn for super::RemoteProcedures { input: BigFishMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finalize_custom_world_agent_message_turn_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finalize_custom_world_agent_message_turn_procedure.rs index fad75a7b..f670f9b6 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/finalize_custom_world_agent_message_turn_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/finalize_custom_world_agent_message_turn_procedure.rs @@ -34,10 +34,10 @@ pub trait finalize_custom_world_agent_message_turn { input: CustomWorldAgentMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl finalize_custom_world_agent_message_turn for super::RemoteProcedures { input: CustomWorldAgentMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentOperationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finalize_match_3_d_agent_message_turn_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finalize_match_3_d_agent_message_turn_procedure.rs index 9d51ab95..ea0ec225 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/finalize_match_3_d_agent_message_turn_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/finalize_match_3_d_agent_message_turn_procedure.rs @@ -31,10 +31,10 @@ pub trait finalize_match_3_d_agent_message_turn { input: Match3DAgentMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl finalize_match_3_d_agent_message_turn for super::RemoteProcedures { input: Match3DAgentMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finalize_puzzle_agent_message_turn_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finalize_puzzle_agent_message_turn_procedure.rs index 0014d394..7f06aafa 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/finalize_puzzle_agent_message_turn_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/finalize_puzzle_agent_message_turn_procedure.rs @@ -31,10 +31,10 @@ pub trait finalize_puzzle_agent_message_turn { input: PuzzleAgentMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl finalize_puzzle_agent_message_turn for super::RemoteProcedures { input: PuzzleAgentMessageFinalizeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finalize_square_hole_agent_message_turn_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finalize_square_hole_agent_message_turn_procedure.rs new file mode 100644 index 00000000..350f160d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/finalize_square_hole_agent_message_turn_procedure.rs @@ -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::square_hole_agent_message_finalize_input_type::SquareHoleAgentMessageFinalizeInput; +use super::square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct FinalizeSquareHoleAgentMessageTurnArgs { + pub input: SquareHoleAgentMessageFinalizeInput, +} + +impl __sdk::InModule for FinalizeSquareHoleAgentMessageTurnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `finalize_square_hole_agent_message_turn`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait finalize_square_hole_agent_message_turn { + fn finalize_square_hole_agent_message_turn(&self, input: SquareHoleAgentMessageFinalizeInput) { + self.finalize_square_hole_agent_message_turn_then(input, |_, _| {}); + } + + fn finalize_square_hole_agent_message_turn_then( + &self, + input: SquareHoleAgentMessageFinalizeInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl finalize_square_hole_agent_message_turn for super::RemoteProcedures { + fn finalize_square_hole_agent_message_turn_then( + &self, + input: SquareHoleAgentMessageFinalizeInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleAgentSessionProcedureResult>( + "finalize_square_hole_agent_message_turn", + FinalizeSquareHoleAgentMessageTurnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finish_match_3_d_time_up_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finish_match_3_d_time_up_procedure.rs index 0d68dbd9..bd849631 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/finish_match_3_d_time_up_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/finish_match_3_d_time_up_procedure.rs @@ -31,10 +31,10 @@ pub trait finish_match_3_d_time_up { input: Match3DRunTimeUpInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl finish_match_3_d_time_up for super::RemoteProcedures { input: Match3DRunTimeUpInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/finish_square_hole_time_up_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/finish_square_hole_time_up_procedure.rs new file mode 100644 index 00000000..3ca46a0d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/finish_square_hole_time_up_procedure.rs @@ -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::square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; +use super::square_hole_run_time_up_input_type::SquareHoleRunTimeUpInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct FinishSquareHoleTimeUpArgs { + pub input: SquareHoleRunTimeUpInput, +} + +impl __sdk::InModule for FinishSquareHoleTimeUpArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `finish_square_hole_time_up`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait finish_square_hole_time_up { + fn finish_square_hole_time_up(&self, input: SquareHoleRunTimeUpInput) { + self.finish_square_hole_time_up_then(input, |_, _| {}); + } + + fn finish_square_hole_time_up_then( + &self, + input: SquareHoleRunTimeUpInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl finish_square_hole_time_up for super::RemoteProcedures { + fn finish_square_hole_time_up_then( + &self, + input: SquareHoleRunTimeUpInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleRunProcedureResult>( + "finish_square_hole_time_up", + FinishSquareHoleTimeUpArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/generate_big_fish_asset_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/generate_big_fish_asset_procedure.rs index 1a87c951..144c5d40 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/generate_big_fish_asset_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/generate_big_fish_asset_procedure.rs @@ -31,10 +31,10 @@ pub trait generate_big_fish_asset { input: BigFishAssetGenerateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl generate_big_fish_asset for super::RemoteProcedures { input: BigFishAssetGenerateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_auth_store_snapshot_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_auth_store_snapshot_procedure.rs index 51b3d201..61c5f8fd 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_auth_store_snapshot_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_auth_store_snapshot_procedure.rs @@ -27,10 +27,10 @@ pub trait get_auth_store_snapshot { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -39,10 +39,10 @@ impl get_auth_store_snapshot for super::RemoteProcedures { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AuthStoreSnapshotProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_battle_state_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_battle_state_procedure.rs index a737fbdf..0fcc276c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_battle_state_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_battle_state_procedure.rs @@ -31,10 +31,10 @@ pub trait get_battle_state { input: BattleStateQueryInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_battle_state for super::RemoteProcedures { input: BattleStateQueryInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BattleStateProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_run_procedure.rs index 867a6759..9a601ff2 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_run_procedure.rs @@ -31,10 +31,10 @@ pub trait get_big_fish_run { input: BigFishRunGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_big_fish_run for super::RemoteProcedures { input: BigFishRunGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_session_procedure.rs index 0b0d78f1..7f52f94b 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_big_fish_session_procedure.rs @@ -31,10 +31,10 @@ pub trait get_big_fish_session { input: BigFishSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_big_fish_session for super::RemoteProcedures { input: BigFishSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_chapter_progression_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_chapter_progression_procedure.rs index eef158dc..18f9ae27 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_chapter_progression_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_chapter_progression_procedure.rs @@ -31,10 +31,10 @@ pub trait get_chapter_progression { input: ChapterProgressionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_chapter_progression for super::RemoteProcedures { input: ChapterProgressionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, ChapterProgressionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_card_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_card_detail_procedure.rs index 11a90329..e1034345 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_card_detail_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_card_detail_procedure.rs @@ -31,10 +31,10 @@ pub trait get_custom_world_agent_card_detail { input: CustomWorldAgentCardDetailGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_custom_world_agent_card_detail for super::RemoteProcedures { input: CustomWorldAgentCardDetailGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldDraftCardDetailResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_operation_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_operation_procedure.rs index 1c4ffd6a..cce1dbb5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_operation_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_operation_procedure.rs @@ -31,10 +31,10 @@ pub trait get_custom_world_agent_operation { input: CustomWorldAgentOperationGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_custom_world_agent_operation for super::RemoteProcedures { input: CustomWorldAgentOperationGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentOperationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_session_procedure.rs index 212987e4..f4b678e9 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait get_custom_world_agent_session { input: CustomWorldAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_custom_world_agent_session for super::RemoteProcedures { input: CustomWorldAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_by_code_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_by_code_procedure.rs index 24768c43..a387cbaf 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_by_code_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_by_code_procedure.rs @@ -31,10 +31,10 @@ pub trait get_custom_world_gallery_detail_by_code { input: CustomWorldGalleryDetailByCodeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_custom_world_gallery_detail_by_code for super::RemoteProcedures { input: CustomWorldGalleryDetailByCodeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_procedure.rs index f5127dcf..d0e029ff 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_gallery_detail_procedure.rs @@ -31,10 +31,10 @@ pub trait get_custom_world_gallery_detail { input: CustomWorldGalleryDetailInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_custom_world_gallery_detail for super::RemoteProcedures { input: CustomWorldGalleryDetailInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_library_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_library_detail_procedure.rs index ab99274a..82bd1c3c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_library_detail_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_custom_world_library_detail_procedure.rs @@ -31,10 +31,10 @@ pub trait get_custom_world_library_detail { input: CustomWorldLibraryDetailInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_custom_world_library_detail for super::RemoteProcedures { input: CustomWorldLibraryDetailInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_agent_session_procedure.rs index 62d093b5..574012d9 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait get_match_3_d_agent_session { input: Match3DAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_match_3_d_agent_session for super::RemoteProcedures { input: Match3DAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_run_procedure.rs index 033e620c..0a472230 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_run_procedure.rs @@ -31,10 +31,10 @@ pub trait get_match_3_d_run { input: Match3DRunGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_match_3_d_run for super::RemoteProcedures { input: Match3DRunGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_work_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_work_detail_procedure.rs index 5a74982b..0ea9f495 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_work_detail_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_match_3_d_work_detail_procedure.rs @@ -31,10 +31,10 @@ pub trait get_match_3_d_work_detail { input: Match3DWorkGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_match_3_d_work_detail for super::RemoteProcedures { input: Match3DWorkGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_player_progression_or_default_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_player_progression_or_default_procedure.rs index 97c139fb..38a1525a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_player_progression_or_default_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_player_progression_or_default_procedure.rs @@ -31,10 +31,10 @@ pub trait get_player_progression_or_default { input: PlayerProgressionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_player_progression_or_default for super::RemoteProcedures { input: PlayerProgressionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PlayerProgressionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_dashboard_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_dashboard_procedure.rs index 38200b75..6c48fafb 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_dashboard_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_dashboard_procedure.rs @@ -31,10 +31,10 @@ pub trait get_profile_dashboard { input: RuntimeProfileDashboardGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_profile_dashboard for super::RemoteProcedures { input: RuntimeProfileDashboardGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileDashboardProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_play_stats_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_play_stats_procedure.rs index 2ad47ed2..088f4812 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_play_stats_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_play_stats_procedure.rs @@ -31,10 +31,10 @@ pub trait get_profile_play_stats { input: RuntimeProfilePlayStatsGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_profile_play_stats for super::RemoteProcedures { input: RuntimeProfilePlayStatsGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfilePlayStatsProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_recharge_center_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_recharge_center_procedure.rs index bf070c9c..3e42f3d5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_recharge_center_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_recharge_center_procedure.rs @@ -31,10 +31,10 @@ pub trait get_profile_recharge_center { input: RuntimeProfileRechargeCenterGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_profile_recharge_center for super::RemoteProcedures { input: RuntimeProfileRechargeCenterGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileRechargeCenterProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_referral_invite_center_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_referral_invite_center_procedure.rs index 2b3dcdad..c7221484 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_referral_invite_center_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_referral_invite_center_procedure.rs @@ -31,10 +31,10 @@ pub trait get_profile_referral_invite_center { input: RuntimeReferralInviteCenterGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_profile_referral_invite_center for super::RemoteProcedures { input: RuntimeReferralInviteCenterGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeReferralInviteCenterProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_task_center_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_task_center_procedure.rs index 105a4f98..0aa83260 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_profile_task_center_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_profile_task_center_procedure.rs @@ -31,10 +31,10 @@ pub trait get_profile_task_center { input: RuntimeProfileTaskCenterGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_profile_task_center for super::RemoteProcedures { input: RuntimeProfileTaskCenterGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileTaskCenterProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_agent_session_procedure.rs index 97929382..8aa5a78f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_agent_session_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_agent_session_procedure.rs @@ -31,10 +31,10 @@ pub trait get_puzzle_agent_session { input: PuzzleAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_puzzle_agent_session for super::RemoteProcedures { input: PuzzleAgentSessionGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_gallery_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_gallery_detail_procedure.rs index a1471eb3..85b70081 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_gallery_detail_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_gallery_detail_procedure.rs @@ -31,10 +31,10 @@ pub trait get_puzzle_gallery_detail { input: PuzzleWorkGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_puzzle_gallery_detail for super::RemoteProcedures { input: PuzzleWorkGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_run_procedure.rs index 2db5ab66..d09fc285 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_run_procedure.rs @@ -31,10 +31,10 @@ pub trait get_puzzle_run { input: PuzzleRunGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_puzzle_run for super::RemoteProcedures { input: PuzzleRunGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_work_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_work_detail_procedure.rs index d36c7417..0d6c4f70 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_work_detail_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_puzzle_work_detail_procedure.rs @@ -31,10 +31,10 @@ pub trait get_puzzle_work_detail { input: PuzzleWorkGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_puzzle_work_detail for super::RemoteProcedures { input: PuzzleWorkGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_inventory_state_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_inventory_state_procedure.rs index abbf4f20..c8dfefac 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_inventory_state_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_inventory_state_procedure.rs @@ -31,10 +31,10 @@ pub trait get_runtime_inventory_state { input: RuntimeInventoryStateQueryInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_runtime_inventory_state for super::RemoteProcedures { input: RuntimeInventoryStateQueryInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeInventoryStateProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_setting_or_default_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_setting_or_default_procedure.rs index 261caed1..4ca8b03e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_setting_or_default_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_setting_or_default_procedure.rs @@ -31,10 +31,10 @@ pub trait get_runtime_setting_or_default { input: RuntimeSettingGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_runtime_setting_or_default for super::RemoteProcedures { input: RuntimeSettingGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeSettingProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_snapshot_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_snapshot_procedure.rs index 989fa40e..7f9feb4f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_snapshot_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_runtime_snapshot_procedure.rs @@ -31,10 +31,10 @@ pub trait get_runtime_snapshot { input: RuntimeSnapshotGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_runtime_snapshot for super::RemoteProcedures { input: RuntimeSnapshotGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeSnapshotProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_agent_session_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_agent_session_procedure.rs new file mode 100644 index 00000000..1db6459e --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_agent_session_procedure.rs @@ -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::square_hole_agent_session_get_input_type::SquareHoleAgentSessionGetInput; +use super::square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct GetSquareHoleAgentSessionArgs { + pub input: SquareHoleAgentSessionGetInput, +} + +impl __sdk::InModule for GetSquareHoleAgentSessionArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `get_square_hole_agent_session`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait get_square_hole_agent_session { + fn get_square_hole_agent_session(&self, input: SquareHoleAgentSessionGetInput) { + self.get_square_hole_agent_session_then(input, |_, _| {}); + } + + fn get_square_hole_agent_session_then( + &self, + input: SquareHoleAgentSessionGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl get_square_hole_agent_session for super::RemoteProcedures { + fn get_square_hole_agent_session_then( + &self, + input: SquareHoleAgentSessionGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleAgentSessionProcedureResult>( + "get_square_hole_agent_session", + GetSquareHoleAgentSessionArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_run_procedure.rs new file mode 100644 index 00000000..5082e790 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_run_procedure.rs @@ -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::square_hole_run_get_input_type::SquareHoleRunGetInput; +use super::square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct GetSquareHoleRunArgs { + pub input: SquareHoleRunGetInput, +} + +impl __sdk::InModule for GetSquareHoleRunArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `get_square_hole_run`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait get_square_hole_run { + fn get_square_hole_run(&self, input: SquareHoleRunGetInput) { + self.get_square_hole_run_then(input, |_, _| {}); + } + + fn get_square_hole_run_then( + &self, + input: SquareHoleRunGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl get_square_hole_run for super::RemoteProcedures { + fn get_square_hole_run_then( + &self, + input: SquareHoleRunGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleRunProcedureResult>( + "get_square_hole_run", + GetSquareHoleRunArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_work_detail_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_work_detail_procedure.rs new file mode 100644 index 00000000..67a16a07 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_square_hole_work_detail_procedure.rs @@ -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::square_hole_work_get_input_type::SquareHoleWorkGetInput; +use super::square_hole_work_procedure_result_type::SquareHoleWorkProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct GetSquareHoleWorkDetailArgs { + pub input: SquareHoleWorkGetInput, +} + +impl __sdk::InModule for GetSquareHoleWorkDetailArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `get_square_hole_work_detail`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait get_square_hole_work_detail { + fn get_square_hole_work_detail(&self, input: SquareHoleWorkGetInput) { + self.get_square_hole_work_detail_then(input, |_, _| {}); + } + + fn get_square_hole_work_detail_then( + &self, + input: SquareHoleWorkGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl get_square_hole_work_detail for super::RemoteProcedures { + fn get_square_hole_work_detail_then( + &self, + input: SquareHoleWorkGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleWorkProcedureResult>( + "get_square_hole_work_detail", + GetSquareHoleWorkDetailArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_story_session_state_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_story_session_state_procedure.rs index 7e566dc9..44b48ada 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/get_story_session_state_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_story_session_state_procedure.rs @@ -31,10 +31,10 @@ pub trait get_story_session_state { input: StorySessionStateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl get_story_session_state for super::RemoteProcedures { input: StorySessionStateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, StorySessionStateProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/grant_new_user_registration_wallet_reward_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/grant_new_user_registration_wallet_reward_procedure.rs index c1d7b6de..71e48151 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/grant_new_user_registration_wallet_reward_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/grant_new_user_registration_wallet_reward_procedure.rs @@ -31,10 +31,10 @@ pub trait grant_new_user_registration_wallet_reward { input: RuntimeProfileDashboardGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl grant_new_user_registration_wallet_reward for super::RemoteProcedures { input: RuntimeProfileDashboardGetInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileWalletAdjustmentProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_and_return_procedure.rs index 4c67da63..a3f2aa9e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait grant_player_progression_experience_and_return { input: PlayerProgressionGrantInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl grant_player_progression_experience_and_return for super::RemoteProcedures input: PlayerProgressionGrantInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PlayerProgressionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_reducer.rs index 83b48cf7..bd07115e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/grant_player_progression_experience_reducer.rs @@ -50,9 +50,11 @@ pub trait grant_player_progression_experience { &self, input: PlayerProgressionGrantInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl grant_player_progression_experience for super::RemoteReducers { &self, input: PlayerProgressionGrantInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(GrantPlayerProgressionExperienceArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/import_auth_store_snapshot_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/import_auth_store_snapshot_procedure.rs index 2821fddc..b4c2dd4f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/import_auth_store_snapshot_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/import_auth_store_snapshot_procedure.rs @@ -27,10 +27,10 @@ pub trait import_auth_store_snapshot { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -39,10 +39,10 @@ impl import_auth_store_snapshot for super::RemoteProcedures { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AuthStoreSnapshotImportProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_chunks_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_chunks_procedure.rs index 73157480..080dda54 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_chunks_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_chunks_procedure.rs @@ -31,10 +31,10 @@ pub trait import_database_migration_from_chunks { input: DatabaseMigrationImportChunksInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl import_database_migration_from_chunks for super::RemoteProcedures { input: DatabaseMigrationImportChunksInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_file_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_file_procedure.rs index 7b2322ee..2ce4ee2a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_file_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_from_file_procedure.rs @@ -31,10 +31,10 @@ pub trait import_database_migration_from_file { input: DatabaseMigrationImportInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl import_database_migration_from_file for super::RemoteProcedures { input: DatabaseMigrationImportInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_chunks_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_chunks_procedure.rs index 51ff565c..bbe49357 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_chunks_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_chunks_procedure.rs @@ -34,10 +34,10 @@ pub trait import_database_migration_incremental_from_chunks { input: DatabaseMigrationImportChunksInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl import_database_migration_incremental_from_chunks for super::RemoteProcedur input: DatabaseMigrationImportChunksInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_file_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_file_procedure.rs index 2fc31804..f911c87f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_file_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/import_database_migration_incremental_from_file_procedure.rs @@ -31,10 +31,10 @@ pub trait import_database_migration_incremental_from_file { input: DatabaseMigrationImportInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl import_database_migration_incremental_from_file for super::RemoteProcedures input: DatabaseMigrationImportInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_asset_history_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_asset_history_and_return_procedure.rs index bcc2a742..ea689b10 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_asset_history_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_asset_history_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait list_asset_history_and_return { input: AssetHistoryListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_asset_history_and_return for super::RemoteProcedures { input: AssetHistoryListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AssetHistoryListResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_big_fish_works_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_big_fish_works_procedure.rs index 8e4c21ba..45ba04af 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_big_fish_works_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_big_fish_works_procedure.rs @@ -31,10 +31,10 @@ pub trait list_big_fish_works { input: BigFishWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_big_fish_works for super::RemoteProcedures { input: BigFishWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_gallery_entries_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_gallery_entries_procedure.rs index 63ee059f..01f6cb0c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_gallery_entries_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_gallery_entries_procedure.rs @@ -27,10 +27,10 @@ pub trait list_custom_world_gallery_entries { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -39,10 +39,10 @@ impl list_custom_world_gallery_entries for super::RemoteProcedures { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldGalleryListResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_profiles_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_profiles_procedure.rs index f8834945..c42ce2c6 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_profiles_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_profiles_procedure.rs @@ -31,10 +31,10 @@ pub trait list_custom_world_profiles { input: CustomWorldProfileListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_custom_world_profiles for super::RemoteProcedures { input: CustomWorldProfileListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldProfileListResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_works_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_works_procedure.rs index d469f660..77f48ba6 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_works_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_custom_world_works_procedure.rs @@ -31,10 +31,10 @@ pub trait list_custom_world_works { input: CustomWorldWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_custom_world_works for super::RemoteProcedures { input: CustomWorldWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldWorksListResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_match_3_d_works_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_match_3_d_works_procedure.rs index b1477034..c593e848 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_match_3_d_works_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_match_3_d_works_procedure.rs @@ -31,10 +31,10 @@ pub trait list_match_3_d_works { input: Match3DWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_match_3_d_works for super::RemoteProcedures { input: Match3DWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_platform_browse_history_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_platform_browse_history_procedure.rs index 0d368a99..00176656 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_platform_browse_history_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_platform_browse_history_procedure.rs @@ -31,10 +31,10 @@ pub trait list_platform_browse_history { input: RuntimeBrowseHistoryListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_platform_browse_history for super::RemoteProcedures { input: RuntimeBrowseHistoryListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeBrowseHistoryProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_profile_save_archives_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_profile_save_archives_procedure.rs index 31c214bb..1c7176cf 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_profile_save_archives_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_profile_save_archives_procedure.rs @@ -31,10 +31,10 @@ pub trait list_profile_save_archives { input: RuntimeProfileSaveArchiveListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_profile_save_archives for super::RemoteProcedures { input: RuntimeProfileSaveArchiveListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileSaveArchiveProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_profile_wallet_ledger_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_profile_wallet_ledger_procedure.rs index 23496701..d51f0df2 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_profile_wallet_ledger_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_profile_wallet_ledger_procedure.rs @@ -31,10 +31,10 @@ pub trait list_profile_wallet_ledger { input: RuntimeProfileWalletLedgerListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_profile_wallet_ledger for super::RemoteProcedures { input: RuntimeProfileWalletLedgerListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileWalletLedgerProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_gallery_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_gallery_procedure.rs index 553b8e08..e62fd064 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_gallery_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_gallery_procedure.rs @@ -27,10 +27,10 @@ pub trait list_puzzle_gallery { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -39,10 +39,10 @@ impl list_puzzle_gallery for super::RemoteProcedures { &self, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_works_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_works_procedure.rs index 844d16df..1da004e9 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_works_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_puzzle_works_procedure.rs @@ -31,10 +31,10 @@ pub trait list_puzzle_works { input: PuzzleWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl list_puzzle_works for super::RemoteProcedures { input: PuzzleWorksListInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_square_hole_works_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_square_hole_works_procedure.rs new file mode 100644 index 00000000..1c706a8c --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_square_hole_works_procedure.rs @@ -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::square_hole_works_list_input_type::SquareHoleWorksListInput; +use super::square_hole_works_procedure_result_type::SquareHoleWorksProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct ListSquareHoleWorksArgs { + pub input: SquareHoleWorksListInput, +} + +impl __sdk::InModule for ListSquareHoleWorksArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `list_square_hole_works`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait list_square_hole_works { + fn list_square_hole_works(&self, input: SquareHoleWorksListInput) { + self.list_square_hole_works_then(input, |_, _| {}); + } + + fn list_square_hole_works_then( + &self, + input: SquareHoleWorksListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl list_square_hole_works for super::RemoteProcedures { + fn list_square_hole_works_then( + &self, + input: SquareHoleWorksListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleWorksProcedureResult>( + "list_square_hole_works", + ListSquareHoleWorksArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/mod.rs b/server-rs/crates/spacetime-client/src/module_bindings/mod.rs index e7457a3e..b4ffcbd4 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/mod.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/mod.rs @@ -1,7 +1,7 @@ // THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE // WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. -// This was generated using spacetimedb cli version 2.1.0 (commit 6981f48b4bc1a71c8dd9bdfe5a2c343f6370243d). +// This was generated using spacetimedb cli version 2.1.0 (commit 10a4779b1338eff3708493d87496b51842a7c412). #![allow(unused, clippy::all)] use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; @@ -48,10 +48,14 @@ pub mod ai_text_chunk_append_input_type; pub mod ai_text_chunk_snapshot_type; pub mod ai_text_chunk_table; pub mod ai_text_chunk_type; +pub mod analytics_bucket_metric_type; pub mod analytics_date_dimension_ensure_input_type; pub mod analytics_date_dimension_seed_input_type; pub mod analytics_date_dimension_table; pub mod analytics_date_dimension_type; +pub mod analytics_granularity_type; +pub mod analytics_metric_query_input_type; +pub mod analytics_metric_query_procedure_result_type; pub mod append_ai_text_chunk_and_return_procedure; pub mod apply_chapter_progression_ledger_entry_and_return_procedure; pub mod apply_chapter_progression_ledger_entry_reducer; @@ -162,6 +166,7 @@ pub mod compile_big_fish_draft_procedure; pub mod compile_custom_world_published_profile_procedure; pub mod compile_match_3_d_draft_procedure; pub mod compile_puzzle_agent_draft_procedure; +pub mod compile_square_hole_draft_procedure; pub mod complete_ai_stage_and_return_procedure; pub mod complete_ai_task_and_return_procedure; pub mod confirm_asset_object_and_return_procedure; @@ -179,6 +184,7 @@ pub mod create_custom_world_agent_session_procedure; pub mod create_match_3_d_agent_session_procedure; pub mod create_profile_recharge_order_and_return_procedure; pub mod create_puzzle_agent_session_procedure; +pub mod create_square_hole_agent_session_procedure; pub mod custom_world_agent_action_execute_input_type; pub mod custom_world_agent_action_execute_result_type; pub mod custom_world_agent_card_detail_get_input_type; @@ -261,7 +267,9 @@ pub mod delete_custom_world_profile_and_return_procedure; pub mod delete_match_3_d_work_procedure; pub mod delete_puzzle_work_procedure; pub mod delete_runtime_snapshot_and_return_procedure; +pub mod delete_square_hole_work_procedure; pub mod drag_puzzle_piece_or_group_procedure; +pub mod drop_square_hole_shape_procedure; pub mod ensure_analytics_date_dimension_for_date_reducer; pub mod equip_inventory_item_input_type; pub mod execute_custom_world_agent_action_procedure; @@ -272,7 +280,9 @@ pub mod finalize_big_fish_agent_message_turn_procedure; pub mod finalize_custom_world_agent_message_turn_procedure; pub mod finalize_match_3_d_agent_message_turn_procedure; pub mod finalize_puzzle_agent_message_turn_procedure; +pub mod finalize_square_hole_agent_message_turn_procedure; pub mod finish_match_3_d_time_up_procedure; +pub mod finish_square_hole_time_up_procedure; pub mod generate_big_fish_asset_procedure; pub mod get_auth_store_snapshot_procedure; pub mod get_battle_state_procedure; @@ -301,6 +311,9 @@ pub mod get_puzzle_work_detail_procedure; pub mod get_runtime_inventory_state_procedure; pub mod get_runtime_setting_or_default_procedure; pub mod get_runtime_snapshot_procedure; +pub mod get_square_hole_agent_session_procedure; +pub mod get_square_hole_run_procedure; +pub mod get_square_hole_work_detail_procedure; pub mod get_story_session_state_procedure; pub mod grant_inventory_item_input_type; pub mod grant_new_user_registration_wallet_reward_procedure; @@ -332,6 +345,7 @@ pub mod list_profile_save_archives_procedure; pub mod list_profile_wallet_ledger_procedure; pub mod list_puzzle_gallery_procedure; pub mod list_puzzle_works_procedure; +pub mod list_square_hole_works_procedure; pub mod match_3_d_agent_message_finalize_input_type; pub mod match_3_d_agent_message_row_type; pub mod match_3_d_agent_message_submit_input_type; @@ -419,6 +433,7 @@ pub mod publish_custom_world_profile_reducer; pub mod publish_custom_world_world_procedure; pub mod publish_match_3_d_work_procedure; pub mod publish_puzzle_work_procedure; +pub mod publish_square_hole_work_procedure; pub mod put_database_migration_import_chunk_procedure; pub mod puzzle_agent_message_finalize_input_type; pub mod puzzle_agent_message_kind_type; @@ -465,6 +480,7 @@ pub mod puzzle_work_remix_input_type; pub mod puzzle_work_upsert_input_type; pub mod puzzle_works_list_input_type; pub mod puzzle_works_procedure_result_type; +pub mod query_analytics_metric_procedure; pub mod quest_completion_ack_input_type; pub mod quest_hostile_npc_defeated_signal_type; pub mod quest_item_delivered_signal_type; @@ -523,6 +539,7 @@ pub mod resolve_npc_social_action_reducer; pub mod resolve_treasure_interaction_and_return_procedure; pub mod resolve_treasure_interaction_reducer; pub mod restart_match_3_d_run_procedure; +pub mod restart_square_hole_run_procedure; pub mod resume_profile_save_archive_and_return_procedure; pub mod revoke_database_migration_operator_procedure; pub mod rpg_agent_draft_card_kind_type; @@ -630,12 +647,43 @@ pub mod save_puzzle_form_draft_procedure; pub mod save_puzzle_generated_images_procedure; pub mod seed_analytics_date_dimensions_reducer; pub mod select_puzzle_cover_image_procedure; +pub mod square_hole_agent_message_finalize_input_type; +pub mod square_hole_agent_message_row_type; +pub mod square_hole_agent_message_submit_input_type; +pub mod square_hole_agent_message_table; +pub mod square_hole_agent_session_create_input_type; +pub mod square_hole_agent_session_get_input_type; +pub mod square_hole_agent_session_procedure_result_type; +pub mod square_hole_agent_session_row_type; +pub mod square_hole_agent_session_table; +pub mod square_hole_draft_compile_input_type; +pub mod square_hole_drop_shape_procedure_result_type; +pub mod square_hole_run_drop_input_type; +pub mod square_hole_run_get_input_type; +pub mod square_hole_run_procedure_result_type; +pub mod square_hole_run_restart_input_type; +pub mod square_hole_run_start_input_type; +pub mod square_hole_run_stop_input_type; +pub mod square_hole_run_time_up_input_type; +pub mod square_hole_runtime_run_row_type; +pub mod square_hole_runtime_run_table; +pub mod square_hole_work_delete_input_type; +pub mod square_hole_work_get_input_type; +pub mod square_hole_work_procedure_result_type; +pub mod square_hole_work_profile_row_type; +pub mod square_hole_work_profile_table; +pub mod square_hole_work_publish_input_type; +pub mod square_hole_work_update_input_type; +pub mod square_hole_works_list_input_type; +pub mod square_hole_works_procedure_result_type; pub mod start_ai_task_reducer; pub mod start_ai_task_stage_reducer; pub mod start_big_fish_run_procedure; pub mod start_match_3_d_run_procedure; pub mod start_puzzle_run_procedure; +pub mod start_square_hole_run_procedure; pub mod stop_match_3_d_run_procedure; +pub mod stop_square_hole_run_procedure; pub mod story_continue_input_type; pub mod story_event_kind_type; pub mod story_event_snapshot_type; @@ -655,6 +703,7 @@ pub mod submit_custom_world_agent_message_procedure; pub mod submit_match_3_d_agent_message_procedure; pub mod submit_puzzle_agent_message_procedure; pub mod submit_puzzle_leaderboard_entry_procedure; +pub mod submit_square_hole_agent_message_procedure; pub mod swap_puzzle_pieces_procedure; pub mod tracking_daily_stat_table; pub mod tracking_daily_stat_type; @@ -673,6 +722,7 @@ pub mod unpublish_custom_world_profile_reducer; pub mod update_match_3_d_work_procedure; pub mod update_puzzle_run_pause_procedure; pub mod update_puzzle_work_procedure; +pub mod update_square_hole_work_procedure; pub mod upsert_auth_store_snapshot_procedure; pub mod upsert_chapter_progression_and_return_procedure; pub mod upsert_chapter_progression_reducer; @@ -690,12 +740,6 @@ pub mod user_account_type; pub mod user_browse_history_table; pub mod user_browse_history_type; -pub mod analytics_bucket_metric_type; -pub mod analytics_granularity_type; -pub mod analytics_metric_query_input_type; -pub mod analytics_metric_query_procedure_result_type; -pub mod query_analytics_metric_procedure; - pub use accept_quest_reducer::accept_quest; pub use acknowledge_quest_completion_reducer::acknowledge_quest_completion; pub use admin_disable_profile_redeem_code_procedure::admin_disable_profile_redeem_code; @@ -738,11 +782,11 @@ pub use ai_text_chunk_append_input_type::AiTextChunkAppendInput; pub use ai_text_chunk_snapshot_type::AiTextChunkSnapshot; pub use ai_text_chunk_table::*; pub use ai_text_chunk_type::AiTextChunk; +pub use analytics_bucket_metric_type::AnalyticsBucketMetric; pub use analytics_date_dimension_ensure_input_type::AnalyticsDateDimensionEnsureInput; pub use analytics_date_dimension_seed_input_type::AnalyticsDateDimensionSeedInput; pub use analytics_date_dimension_table::*; pub use analytics_date_dimension_type::AnalyticsDateDimension; -pub use analytics_bucket_metric_type::AnalyticsBucketMetric; pub use analytics_granularity_type::AnalyticsGranularity; pub use analytics_metric_query_input_type::AnalyticsMetricQueryInput; pub use analytics_metric_query_procedure_result_type::AnalyticsMetricQueryProcedureResult; @@ -856,6 +900,7 @@ pub use compile_big_fish_draft_procedure::compile_big_fish_draft; pub use compile_custom_world_published_profile_procedure::compile_custom_world_published_profile; pub use compile_match_3_d_draft_procedure::compile_match_3_d_draft; pub use compile_puzzle_agent_draft_procedure::compile_puzzle_agent_draft; +pub use compile_square_hole_draft_procedure::compile_square_hole_draft; pub use complete_ai_stage_and_return_procedure::complete_ai_stage_and_return; pub use complete_ai_task_and_return_procedure::complete_ai_task_and_return; pub use confirm_asset_object_and_return_procedure::confirm_asset_object_and_return; @@ -873,6 +918,7 @@ pub use create_custom_world_agent_session_procedure::create_custom_world_agent_s pub use create_match_3_d_agent_session_procedure::create_match_3_d_agent_session; pub use create_profile_recharge_order_and_return_procedure::create_profile_recharge_order_and_return; pub use create_puzzle_agent_session_procedure::create_puzzle_agent_session; +pub use create_square_hole_agent_session_procedure::create_square_hole_agent_session; pub use custom_world_agent_action_execute_input_type::CustomWorldAgentActionExecuteInput; pub use custom_world_agent_action_execute_result_type::CustomWorldAgentActionExecuteResult; pub use custom_world_agent_card_detail_get_input_type::CustomWorldAgentCardDetailGetInput; @@ -955,7 +1001,9 @@ pub use delete_custom_world_profile_and_return_procedure::delete_custom_world_pr pub use delete_match_3_d_work_procedure::delete_match_3_d_work; pub use delete_puzzle_work_procedure::delete_puzzle_work; pub use delete_runtime_snapshot_and_return_procedure::delete_runtime_snapshot_and_return; +pub use delete_square_hole_work_procedure::delete_square_hole_work; pub use drag_puzzle_piece_or_group_procedure::drag_puzzle_piece_or_group; +pub use drop_square_hole_shape_procedure::drop_square_hole_shape; pub use ensure_analytics_date_dimension_for_date_reducer::ensure_analytics_date_dimension_for_date; pub use equip_inventory_item_input_type::EquipInventoryItemInput; pub use execute_custom_world_agent_action_procedure::execute_custom_world_agent_action; @@ -966,7 +1014,9 @@ pub use finalize_big_fish_agent_message_turn_procedure::finalize_big_fish_agent_ pub use finalize_custom_world_agent_message_turn_procedure::finalize_custom_world_agent_message_turn; pub use finalize_match_3_d_agent_message_turn_procedure::finalize_match_3_d_agent_message_turn; pub use finalize_puzzle_agent_message_turn_procedure::finalize_puzzle_agent_message_turn; +pub use finalize_square_hole_agent_message_turn_procedure::finalize_square_hole_agent_message_turn; pub use finish_match_3_d_time_up_procedure::finish_match_3_d_time_up; +pub use finish_square_hole_time_up_procedure::finish_square_hole_time_up; pub use generate_big_fish_asset_procedure::generate_big_fish_asset; pub use get_auth_store_snapshot_procedure::get_auth_store_snapshot; pub use get_battle_state_procedure::get_battle_state; @@ -988,7 +1038,6 @@ pub use get_profile_play_stats_procedure::get_profile_play_stats; pub use get_profile_recharge_center_procedure::get_profile_recharge_center; pub use get_profile_referral_invite_center_procedure::get_profile_referral_invite_center; pub use get_profile_task_center_procedure::get_profile_task_center; -pub use query_analytics_metric_procedure::query_analytics_metric; pub use get_puzzle_agent_session_procedure::get_puzzle_agent_session; pub use get_puzzle_gallery_detail_procedure::get_puzzle_gallery_detail; pub use get_puzzle_run_procedure::get_puzzle_run; @@ -996,6 +1045,9 @@ pub use get_puzzle_work_detail_procedure::get_puzzle_work_detail; pub use get_runtime_inventory_state_procedure::get_runtime_inventory_state; pub use get_runtime_setting_or_default_procedure::get_runtime_setting_or_default; pub use get_runtime_snapshot_procedure::get_runtime_snapshot; +pub use get_square_hole_agent_session_procedure::get_square_hole_agent_session; +pub use get_square_hole_run_procedure::get_square_hole_run; +pub use get_square_hole_work_detail_procedure::get_square_hole_work_detail; pub use get_story_session_state_procedure::get_story_session_state; pub use grant_inventory_item_input_type::GrantInventoryItemInput; pub use grant_new_user_registration_wallet_reward_procedure::grant_new_user_registration_wallet_reward; @@ -1027,6 +1079,7 @@ pub use list_profile_save_archives_procedure::list_profile_save_archives; pub use list_profile_wallet_ledger_procedure::list_profile_wallet_ledger; pub use list_puzzle_gallery_procedure::list_puzzle_gallery; pub use list_puzzle_works_procedure::list_puzzle_works; +pub use list_square_hole_works_procedure::list_square_hole_works; pub use match_3_d_agent_message_finalize_input_type::Match3DAgentMessageFinalizeInput; pub use match_3_d_agent_message_row_type::Match3DAgentMessageRow; pub use match_3_d_agent_message_submit_input_type::Match3DAgentMessageSubmitInput; @@ -1114,6 +1167,7 @@ pub use publish_custom_world_profile_reducer::publish_custom_world_profile; pub use publish_custom_world_world_procedure::publish_custom_world_world; pub use publish_match_3_d_work_procedure::publish_match_3_d_work; pub use publish_puzzle_work_procedure::publish_puzzle_work; +pub use publish_square_hole_work_procedure::publish_square_hole_work; pub use put_database_migration_import_chunk_procedure::put_database_migration_import_chunk; pub use puzzle_agent_message_finalize_input_type::PuzzleAgentMessageFinalizeInput; pub use puzzle_agent_message_kind_type::PuzzleAgentMessageKind; @@ -1160,6 +1214,7 @@ pub use puzzle_work_remix_input_type::PuzzleWorkRemixInput; pub use puzzle_work_upsert_input_type::PuzzleWorkUpsertInput; pub use puzzle_works_list_input_type::PuzzleWorksListInput; pub use puzzle_works_procedure_result_type::PuzzleWorksProcedureResult; +pub use query_analytics_metric_procedure::query_analytics_metric; pub use quest_completion_ack_input_type::QuestCompletionAckInput; pub use quest_hostile_npc_defeated_signal_type::QuestHostileNpcDefeatedSignal; pub use quest_item_delivered_signal_type::QuestItemDeliveredSignal; @@ -1218,6 +1273,7 @@ pub use resolve_npc_social_action_reducer::resolve_npc_social_action; pub use resolve_treasure_interaction_and_return_procedure::resolve_treasure_interaction_and_return; pub use resolve_treasure_interaction_reducer::resolve_treasure_interaction; pub use restart_match_3_d_run_procedure::restart_match_3_d_run; +pub use restart_square_hole_run_procedure::restart_square_hole_run; pub use resume_profile_save_archive_and_return_procedure::resume_profile_save_archive_and_return; pub use revoke_database_migration_operator_procedure::revoke_database_migration_operator; pub use rpg_agent_draft_card_kind_type::RpgAgentDraftCardKind; @@ -1325,12 +1381,43 @@ pub use save_puzzle_form_draft_procedure::save_puzzle_form_draft; pub use save_puzzle_generated_images_procedure::save_puzzle_generated_images; pub use seed_analytics_date_dimensions_reducer::seed_analytics_date_dimensions; pub use select_puzzle_cover_image_procedure::select_puzzle_cover_image; +pub use square_hole_agent_message_finalize_input_type::SquareHoleAgentMessageFinalizeInput; +pub use square_hole_agent_message_row_type::SquareHoleAgentMessageRow; +pub use square_hole_agent_message_submit_input_type::SquareHoleAgentMessageSubmitInput; +pub use square_hole_agent_message_table::*; +pub use square_hole_agent_session_create_input_type::SquareHoleAgentSessionCreateInput; +pub use square_hole_agent_session_get_input_type::SquareHoleAgentSessionGetInput; +pub use square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; +pub use square_hole_agent_session_row_type::SquareHoleAgentSessionRow; +pub use square_hole_agent_session_table::*; +pub use square_hole_draft_compile_input_type::SquareHoleDraftCompileInput; +pub use square_hole_drop_shape_procedure_result_type::SquareHoleDropShapeProcedureResult; +pub use square_hole_run_drop_input_type::SquareHoleRunDropInput; +pub use square_hole_run_get_input_type::SquareHoleRunGetInput; +pub use square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; +pub use square_hole_run_restart_input_type::SquareHoleRunRestartInput; +pub use square_hole_run_start_input_type::SquareHoleRunStartInput; +pub use square_hole_run_stop_input_type::SquareHoleRunStopInput; +pub use square_hole_run_time_up_input_type::SquareHoleRunTimeUpInput; +pub use square_hole_runtime_run_row_type::SquareHoleRuntimeRunRow; +pub use square_hole_runtime_run_table::*; +pub use square_hole_work_delete_input_type::SquareHoleWorkDeleteInput; +pub use square_hole_work_get_input_type::SquareHoleWorkGetInput; +pub use square_hole_work_procedure_result_type::SquareHoleWorkProcedureResult; +pub use square_hole_work_profile_row_type::SquareHoleWorkProfileRow; +pub use square_hole_work_profile_table::*; +pub use square_hole_work_publish_input_type::SquareHoleWorkPublishInput; +pub use square_hole_work_update_input_type::SquareHoleWorkUpdateInput; +pub use square_hole_works_list_input_type::SquareHoleWorksListInput; +pub use square_hole_works_procedure_result_type::SquareHoleWorksProcedureResult; pub use start_ai_task_reducer::start_ai_task; pub use start_ai_task_stage_reducer::start_ai_task_stage; pub use start_big_fish_run_procedure::start_big_fish_run; pub use start_match_3_d_run_procedure::start_match_3_d_run; pub use start_puzzle_run_procedure::start_puzzle_run; +pub use start_square_hole_run_procedure::start_square_hole_run; pub use stop_match_3_d_run_procedure::stop_match_3_d_run; +pub use stop_square_hole_run_procedure::stop_square_hole_run; pub use story_continue_input_type::StoryContinueInput; pub use story_event_kind_type::StoryEventKind; pub use story_event_snapshot_type::StoryEventSnapshot; @@ -1350,6 +1437,7 @@ pub use submit_custom_world_agent_message_procedure::submit_custom_world_agent_m pub use submit_match_3_d_agent_message_procedure::submit_match_3_d_agent_message; pub use submit_puzzle_agent_message_procedure::submit_puzzle_agent_message; pub use submit_puzzle_leaderboard_entry_procedure::submit_puzzle_leaderboard_entry; +pub use submit_square_hole_agent_message_procedure::submit_square_hole_agent_message; pub use swap_puzzle_pieces_procedure::swap_puzzle_pieces; pub use tracking_daily_stat_table::*; pub use tracking_daily_stat_type::TrackingDailyStat; @@ -1368,6 +1456,7 @@ pub use unpublish_custom_world_profile_reducer::unpublish_custom_world_profile; pub use update_match_3_d_work_procedure::update_match_3_d_work; pub use update_puzzle_run_pause_procedure::update_puzzle_run_pause; pub use update_puzzle_work_procedure::update_puzzle_work; +pub use update_square_hole_work_procedure::update_square_hole_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; pub use upsert_chapter_progression_reducer::upsert_chapter_progression; @@ -1717,6 +1806,10 @@ pub struct DbUpdate { refresh_session: __sdk::TableUpdate, runtime_setting: __sdk::TableUpdate, runtime_snapshot: __sdk::TableUpdate, + square_hole_agent_message: __sdk::TableUpdate, + square_hole_agent_session: __sdk::TableUpdate, + square_hole_runtime_run: __sdk::TableUpdate, + square_hole_work_profile: __sdk::TableUpdate, story_event: __sdk::TableUpdate, story_session: __sdk::TableUpdate, tracking_daily_stat: __sdk::TableUpdate, @@ -1914,6 +2007,18 @@ impl TryFrom<__ws::v2::TransactionUpdate> for DbUpdate { "runtime_snapshot" => db_update .runtime_snapshot .append(runtime_snapshot_table::parse_table_update(table_update)?), + "square_hole_agent_message" => db_update.square_hole_agent_message.append( + square_hole_agent_message_table::parse_table_update(table_update)?, + ), + "square_hole_agent_session" => db_update.square_hole_agent_session.append( + square_hole_agent_session_table::parse_table_update(table_update)?, + ), + "square_hole_runtime_run" => db_update.square_hole_runtime_run.append( + square_hole_runtime_run_table::parse_table_update(table_update)?, + ), + "square_hole_work_profile" => db_update.square_hole_work_profile.append( + square_hole_work_profile_table::parse_table_update(table_update)?, + ), "story_event" => db_update .story_event .append(story_event_table::parse_table_update(table_update)?), @@ -2259,6 +2364,30 @@ impl __sdk::DbUpdate for DbUpdate { diff.runtime_snapshot = cache .apply_diff_to_table::("runtime_snapshot", &self.runtime_snapshot) .with_updates_by_pk(|row| &row.user_id); + diff.square_hole_agent_message = cache + .apply_diff_to_table::( + "square_hole_agent_message", + &self.square_hole_agent_message, + ) + .with_updates_by_pk(|row| &row.message_id); + diff.square_hole_agent_session = cache + .apply_diff_to_table::( + "square_hole_agent_session", + &self.square_hole_agent_session, + ) + .with_updates_by_pk(|row| &row.session_id); + diff.square_hole_runtime_run = cache + .apply_diff_to_table::( + "square_hole_runtime_run", + &self.square_hole_runtime_run, + ) + .with_updates_by_pk(|row| &row.run_id); + diff.square_hole_work_profile = cache + .apply_diff_to_table::( + "square_hole_work_profile", + &self.square_hole_work_profile, + ) + .with_updates_by_pk(|row| &row.profile_id); diff.story_event = cache .apply_diff_to_table::("story_event", &self.story_event) .with_updates_by_pk(|row| &row.event_id); @@ -2473,6 +2602,18 @@ impl __sdk::DbUpdate for DbUpdate { "runtime_snapshot" => db_update .runtime_snapshot .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "square_hole_agent_message" => db_update + .square_hole_agent_message + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "square_hole_agent_session" => db_update + .square_hole_agent_session + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "square_hole_runtime_run" => db_update + .square_hole_runtime_run + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "square_hole_work_profile" => db_update + .square_hole_work_profile + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), "story_event" => db_update .story_event .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), @@ -2687,6 +2828,18 @@ impl __sdk::DbUpdate for DbUpdate { "runtime_snapshot" => db_update .runtime_snapshot .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "square_hole_agent_message" => db_update + .square_hole_agent_message + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "square_hole_agent_session" => db_update + .square_hole_agent_session + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "square_hole_runtime_run" => db_update + .square_hole_runtime_run + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "square_hole_work_profile" => db_update + .square_hole_work_profile + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), "story_event" => db_update .story_event .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), @@ -2783,6 +2936,10 @@ pub struct AppliedDiff<'r> { refresh_session: __sdk::TableAppliedDiff<'r, RefreshSession>, runtime_setting: __sdk::TableAppliedDiff<'r, RuntimeSetting>, runtime_snapshot: __sdk::TableAppliedDiff<'r, RuntimeSnapshotRow>, + square_hole_agent_message: __sdk::TableAppliedDiff<'r, SquareHoleAgentMessageRow>, + square_hole_agent_session: __sdk::TableAppliedDiff<'r, SquareHoleAgentSessionRow>, + square_hole_runtime_run: __sdk::TableAppliedDiff<'r, SquareHoleRuntimeRunRow>, + square_hole_work_profile: __sdk::TableAppliedDiff<'r, SquareHoleWorkProfileRow>, story_event: __sdk::TableAppliedDiff<'r, StoryEvent>, story_session: __sdk::TableAppliedDiff<'r, StorySession>, tracking_daily_stat: __sdk::TableAppliedDiff<'r, TrackingDailyStat>, @@ -3087,6 +3244,26 @@ impl<'r> __sdk::AppliedDiff<'r> for AppliedDiff<'r> { &self.runtime_snapshot, event, ); + callbacks.invoke_table_row_callbacks::( + "square_hole_agent_message", + &self.square_hole_agent_message, + event, + ); + callbacks.invoke_table_row_callbacks::( + "square_hole_agent_session", + &self.square_hole_agent_session, + event, + ); + callbacks.invoke_table_row_callbacks::( + "square_hole_runtime_run", + &self.square_hole_runtime_run, + event, + ); + callbacks.invoke_table_row_callbacks::( + "square_hole_work_profile", + &self.square_hole_work_profile, + event, + ); callbacks.invoke_table_row_callbacks::("story_event", &self.story_event, event); callbacks.invoke_table_row_callbacks::( "story_session", @@ -3373,19 +3550,19 @@ impl __sdk::SubscriptionHandle for SubscriptionHandle { /// either a [`DbConnection`] or an [`EventContext`] and operate on either. pub trait RemoteDbContext: __sdk::DbContext< - DbView = RemoteTables, - Reducers = RemoteReducers, - SubscriptionBuilder = __sdk::SubscriptionBuilder, -> + DbView = RemoteTables, + Reducers = RemoteReducers, + SubscriptionBuilder = __sdk::SubscriptionBuilder, + > { } impl< - Ctx: __sdk::DbContext< + Ctx: __sdk::DbContext< DbView = RemoteTables, Reducers = RemoteReducers, SubscriptionBuilder = __sdk::SubscriptionBuilder, >, - > RemoteDbContext for Ctx +> RemoteDbContext for Ctx { } @@ -3838,6 +4015,10 @@ impl __sdk::SpacetimeModule for RemoteModule { refresh_session_table::register_table(client_cache); runtime_setting_table::register_table(client_cache); runtime_snapshot_table::register_table(client_cache); + square_hole_agent_message_table::register_table(client_cache); + square_hole_agent_session_table::register_table(client_cache); + square_hole_runtime_run_table::register_table(client_cache); + square_hole_work_profile_table::register_table(client_cache); story_event_table::register_table(client_cache); story_session_table::register_table(client_cache); tracking_daily_stat_table::register_table(client_cache); @@ -3907,6 +4088,10 @@ impl __sdk::SpacetimeModule for RemoteModule { "refresh_session", "runtime_setting", "runtime_snapshot", + "square_hole_agent_message", + "square_hole_agent_session", + "square_hole_runtime_run", + "square_hole_work_profile", "story_event", "story_session", "tracking_daily_stat", diff --git a/server-rs/crates/spacetime-client/src/module_bindings/public_work_play_daily_stat_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/public_work_play_daily_stat_table.rs index 8c95aaa8..d0c84769 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/public_work_play_daily_stat_table.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/public_work_play_daily_stat_table.rs @@ -153,7 +153,7 @@ pub trait public_work_play_daily_statQueryTableAccess { #[allow(non_snake_case)] /// Get a query builder for the table `PublicWorkPlayDailyStat`. fn public_work_play_daily_stat(&self) - -> __sdk::__query_builder::Table; + -> __sdk::__query_builder::Table; } impl public_work_play_daily_statQueryTableAccess for __sdk::QueryTableAccessor { diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_big_fish_game_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_big_fish_game_procedure.rs index e8007288..d4507ad8 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/publish_big_fish_game_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_big_fish_game_procedure.rs @@ -31,10 +31,10 @@ pub trait publish_big_fish_game { input: BigFishPublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl publish_big_fish_game for super::RemoteProcedures { input: BigFishPublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_and_return_procedure.rs index e5434aca..d5741922 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait publish_custom_world_profile_and_return { input: CustomWorldProfilePublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl publish_custom_world_profile_and_return for super::RemoteProcedures { input: CustomWorldProfilePublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_reducer.rs index 84e6b339..2e2f71f6 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_profile_reducer.rs @@ -50,9 +50,11 @@ pub trait publish_custom_world_profile { &self, input: CustomWorldProfilePublishInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl publish_custom_world_profile for super::RemoteReducers { &self, input: CustomWorldProfilePublishInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(PublishCustomWorldProfileArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_world_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_world_procedure.rs index 1eb935a2..42c76aad 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_world_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_custom_world_world_procedure.rs @@ -31,10 +31,10 @@ pub trait publish_custom_world_world { input: CustomWorldPublishWorldInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl publish_custom_world_world for super::RemoteProcedures { input: CustomWorldPublishWorldInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldPublishWorldResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_match_3_d_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_match_3_d_work_procedure.rs index 65bd160e..db0c7efe 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/publish_match_3_d_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_match_3_d_work_procedure.rs @@ -31,10 +31,10 @@ pub trait publish_match_3_d_work { input: Match3DWorkPublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl publish_match_3_d_work for super::RemoteProcedures { input: Match3DWorkPublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_puzzle_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_puzzle_work_procedure.rs index 288b44a5..932b66d6 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/publish_puzzle_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_puzzle_work_procedure.rs @@ -31,10 +31,10 @@ pub trait publish_puzzle_work { input: PuzzlePublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl publish_puzzle_work for super::RemoteProcedures { input: PuzzlePublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/publish_square_hole_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/publish_square_hole_work_procedure.rs new file mode 100644 index 00000000..ad4e944e --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/publish_square_hole_work_procedure.rs @@ -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::square_hole_work_procedure_result_type::SquareHoleWorkProcedureResult; +use super::square_hole_work_publish_input_type::SquareHoleWorkPublishInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct PublishSquareHoleWorkArgs { + pub input: SquareHoleWorkPublishInput, +} + +impl __sdk::InModule for PublishSquareHoleWorkArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `publish_square_hole_work`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait publish_square_hole_work { + fn publish_square_hole_work(&self, input: SquareHoleWorkPublishInput) { + self.publish_square_hole_work_then(input, |_, _| {}); + } + + fn publish_square_hole_work_then( + &self, + input: SquareHoleWorkPublishInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl publish_square_hole_work for super::RemoteProcedures { + fn publish_square_hole_work_then( + &self, + input: SquareHoleWorkPublishInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleWorkProcedureResult>( + "publish_square_hole_work", + PublishSquareHoleWorkArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/put_database_migration_import_chunk_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/put_database_migration_import_chunk_procedure.rs index 597b2511..f3776bfd 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/put_database_migration_import_chunk_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/put_database_migration_import_chunk_procedure.rs @@ -31,10 +31,10 @@ pub trait put_database_migration_import_chunk { input: DatabaseMigrationImportChunkInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl put_database_migration_import_chunk for super::RemoteProcedures { input: DatabaseMigrationImportChunkInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/query_analytics_metric_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/query_analytics_metric_procedure.rs index adc25bfa..7973f546 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/query_analytics_metric_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/query_analytics_metric_procedure.rs @@ -31,10 +31,10 @@ pub trait query_analytics_metric { input: AnalyticsMetricQueryInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl query_analytics_metric for super::RemoteProcedures { input: AnalyticsMetricQueryInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AnalyticsMetricQueryProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_like_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_like_procedure.rs index 0429a9f7..536aa47d 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_like_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_like_procedure.rs @@ -31,10 +31,10 @@ pub trait record_big_fish_like { input: BigFishWorkLikeRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl record_big_fish_like for super::RemoteProcedures { input: BigFishWorkLikeRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_play_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_play_procedure.rs index f4cfaa6b..8cf35b2b 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_play_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/record_big_fish_play_procedure.rs @@ -31,10 +31,10 @@ pub trait record_big_fish_play { input: BigFishPlayRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl record_big_fish_play for super::RemoteProcedures { input: BigFishPlayRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishWorksProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_like_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_like_procedure.rs index 6ac81dd9..1cd0aaad 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_like_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_like_procedure.rs @@ -31,10 +31,10 @@ pub trait record_custom_world_profile_like { input: CustomWorldProfileLikeRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl record_custom_world_profile_like for super::RemoteProcedures { input: CustomWorldProfileLikeRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_play_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_play_procedure.rs index f803e277..2534ee30 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_play_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/record_custom_world_profile_play_procedure.rs @@ -31,10 +31,10 @@ pub trait record_custom_world_profile_play { input: CustomWorldProfilePlayRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl record_custom_world_profile_play for super::RemoteProcedures { input: CustomWorldProfilePlayRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/record_puzzle_work_like_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/record_puzzle_work_like_procedure.rs index 78dce7f8..fa55cf09 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/record_puzzle_work_like_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/record_puzzle_work_like_procedure.rs @@ -31,10 +31,10 @@ pub trait record_puzzle_work_like { input: PuzzleWorkLikeRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl record_puzzle_work_like for super::RemoteProcedures { input: PuzzleWorkLikeRecordInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_referral_invite_code_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_referral_invite_code_procedure.rs index 44354acd..efebd26a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_referral_invite_code_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_referral_invite_code_procedure.rs @@ -31,10 +31,10 @@ pub trait redeem_profile_referral_invite_code { input: RuntimeReferralRedeemInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl redeem_profile_referral_invite_code for super::RemoteProcedures { input: RuntimeReferralRedeemInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeReferralRedeemProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_reward_code_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_reward_code_procedure.rs index 4d048a49..38fc64f5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_reward_code_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/redeem_profile_reward_code_procedure.rs @@ -31,10 +31,10 @@ pub trait redeem_profile_reward_code { input: RuntimeProfileRewardCodeRedeemInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl redeem_profile_reward_code for super::RemoteProcedures { input: RuntimeProfileRewardCodeRedeemInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileRewardCodeRedeemProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/refund_profile_wallet_points_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/refund_profile_wallet_points_and_return_procedure.rs index fb86172c..a4bbd378 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/refund_profile_wallet_points_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/refund_profile_wallet_points_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait refund_profile_wallet_points_and_return { input: RuntimeProfileWalletAdjustmentInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl refund_profile_wallet_points_and_return for super::RemoteProcedures { input: RuntimeProfileWalletAdjustmentInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileWalletAdjustmentProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/remix_big_fish_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/remix_big_fish_work_procedure.rs index 7f58adb3..ff7d1486 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/remix_big_fish_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/remix_big_fish_work_procedure.rs @@ -31,10 +31,10 @@ pub trait remix_big_fish_work { input: BigFishWorkRemixInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl remix_big_fish_work for super::RemoteProcedures { input: BigFishWorkRemixInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/remix_custom_world_profile_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/remix_custom_world_profile_procedure.rs index 93f74383..8cd29b12 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/remix_custom_world_profile_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/remix_custom_world_profile_procedure.rs @@ -31,10 +31,10 @@ pub trait remix_custom_world_profile { input: CustomWorldProfileRemixInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl remix_custom_world_profile for super::RemoteProcedures { input: CustomWorldProfileRemixInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/remix_puzzle_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/remix_puzzle_work_procedure.rs index da91b334..d2548069 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/remix_puzzle_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/remix_puzzle_work_procedure.rs @@ -31,10 +31,10 @@ pub trait remix_puzzle_work { input: PuzzleWorkRemixInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl remix_puzzle_work for super::RemoteProcedures { input: PuzzleWorkRemixInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_and_return_procedure.rs index ac8aa07d..7d6fbfd1 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait resolve_combat_action_and_return { input: ResolveCombatActionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl resolve_combat_action_and_return for super::RemoteProcedures { input: ResolveCombatActionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, ResolveCombatActionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_reducer.rs index 41340e2f..8398db8c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_combat_action_reducer.rs @@ -47,9 +47,11 @@ pub trait resolve_combat_action { &self, input: ResolveCombatActionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl resolve_combat_action for super::RemoteReducers { &self, input: ResolveCombatActionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ResolveCombatActionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_battle_interaction_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_battle_interaction_and_return_procedure.rs index ff4cca29..268483bf 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_battle_interaction_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_battle_interaction_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait resolve_npc_battle_interaction_and_return { input: ResolveNpcBattleInteractionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl resolve_npc_battle_interaction_and_return for super::RemoteProcedures { input: ResolveNpcBattleInteractionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, NpcBattleInteractionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_and_return_procedure.rs index aaba3d9c..4604fc30 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait resolve_npc_interaction_and_return { input: ResolveNpcInteractionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl resolve_npc_interaction_and_return for super::RemoteProcedures { input: ResolveNpcInteractionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, NpcInteractionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_reducer.rs index 52d213b5..352f5a93 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_interaction_reducer.rs @@ -47,9 +47,11 @@ pub trait resolve_npc_interaction { &self, input: ResolveNpcInteractionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl resolve_npc_interaction for super::RemoteReducers { &self, input: ResolveNpcInteractionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ResolveNpcInteractionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_and_return_procedure.rs index c1425649..65b1690e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait resolve_npc_social_action_and_return { input: ResolveNpcSocialActionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl resolve_npc_social_action_and_return for super::RemoteProcedures { input: ResolveNpcSocialActionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, NpcStateProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_reducer.rs index 28e5ce36..9b326931 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_npc_social_action_reducer.rs @@ -47,9 +47,11 @@ pub trait resolve_npc_social_action { &self, input: ResolveNpcSocialActionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl resolve_npc_social_action for super::RemoteReducers { &self, input: ResolveNpcSocialActionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ResolveNpcSocialActionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_and_return_procedure.rs index a224c122..0b8f6bad 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait resolve_treasure_interaction_and_return { input: TreasureResolveInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl resolve_treasure_interaction_and_return for super::RemoteProcedures { input: TreasureResolveInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, TreasureRecordProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_reducer.rs index 942b377a..221ac39d 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resolve_treasure_interaction_reducer.rs @@ -47,9 +47,11 @@ pub trait resolve_treasure_interaction { &self, input: TreasureResolveInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl resolve_treasure_interaction for super::RemoteReducers { &self, input: TreasureResolveInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(ResolveTreasureInteractionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/restart_match_3_d_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/restart_match_3_d_run_procedure.rs index add954d4..76c74037 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/restart_match_3_d_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/restart_match_3_d_run_procedure.rs @@ -31,10 +31,10 @@ pub trait restart_match_3_d_run { input: Match3DRunRestartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl restart_match_3_d_run for super::RemoteProcedures { input: Match3DRunRestartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/restart_square_hole_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/restart_square_hole_run_procedure.rs new file mode 100644 index 00000000..df72d4d3 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/restart_square_hole_run_procedure.rs @@ -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::square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; +use super::square_hole_run_restart_input_type::SquareHoleRunRestartInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct RestartSquareHoleRunArgs { + pub input: SquareHoleRunRestartInput, +} + +impl __sdk::InModule for RestartSquareHoleRunArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `restart_square_hole_run`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait restart_square_hole_run { + fn restart_square_hole_run(&self, input: SquareHoleRunRestartInput) { + self.restart_square_hole_run_then(input, |_, _| {}); + } + + fn restart_square_hole_run_then( + &self, + input: SquareHoleRunRestartInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl restart_square_hole_run for super::RemoteProcedures { + fn restart_square_hole_run_then( + &self, + input: SquareHoleRunRestartInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleRunProcedureResult>( + "restart_square_hole_run", + RestartSquareHoleRunArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/resume_profile_save_archive_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/resume_profile_save_archive_and_return_procedure.rs index 957c105f..73e6d668 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/resume_profile_save_archive_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/resume_profile_save_archive_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait resume_profile_save_archive_and_return { input: RuntimeProfileSaveArchiveResumeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl resume_profile_save_archive_and_return for super::RemoteProcedures { input: RuntimeProfileSaveArchiveResumeInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeProfileSaveArchiveProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/revoke_database_migration_operator_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/revoke_database_migration_operator_procedure.rs index feb5086e..fe032926 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/revoke_database_migration_operator_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/revoke_database_migration_operator_procedure.rs @@ -31,10 +31,10 @@ pub trait revoke_database_migration_operator { input: DatabaseMigrationRevokeOperatorInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl revoke_database_migration_operator for super::RemoteProcedures { input: DatabaseMigrationRevokeOperatorInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, DatabaseMigrationOperatorProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_form_draft_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_form_draft_procedure.rs index bd13cb5f..13aff9a3 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_form_draft_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_form_draft_procedure.rs @@ -31,10 +31,10 @@ pub trait save_puzzle_form_draft { input: PuzzleFormDraftSaveInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl save_puzzle_form_draft for super::RemoteProcedures { input: PuzzleFormDraftSaveInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_generated_images_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_generated_images_procedure.rs index 85d17456..870d6d51 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_generated_images_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/save_puzzle_generated_images_procedure.rs @@ -31,10 +31,10 @@ pub trait save_puzzle_generated_images { input: PuzzleGeneratedImagesSaveInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl save_puzzle_generated_images for super::RemoteProcedures { input: PuzzleGeneratedImagesSaveInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/seed_analytics_date_dimensions_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/seed_analytics_date_dimensions_reducer.rs index 6e2ac3ad..29d3b91d 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/seed_analytics_date_dimensions_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/seed_analytics_date_dimensions_reducer.rs @@ -50,9 +50,11 @@ pub trait seed_analytics_date_dimensions { &self, input: AnalyticsDateDimensionSeedInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl seed_analytics_date_dimensions for super::RemoteReducers { &self, input: AnalyticsDateDimensionSeedInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(SeedAnalyticsDateDimensionsArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/select_puzzle_cover_image_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/select_puzzle_cover_image_procedure.rs index 9dde8aaa..fd4dd93c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/select_puzzle_cover_image_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/select_puzzle_cover_image_procedure.rs @@ -31,10 +31,10 @@ pub trait select_puzzle_cover_image { input: PuzzleSelectCoverImageInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl select_puzzle_cover_image for super::RemoteProcedures { input: PuzzleSelectCoverImageInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_finalize_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_finalize_input_type.rs new file mode 100644 index 00000000..4edaf2be --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_finalize_input_type.rs @@ -0,0 +1,23 @@ +// 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 SquareHoleAgentMessageFinalizeInput { + pub session_id: String, + pub owner_user_id: String, + pub assistant_message_id: Option, + pub assistant_reply_text: Option, + pub config_json: Option, + pub progress_percent: u32, + pub stage: String, + pub updated_at_micros: i64, + pub error_message: Option, +} + +impl __sdk::InModule for SquareHoleAgentMessageFinalizeInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_row_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_row_type.rs new file mode 100644 index 00000000..5455e365 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_row_type.rs @@ -0,0 +1,66 @@ +// 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 SquareHoleAgentMessageRow { + pub message_id: String, + pub session_id: String, + pub role: String, + pub kind: String, + pub text: String, + pub created_at: __sdk::Timestamp, +} + +impl __sdk::InModule for SquareHoleAgentMessageRow { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `SquareHoleAgentMessageRow`. +/// +/// Provides typed access to columns for query building. +pub struct SquareHoleAgentMessageRowCols { + pub message_id: __sdk::__query_builder::Col, + pub session_id: __sdk::__query_builder::Col, + pub role: __sdk::__query_builder::Col, + pub kind: __sdk::__query_builder::Col, + pub text: __sdk::__query_builder::Col, + pub created_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for SquareHoleAgentMessageRow { + type Cols = SquareHoleAgentMessageRowCols; + fn cols(table_name: &'static str) -> Self::Cols { + SquareHoleAgentMessageRowCols { + message_id: __sdk::__query_builder::Col::new(table_name, "message_id"), + session_id: __sdk::__query_builder::Col::new(table_name, "session_id"), + role: __sdk::__query_builder::Col::new(table_name, "role"), + kind: __sdk::__query_builder::Col::new(table_name, "kind"), + text: __sdk::__query_builder::Col::new(table_name, "text"), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + } + } +} + +/// Indexed column accessor struct for the table `SquareHoleAgentMessageRow`. +/// +/// Provides typed access to indexed columns for query building. +pub struct SquareHoleAgentMessageRowIxCols { + pub message_id: __sdk::__query_builder::IxCol, + pub session_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for SquareHoleAgentMessageRow { + type IxCols = SquareHoleAgentMessageRowIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + SquareHoleAgentMessageRowIxCols { + message_id: __sdk::__query_builder::IxCol::new(table_name, "message_id"), + session_id: __sdk::__query_builder::IxCol::new(table_name, "session_id"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for SquareHoleAgentMessageRow {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_submit_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_submit_input_type.rs new file mode 100644 index 00000000..10114939 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_submit_input_type.rs @@ -0,0 +1,19 @@ +// 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 SquareHoleAgentMessageSubmitInput { + pub session_id: String, + pub owner_user_id: String, + pub user_message_id: String, + pub user_message_text: String, + pub submitted_at_micros: i64, +} + +impl __sdk::InModule for SquareHoleAgentMessageSubmitInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_table.rs new file mode 100644 index 00000000..63d9fa6b --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_message_table.rs @@ -0,0 +1,165 @@ +// 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 super::square_hole_agent_message_row_type::SquareHoleAgentMessageRow; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `square_hole_agent_message`. +/// +/// Obtain a handle from the [`SquareHoleAgentMessageTableAccess::square_hole_agent_message`] method on [`super::RemoteTables`], +/// like `ctx.db.square_hole_agent_message()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_agent_message().on_insert(...)`. +pub struct SquareHoleAgentMessageTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `square_hole_agent_message`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait SquareHoleAgentMessageTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`SquareHoleAgentMessageTableHandle`], which mediates access to the table `square_hole_agent_message`. + fn square_hole_agent_message(&self) -> SquareHoleAgentMessageTableHandle<'_>; +} + +impl SquareHoleAgentMessageTableAccess for super::RemoteTables { + fn square_hole_agent_message(&self) -> SquareHoleAgentMessageTableHandle<'_> { + SquareHoleAgentMessageTableHandle { + imp: self + .imp + .get_table::("square_hole_agent_message"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct SquareHoleAgentMessageInsertCallbackId(__sdk::CallbackId); +pub struct SquareHoleAgentMessageDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::Table for SquareHoleAgentMessageTableHandle<'ctx> { + type Row = SquareHoleAgentMessageRow; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = SquareHoleAgentMessageInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleAgentMessageInsertCallbackId { + SquareHoleAgentMessageInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: SquareHoleAgentMessageInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = SquareHoleAgentMessageDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleAgentMessageDeleteCallbackId { + SquareHoleAgentMessageDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: SquareHoleAgentMessageDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct SquareHoleAgentMessageUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for SquareHoleAgentMessageTableHandle<'ctx> { + type UpdateCallbackId = SquareHoleAgentMessageUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> SquareHoleAgentMessageUpdateCallbackId { + SquareHoleAgentMessageUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: SquareHoleAgentMessageUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `message_id` unique index on the table `square_hole_agent_message`, +/// which allows point queries on the field of the same name +/// via the [`SquareHoleAgentMessageMessageIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_agent_message().message_id().find(...)`. +pub struct SquareHoleAgentMessageMessageIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> SquareHoleAgentMessageTableHandle<'ctx> { + /// Get a handle on the `message_id` unique index on the table `square_hole_agent_message`. + pub fn message_id(&self) -> SquareHoleAgentMessageMessageIdUnique<'ctx> { + SquareHoleAgentMessageMessageIdUnique { + imp: self.imp.get_unique_constraint::("message_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> SquareHoleAgentMessageMessageIdUnique<'ctx> { + /// Find the subscribed row whose `message_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = + client_cache.get_or_make_table::("square_hole_agent_message"); + _table.add_unique_constraint::("message_id", |row| &row.message_id); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `SquareHoleAgentMessageRow`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait square_hole_agent_messageQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `SquareHoleAgentMessageRow`. + fn square_hole_agent_message(&self) + -> __sdk::__query_builder::Table; +} + +impl square_hole_agent_messageQueryTableAccess for __sdk::QueryTableAccessor { + fn square_hole_agent_message( + &self, + ) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("square_hole_agent_message") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_create_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_create_input_type.rs new file mode 100644 index 00000000..92a48217 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_create_input_type.rs @@ -0,0 +1,21 @@ +// 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 SquareHoleAgentSessionCreateInput { + pub session_id: String, + pub owner_user_id: String, + pub seed_text: String, + pub welcome_message_id: String, + pub welcome_message_text: String, + pub config_json: Option, + pub created_at_micros: i64, +} + +impl __sdk::InModule for SquareHoleAgentSessionCreateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_get_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_get_input_type.rs new file mode 100644 index 00000000..fb1324c2 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_get_input_type.rs @@ -0,0 +1,16 @@ +// 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 SquareHoleAgentSessionGetInput { + pub session_id: String, + pub owner_user_id: String, +} + +impl __sdk::InModule for SquareHoleAgentSessionGetInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_procedure_result_type.rs new file mode 100644 index 00000000..5ea89d13 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_procedure_result_type.rs @@ -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 SquareHoleAgentSessionProcedureResult { + pub ok: bool, + pub session_json: Option, + pub error_message: Option, +} + +impl __sdk::InModule for SquareHoleAgentSessionProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_row_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_row_type.rs new file mode 100644 index 00000000..3f30cd52 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_row_type.rs @@ -0,0 +1,90 @@ +// 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 SquareHoleAgentSessionRow { + pub session_id: String, + pub owner_user_id: String, + pub seed_text: String, + pub current_turn: u32, + pub progress_percent: u32, + pub stage: String, + pub config_json: String, + pub draft_json: String, + pub last_assistant_reply: String, + pub published_profile_id: String, + pub created_at: __sdk::Timestamp, + pub updated_at: __sdk::Timestamp, +} + +impl __sdk::InModule for SquareHoleAgentSessionRow { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `SquareHoleAgentSessionRow`. +/// +/// Provides typed access to columns for query building. +pub struct SquareHoleAgentSessionRowCols { + pub session_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub seed_text: __sdk::__query_builder::Col, + pub current_turn: __sdk::__query_builder::Col, + pub progress_percent: __sdk::__query_builder::Col, + pub stage: __sdk::__query_builder::Col, + pub config_json: __sdk::__query_builder::Col, + pub draft_json: __sdk::__query_builder::Col, + pub last_assistant_reply: __sdk::__query_builder::Col, + pub published_profile_id: __sdk::__query_builder::Col, + pub created_at: __sdk::__query_builder::Col, + pub updated_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for SquareHoleAgentSessionRow { + type Cols = SquareHoleAgentSessionRowCols; + fn cols(table_name: &'static str) -> Self::Cols { + SquareHoleAgentSessionRowCols { + session_id: __sdk::__query_builder::Col::new(table_name, "session_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + seed_text: __sdk::__query_builder::Col::new(table_name, "seed_text"), + current_turn: __sdk::__query_builder::Col::new(table_name, "current_turn"), + progress_percent: __sdk::__query_builder::Col::new(table_name, "progress_percent"), + stage: __sdk::__query_builder::Col::new(table_name, "stage"), + config_json: __sdk::__query_builder::Col::new(table_name, "config_json"), + draft_json: __sdk::__query_builder::Col::new(table_name, "draft_json"), + last_assistant_reply: __sdk::__query_builder::Col::new( + table_name, + "last_assistant_reply", + ), + published_profile_id: __sdk::__query_builder::Col::new( + table_name, + "published_profile_id", + ), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + } + } +} + +/// Indexed column accessor struct for the table `SquareHoleAgentSessionRow`. +/// +/// Provides typed access to indexed columns for query building. +pub struct SquareHoleAgentSessionRowIxCols { + pub owner_user_id: __sdk::__query_builder::IxCol, + pub session_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for SquareHoleAgentSessionRow { + type IxCols = SquareHoleAgentSessionRowIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + SquareHoleAgentSessionRowIxCols { + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + session_id: __sdk::__query_builder::IxCol::new(table_name, "session_id"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for SquareHoleAgentSessionRow {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_table.rs new file mode 100644 index 00000000..057e4469 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_agent_session_table.rs @@ -0,0 +1,165 @@ +// 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 super::square_hole_agent_session_row_type::SquareHoleAgentSessionRow; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `square_hole_agent_session`. +/// +/// Obtain a handle from the [`SquareHoleAgentSessionTableAccess::square_hole_agent_session`] method on [`super::RemoteTables`], +/// like `ctx.db.square_hole_agent_session()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_agent_session().on_insert(...)`. +pub struct SquareHoleAgentSessionTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `square_hole_agent_session`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait SquareHoleAgentSessionTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`SquareHoleAgentSessionTableHandle`], which mediates access to the table `square_hole_agent_session`. + fn square_hole_agent_session(&self) -> SquareHoleAgentSessionTableHandle<'_>; +} + +impl SquareHoleAgentSessionTableAccess for super::RemoteTables { + fn square_hole_agent_session(&self) -> SquareHoleAgentSessionTableHandle<'_> { + SquareHoleAgentSessionTableHandle { + imp: self + .imp + .get_table::("square_hole_agent_session"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct SquareHoleAgentSessionInsertCallbackId(__sdk::CallbackId); +pub struct SquareHoleAgentSessionDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::Table for SquareHoleAgentSessionTableHandle<'ctx> { + type Row = SquareHoleAgentSessionRow; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = SquareHoleAgentSessionInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleAgentSessionInsertCallbackId { + SquareHoleAgentSessionInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: SquareHoleAgentSessionInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = SquareHoleAgentSessionDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleAgentSessionDeleteCallbackId { + SquareHoleAgentSessionDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: SquareHoleAgentSessionDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct SquareHoleAgentSessionUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for SquareHoleAgentSessionTableHandle<'ctx> { + type UpdateCallbackId = SquareHoleAgentSessionUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> SquareHoleAgentSessionUpdateCallbackId { + SquareHoleAgentSessionUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: SquareHoleAgentSessionUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `session_id` unique index on the table `square_hole_agent_session`, +/// which allows point queries on the field of the same name +/// via the [`SquareHoleAgentSessionSessionIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_agent_session().session_id().find(...)`. +pub struct SquareHoleAgentSessionSessionIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> SquareHoleAgentSessionTableHandle<'ctx> { + /// Get a handle on the `session_id` unique index on the table `square_hole_agent_session`. + pub fn session_id(&self) -> SquareHoleAgentSessionSessionIdUnique<'ctx> { + SquareHoleAgentSessionSessionIdUnique { + imp: self.imp.get_unique_constraint::("session_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> SquareHoleAgentSessionSessionIdUnique<'ctx> { + /// Find the subscribed row whose `session_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = + client_cache.get_or_make_table::("square_hole_agent_session"); + _table.add_unique_constraint::("session_id", |row| &row.session_id); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `SquareHoleAgentSessionRow`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait square_hole_agent_sessionQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `SquareHoleAgentSessionRow`. + fn square_hole_agent_session(&self) + -> __sdk::__query_builder::Table; +} + +impl square_hole_agent_sessionQueryTableAccess for __sdk::QueryTableAccessor { + fn square_hole_agent_session( + &self, + ) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("square_hole_agent_session") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_draft_compile_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_draft_compile_input_type.rs new file mode 100644 index 00000000..15b4af32 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_draft_compile_input_type.rs @@ -0,0 +1,23 @@ +// 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 SquareHoleDraftCompileInput { + pub session_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub author_display_name: String, + pub game_name: Option, + pub summary_text: Option, + pub tags_json: Option, + pub cover_image_src: Option, + pub compiled_at_micros: i64, +} + +impl __sdk::InModule for SquareHoleDraftCompileInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_drop_shape_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_drop_shape_procedure_result_type.rs new file mode 100644 index 00000000..06ba3616 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_drop_shape_procedure_result_type.rs @@ -0,0 +1,20 @@ +// 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 SquareHoleDropShapeProcedureResult { + pub ok: bool, + pub status: String, + pub run_json: Option, + pub feedback_json: Option, + pub failure_reason: Option, + pub error_message: Option, +} + +impl __sdk::InModule for SquareHoleDropShapeProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_drop_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_drop_input_type.rs new file mode 100644 index 00000000..1d65ffe7 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_drop_input_type.rs @@ -0,0 +1,20 @@ +// 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 SquareHoleRunDropInput { + pub run_id: String, + pub owner_user_id: String, + pub hole_id: String, + pub client_snapshot_version: u64, + pub client_event_id: String, + pub dropped_at_ms: i64, +} + +impl __sdk::InModule for SquareHoleRunDropInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_get_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_get_input_type.rs new file mode 100644 index 00000000..d4424c81 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_get_input_type.rs @@ -0,0 +1,16 @@ +// 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 SquareHoleRunGetInput { + pub run_id: String, + pub owner_user_id: String, +} + +impl __sdk::InModule for SquareHoleRunGetInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_procedure_result_type.rs new file mode 100644 index 00000000..e4a5817d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_procedure_result_type.rs @@ -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 SquareHoleRunProcedureResult { + pub ok: bool, + pub run_json: Option, + pub error_message: Option, +} + +impl __sdk::InModule for SquareHoleRunProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_restart_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_restart_input_type.rs new file mode 100644 index 00000000..2b2a5e5f --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_restart_input_type.rs @@ -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 SquareHoleRunRestartInput { + pub source_run_id: String, + pub next_run_id: String, + pub owner_user_id: String, + pub restarted_at_ms: i64, +} + +impl __sdk::InModule for SquareHoleRunRestartInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_start_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_start_input_type.rs new file mode 100644 index 00000000..f8abbe7d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_start_input_type.rs @@ -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 SquareHoleRunStartInput { + pub run_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub started_at_ms: i64, +} + +impl __sdk::InModule for SquareHoleRunStartInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_stop_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_stop_input_type.rs new file mode 100644 index 00000000..d0b1b7e4 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_stop_input_type.rs @@ -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 SquareHoleRunStopInput { + pub run_id: String, + pub owner_user_id: String, + pub stopped_at_ms: i64, +} + +impl __sdk::InModule for SquareHoleRunStopInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_time_up_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_time_up_input_type.rs new file mode 100644 index 00000000..1e2f0adc --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_run_time_up_input_type.rs @@ -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 SquareHoleRunTimeUpInput { + pub run_id: String, + pub owner_user_id: String, + pub finished_at_ms: i64, +} + +impl __sdk::InModule for SquareHoleRunTimeUpInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_runtime_run_row_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_runtime_run_row_type.rs new file mode 100644 index 00000000..3acc901f --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_runtime_run_row_type.rs @@ -0,0 +1,98 @@ +// 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 SquareHoleRuntimeRunRow { + pub run_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub status: String, + pub snapshot_version: u64, + pub started_at_ms: i64, + pub duration_limit_ms: i64, + pub finished_at_ms: i64, + pub elapsed_ms: i64, + pub total_shape_count: u32, + pub completed_shape_count: u32, + pub score: u32, + pub snapshot_json: String, + pub created_at: __sdk::Timestamp, + pub updated_at: __sdk::Timestamp, +} + +impl __sdk::InModule for SquareHoleRuntimeRunRow { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `SquareHoleRuntimeRunRow`. +/// +/// Provides typed access to columns for query building. +pub struct SquareHoleRuntimeRunRowCols { + pub run_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub profile_id: __sdk::__query_builder::Col, + pub status: __sdk::__query_builder::Col, + pub snapshot_version: __sdk::__query_builder::Col, + pub started_at_ms: __sdk::__query_builder::Col, + pub duration_limit_ms: __sdk::__query_builder::Col, + pub finished_at_ms: __sdk::__query_builder::Col, + pub elapsed_ms: __sdk::__query_builder::Col, + pub total_shape_count: __sdk::__query_builder::Col, + pub completed_shape_count: __sdk::__query_builder::Col, + pub score: __sdk::__query_builder::Col, + pub snapshot_json: __sdk::__query_builder::Col, + pub created_at: __sdk::__query_builder::Col, + pub updated_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for SquareHoleRuntimeRunRow { + type Cols = SquareHoleRuntimeRunRowCols; + fn cols(table_name: &'static str) -> Self::Cols { + SquareHoleRuntimeRunRowCols { + run_id: __sdk::__query_builder::Col::new(table_name, "run_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + profile_id: __sdk::__query_builder::Col::new(table_name, "profile_id"), + status: __sdk::__query_builder::Col::new(table_name, "status"), + snapshot_version: __sdk::__query_builder::Col::new(table_name, "snapshot_version"), + started_at_ms: __sdk::__query_builder::Col::new(table_name, "started_at_ms"), + duration_limit_ms: __sdk::__query_builder::Col::new(table_name, "duration_limit_ms"), + finished_at_ms: __sdk::__query_builder::Col::new(table_name, "finished_at_ms"), + elapsed_ms: __sdk::__query_builder::Col::new(table_name, "elapsed_ms"), + total_shape_count: __sdk::__query_builder::Col::new(table_name, "total_shape_count"), + completed_shape_count: __sdk::__query_builder::Col::new( + table_name, + "completed_shape_count", + ), + score: __sdk::__query_builder::Col::new(table_name, "score"), + snapshot_json: __sdk::__query_builder::Col::new(table_name, "snapshot_json"), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + } + } +} + +/// Indexed column accessor struct for the table `SquareHoleRuntimeRunRow`. +/// +/// Provides typed access to indexed columns for query building. +pub struct SquareHoleRuntimeRunRowIxCols { + pub owner_user_id: __sdk::__query_builder::IxCol, + pub profile_id: __sdk::__query_builder::IxCol, + pub run_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for SquareHoleRuntimeRunRow { + type IxCols = SquareHoleRuntimeRunRowIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + SquareHoleRuntimeRunRowIxCols { + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + profile_id: __sdk::__query_builder::IxCol::new(table_name, "profile_id"), + run_id: __sdk::__query_builder::IxCol::new(table_name, "run_id"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for SquareHoleRuntimeRunRow {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_runtime_run_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_runtime_run_table.rs new file mode 100644 index 00000000..f257a82e --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_runtime_run_table.rs @@ -0,0 +1,162 @@ +// 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 super::square_hole_runtime_run_row_type::SquareHoleRuntimeRunRow; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `square_hole_runtime_run`. +/// +/// Obtain a handle from the [`SquareHoleRuntimeRunTableAccess::square_hole_runtime_run`] method on [`super::RemoteTables`], +/// like `ctx.db.square_hole_runtime_run()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_runtime_run().on_insert(...)`. +pub struct SquareHoleRuntimeRunTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `square_hole_runtime_run`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait SquareHoleRuntimeRunTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`SquareHoleRuntimeRunTableHandle`], which mediates access to the table `square_hole_runtime_run`. + fn square_hole_runtime_run(&self) -> SquareHoleRuntimeRunTableHandle<'_>; +} + +impl SquareHoleRuntimeRunTableAccess for super::RemoteTables { + fn square_hole_runtime_run(&self) -> SquareHoleRuntimeRunTableHandle<'_> { + SquareHoleRuntimeRunTableHandle { + imp: self + .imp + .get_table::("square_hole_runtime_run"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct SquareHoleRuntimeRunInsertCallbackId(__sdk::CallbackId); +pub struct SquareHoleRuntimeRunDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::Table for SquareHoleRuntimeRunTableHandle<'ctx> { + type Row = SquareHoleRuntimeRunRow; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = SquareHoleRuntimeRunInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleRuntimeRunInsertCallbackId { + SquareHoleRuntimeRunInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: SquareHoleRuntimeRunInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = SquareHoleRuntimeRunDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleRuntimeRunDeleteCallbackId { + SquareHoleRuntimeRunDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: SquareHoleRuntimeRunDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct SquareHoleRuntimeRunUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for SquareHoleRuntimeRunTableHandle<'ctx> { + type UpdateCallbackId = SquareHoleRuntimeRunUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> SquareHoleRuntimeRunUpdateCallbackId { + SquareHoleRuntimeRunUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: SquareHoleRuntimeRunUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `run_id` unique index on the table `square_hole_runtime_run`, +/// which allows point queries on the field of the same name +/// via the [`SquareHoleRuntimeRunRunIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_runtime_run().run_id().find(...)`. +pub struct SquareHoleRuntimeRunRunIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> SquareHoleRuntimeRunTableHandle<'ctx> { + /// Get a handle on the `run_id` unique index on the table `square_hole_runtime_run`. + pub fn run_id(&self) -> SquareHoleRuntimeRunRunIdUnique<'ctx> { + SquareHoleRuntimeRunRunIdUnique { + imp: self.imp.get_unique_constraint::("run_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> SquareHoleRuntimeRunRunIdUnique<'ctx> { + /// Find the subscribed row whose `run_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = + client_cache.get_or_make_table::("square_hole_runtime_run"); + _table.add_unique_constraint::("run_id", |row| &row.run_id); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `SquareHoleRuntimeRunRow`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait square_hole_runtime_runQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `SquareHoleRuntimeRunRow`. + fn square_hole_runtime_run(&self) -> __sdk::__query_builder::Table; +} + +impl square_hole_runtime_runQueryTableAccess for __sdk::QueryTableAccessor { + fn square_hole_runtime_run(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("square_hole_runtime_run") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_delete_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_delete_input_type.rs new file mode 100644 index 00000000..7d9fb2e4 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_delete_input_type.rs @@ -0,0 +1,16 @@ +// 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 SquareHoleWorkDeleteInput { + pub profile_id: String, + pub owner_user_id: String, +} + +impl __sdk::InModule for SquareHoleWorkDeleteInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_get_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_get_input_type.rs new file mode 100644 index 00000000..854b8205 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_get_input_type.rs @@ -0,0 +1,16 @@ +// 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 SquareHoleWorkGetInput { + pub profile_id: String, + pub owner_user_id: String, +} + +impl __sdk::InModule for SquareHoleWorkGetInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_procedure_result_type.rs new file mode 100644 index 00000000..0565f0e9 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_procedure_result_type.rs @@ -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 SquareHoleWorkProcedureResult { + pub ok: bool, + pub work_json: Option, + pub error_message: Option, +} + +impl __sdk::InModule for SquareHoleWorkProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_profile_row_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_profile_row_type.rs new file mode 100644 index 00000000..b61c6f20 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_profile_row_type.rs @@ -0,0 +1,111 @@ +// 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 SquareHoleWorkProfileRow { + pub profile_id: String, + pub work_id: String, + pub owner_user_id: String, + pub source_session_id: String, + pub author_display_name: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary_text: String, + pub tags_json: String, + pub cover_image_src: String, + pub shape_count: u32, + pub difficulty: u32, + pub config_json: String, + pub publication_status: String, + pub play_count: u32, + pub updated_at: __sdk::Timestamp, + pub published_at: Option<__sdk::Timestamp>, +} + +impl __sdk::InModule for SquareHoleWorkProfileRow { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `SquareHoleWorkProfileRow`. +/// +/// Provides typed access to columns for query building. +pub struct SquareHoleWorkProfileRowCols { + pub profile_id: __sdk::__query_builder::Col, + pub work_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub source_session_id: __sdk::__query_builder::Col, + pub author_display_name: __sdk::__query_builder::Col, + pub game_name: __sdk::__query_builder::Col, + pub theme_text: __sdk::__query_builder::Col, + pub twist_rule: __sdk::__query_builder::Col, + pub summary_text: __sdk::__query_builder::Col, + pub tags_json: __sdk::__query_builder::Col, + pub cover_image_src: __sdk::__query_builder::Col, + pub shape_count: __sdk::__query_builder::Col, + pub difficulty: __sdk::__query_builder::Col, + pub config_json: __sdk::__query_builder::Col, + pub publication_status: __sdk::__query_builder::Col, + pub play_count: __sdk::__query_builder::Col, + pub updated_at: __sdk::__query_builder::Col, + pub published_at: + __sdk::__query_builder::Col>, +} + +impl __sdk::__query_builder::HasCols for SquareHoleWorkProfileRow { + type Cols = SquareHoleWorkProfileRowCols; + fn cols(table_name: &'static str) -> Self::Cols { + SquareHoleWorkProfileRowCols { + profile_id: __sdk::__query_builder::Col::new(table_name, "profile_id"), + work_id: __sdk::__query_builder::Col::new(table_name, "work_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + source_session_id: __sdk::__query_builder::Col::new(table_name, "source_session_id"), + author_display_name: __sdk::__query_builder::Col::new( + table_name, + "author_display_name", + ), + game_name: __sdk::__query_builder::Col::new(table_name, "game_name"), + theme_text: __sdk::__query_builder::Col::new(table_name, "theme_text"), + twist_rule: __sdk::__query_builder::Col::new(table_name, "twist_rule"), + summary_text: __sdk::__query_builder::Col::new(table_name, "summary_text"), + tags_json: __sdk::__query_builder::Col::new(table_name, "tags_json"), + cover_image_src: __sdk::__query_builder::Col::new(table_name, "cover_image_src"), + shape_count: __sdk::__query_builder::Col::new(table_name, "shape_count"), + difficulty: __sdk::__query_builder::Col::new(table_name, "difficulty"), + config_json: __sdk::__query_builder::Col::new(table_name, "config_json"), + publication_status: __sdk::__query_builder::Col::new(table_name, "publication_status"), + play_count: __sdk::__query_builder::Col::new(table_name, "play_count"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + published_at: __sdk::__query_builder::Col::new(table_name, "published_at"), + } + } +} + +/// Indexed column accessor struct for the table `SquareHoleWorkProfileRow`. +/// +/// Provides typed access to indexed columns for query building. +pub struct SquareHoleWorkProfileRowIxCols { + pub owner_user_id: __sdk::__query_builder::IxCol, + pub profile_id: __sdk::__query_builder::IxCol, + pub publication_status: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for SquareHoleWorkProfileRow { + type IxCols = SquareHoleWorkProfileRowIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + SquareHoleWorkProfileRowIxCols { + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + profile_id: __sdk::__query_builder::IxCol::new(table_name, "profile_id"), + publication_status: __sdk::__query_builder::IxCol::new( + table_name, + "publication_status", + ), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for SquareHoleWorkProfileRow {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_profile_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_profile_table.rs new file mode 100644 index 00000000..9a710213 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_profile_table.rs @@ -0,0 +1,162 @@ +// 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 super::square_hole_work_profile_row_type::SquareHoleWorkProfileRow; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `square_hole_work_profile`. +/// +/// Obtain a handle from the [`SquareHoleWorkProfileTableAccess::square_hole_work_profile`] method on [`super::RemoteTables`], +/// like `ctx.db.square_hole_work_profile()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_work_profile().on_insert(...)`. +pub struct SquareHoleWorkProfileTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `square_hole_work_profile`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait SquareHoleWorkProfileTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`SquareHoleWorkProfileTableHandle`], which mediates access to the table `square_hole_work_profile`. + fn square_hole_work_profile(&self) -> SquareHoleWorkProfileTableHandle<'_>; +} + +impl SquareHoleWorkProfileTableAccess for super::RemoteTables { + fn square_hole_work_profile(&self) -> SquareHoleWorkProfileTableHandle<'_> { + SquareHoleWorkProfileTableHandle { + imp: self + .imp + .get_table::("square_hole_work_profile"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct SquareHoleWorkProfileInsertCallbackId(__sdk::CallbackId); +pub struct SquareHoleWorkProfileDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::Table for SquareHoleWorkProfileTableHandle<'ctx> { + type Row = SquareHoleWorkProfileRow; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = SquareHoleWorkProfileInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleWorkProfileInsertCallbackId { + SquareHoleWorkProfileInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: SquareHoleWorkProfileInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = SquareHoleWorkProfileDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> SquareHoleWorkProfileDeleteCallbackId { + SquareHoleWorkProfileDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: SquareHoleWorkProfileDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct SquareHoleWorkProfileUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for SquareHoleWorkProfileTableHandle<'ctx> { + type UpdateCallbackId = SquareHoleWorkProfileUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> SquareHoleWorkProfileUpdateCallbackId { + SquareHoleWorkProfileUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: SquareHoleWorkProfileUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `profile_id` unique index on the table `square_hole_work_profile`, +/// which allows point queries on the field of the same name +/// via the [`SquareHoleWorkProfileProfileIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.square_hole_work_profile().profile_id().find(...)`. +pub struct SquareHoleWorkProfileProfileIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> SquareHoleWorkProfileTableHandle<'ctx> { + /// Get a handle on the `profile_id` unique index on the table `square_hole_work_profile`. + pub fn profile_id(&self) -> SquareHoleWorkProfileProfileIdUnique<'ctx> { + SquareHoleWorkProfileProfileIdUnique { + imp: self.imp.get_unique_constraint::("profile_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> SquareHoleWorkProfileProfileIdUnique<'ctx> { + /// Find the subscribed row whose `profile_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = + client_cache.get_or_make_table::("square_hole_work_profile"); + _table.add_unique_constraint::("profile_id", |row| &row.profile_id); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `SquareHoleWorkProfileRow`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait square_hole_work_profileQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `SquareHoleWorkProfileRow`. + fn square_hole_work_profile(&self) -> __sdk::__query_builder::Table; +} + +impl square_hole_work_profileQueryTableAccess for __sdk::QueryTableAccessor { + fn square_hole_work_profile(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("square_hole_work_profile") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_publish_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_publish_input_type.rs new file mode 100644 index 00000000..f8a180b5 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_publish_input_type.rs @@ -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 SquareHoleWorkPublishInput { + pub profile_id: String, + pub owner_user_id: String, + pub published_at_micros: i64, +} + +impl __sdk::InModule for SquareHoleWorkPublishInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_update_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_update_input_type.rs new file mode 100644 index 00000000..319351d4 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_work_update_input_type.rs @@ -0,0 +1,25 @@ +// 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 SquareHoleWorkUpdateInput { + pub profile_id: String, + pub owner_user_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary_text: String, + pub tags_json: String, + pub cover_image_src: String, + pub shape_count: u32, + pub difficulty: u32, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for SquareHoleWorkUpdateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_works_list_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_works_list_input_type.rs new file mode 100644 index 00000000..20e01cfa --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_works_list_input_type.rs @@ -0,0 +1,16 @@ +// 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 SquareHoleWorksListInput { + pub owner_user_id: String, + pub published_only: bool, +} + +impl __sdk::InModule for SquareHoleWorksListInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/square_hole_works_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_works_procedure_result_type.rs new file mode 100644 index 00000000..6f7ca3f3 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/square_hole_works_procedure_result_type.rs @@ -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 SquareHoleWorksProcedureResult { + pub ok: bool, + pub items_json: Option, + pub error_message: Option, +} + +impl __sdk::InModule for SquareHoleWorksProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_reducer.rs index 5809736b..c5cc5256 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_reducer.rs @@ -47,9 +47,11 @@ pub trait start_ai_task { &self, input: AiTaskStartInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl start_ai_task for super::RemoteReducers { &self, input: AiTaskStartInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(StartAiTaskArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_stage_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_stage_reducer.rs index 1d7b7582..24ed5b3f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_stage_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/start_ai_task_stage_reducer.rs @@ -47,9 +47,11 @@ pub trait start_ai_task_stage { &self, input: AiTaskStageStartInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl start_ai_task_stage for super::RemoteReducers { &self, input: AiTaskStageStartInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(StartAiTaskStageArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/start_big_fish_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/start_big_fish_run_procedure.rs index 7f3713ab..6a149f03 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/start_big_fish_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/start_big_fish_run_procedure.rs @@ -31,10 +31,10 @@ pub trait start_big_fish_run { input: BigFishRunStartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl start_big_fish_run for super::RemoteProcedures { input: BigFishRunStartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/start_match_3_d_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/start_match_3_d_run_procedure.rs index d4126af9..c0a8c8a9 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/start_match_3_d_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/start_match_3_d_run_procedure.rs @@ -31,10 +31,10 @@ pub trait start_match_3_d_run { input: Match3DRunStartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl start_match_3_d_run for super::RemoteProcedures { input: Match3DRunStartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/start_puzzle_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/start_puzzle_run_procedure.rs index b6baeb83..c3d6d457 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/start_puzzle_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/start_puzzle_run_procedure.rs @@ -31,10 +31,10 @@ pub trait start_puzzle_run { input: PuzzleRunStartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl start_puzzle_run for super::RemoteProcedures { input: PuzzleRunStartInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/start_square_hole_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/start_square_hole_run_procedure.rs new file mode 100644 index 00000000..bda9eddd --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/start_square_hole_run_procedure.rs @@ -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::square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; +use super::square_hole_run_start_input_type::SquareHoleRunStartInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct StartSquareHoleRunArgs { + pub input: SquareHoleRunStartInput, +} + +impl __sdk::InModule for StartSquareHoleRunArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `start_square_hole_run`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait start_square_hole_run { + fn start_square_hole_run(&self, input: SquareHoleRunStartInput) { + self.start_square_hole_run_then(input, |_, _| {}); + } + + fn start_square_hole_run_then( + &self, + input: SquareHoleRunStartInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl start_square_hole_run for super::RemoteProcedures { + fn start_square_hole_run_then( + &self, + input: SquareHoleRunStartInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleRunProcedureResult>( + "start_square_hole_run", + StartSquareHoleRunArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/stop_match_3_d_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/stop_match_3_d_run_procedure.rs index f87a63d5..630e7a98 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/stop_match_3_d_run_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/stop_match_3_d_run_procedure.rs @@ -31,10 +31,10 @@ pub trait stop_match_3_d_run { input: Match3DRunStopInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl stop_match_3_d_run for super::RemoteProcedures { input: Match3DRunStopInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/stop_square_hole_run_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/stop_square_hole_run_procedure.rs new file mode 100644 index 00000000..90702e09 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/stop_square_hole_run_procedure.rs @@ -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::square_hole_run_procedure_result_type::SquareHoleRunProcedureResult; +use super::square_hole_run_stop_input_type::SquareHoleRunStopInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct StopSquareHoleRunArgs { + pub input: SquareHoleRunStopInput, +} + +impl __sdk::InModule for StopSquareHoleRunArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `stop_square_hole_run`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait stop_square_hole_run { + fn stop_square_hole_run(&self, input: SquareHoleRunStopInput) { + self.stop_square_hole_run_then(input, |_, _| {}); + } + + fn stop_square_hole_run_then( + &self, + input: SquareHoleRunStopInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl stop_square_hole_run for super::RemoteProcedures { + fn stop_square_hole_run_then( + &self, + input: SquareHoleRunStopInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleRunProcedureResult>( + "stop_square_hole_run", + StopSquareHoleRunArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_input_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_input_procedure.rs index 8ef444c5..e5bbe6b0 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_input_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_input_procedure.rs @@ -31,10 +31,10 @@ pub trait submit_big_fish_input { input: BigFishInputSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl submit_big_fish_input for super::RemoteProcedures { input: BigFishInputSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_message_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_message_procedure.rs index 0dbc0118..307d7755 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_message_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_big_fish_message_procedure.rs @@ -31,10 +31,10 @@ pub trait submit_big_fish_message { input: BigFishMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl submit_big_fish_message for super::RemoteProcedures { input: BigFishMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, BigFishSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_custom_world_agent_message_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_custom_world_agent_message_procedure.rs index c5e8def1..5debac19 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/submit_custom_world_agent_message_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_custom_world_agent_message_procedure.rs @@ -31,10 +31,10 @@ pub trait submit_custom_world_agent_message { input: CustomWorldAgentMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl submit_custom_world_agent_message for super::RemoteProcedures { input: CustomWorldAgentMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentOperationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_match_3_d_agent_message_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_match_3_d_agent_message_procedure.rs index 1ceceaf5..c323ecda 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/submit_match_3_d_agent_message_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_match_3_d_agent_message_procedure.rs @@ -31,10 +31,10 @@ pub trait submit_match_3_d_agent_message { input: Match3DAgentMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl submit_match_3_d_agent_message for super::RemoteProcedures { input: Match3DAgentMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_agent_message_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_agent_message_procedure.rs index b5b2b090..0d9e94e5 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_agent_message_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_agent_message_procedure.rs @@ -31,10 +31,10 @@ pub trait submit_puzzle_agent_message { input: PuzzleAgentMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl submit_puzzle_agent_message for super::RemoteProcedures { input: PuzzleAgentMessageSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleAgentSessionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_leaderboard_entry_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_leaderboard_entry_procedure.rs index 7df24564..9f72a916 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_leaderboard_entry_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_puzzle_leaderboard_entry_procedure.rs @@ -31,10 +31,10 @@ pub trait submit_puzzle_leaderboard_entry { input: PuzzleLeaderboardSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl submit_puzzle_leaderboard_entry for super::RemoteProcedures { input: PuzzleLeaderboardSubmitInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/submit_square_hole_agent_message_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/submit_square_hole_agent_message_procedure.rs new file mode 100644 index 00000000..bbdbe51d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/submit_square_hole_agent_message_procedure.rs @@ -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::square_hole_agent_message_submit_input_type::SquareHoleAgentMessageSubmitInput; +use super::square_hole_agent_session_procedure_result_type::SquareHoleAgentSessionProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct SubmitSquareHoleAgentMessageArgs { + pub input: SquareHoleAgentMessageSubmitInput, +} + +impl __sdk::InModule for SubmitSquareHoleAgentMessageArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `submit_square_hole_agent_message`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait submit_square_hole_agent_message { + fn submit_square_hole_agent_message(&self, input: SquareHoleAgentMessageSubmitInput) { + self.submit_square_hole_agent_message_then(input, |_, _| {}); + } + + fn submit_square_hole_agent_message_then( + &self, + input: SquareHoleAgentMessageSubmitInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl submit_square_hole_agent_message for super::RemoteProcedures { + fn submit_square_hole_agent_message_then( + &self, + input: SquareHoleAgentMessageSubmitInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleAgentSessionProcedureResult>( + "submit_square_hole_agent_message", + SubmitSquareHoleAgentMessageArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/swap_puzzle_pieces_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/swap_puzzle_pieces_procedure.rs index 9c6a1337..f5835607 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/swap_puzzle_pieces_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/swap_puzzle_pieces_procedure.rs @@ -31,10 +31,10 @@ pub trait swap_puzzle_pieces { input: PuzzleRunSwapInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl swap_puzzle_pieces for super::RemoteProcedures { input: PuzzleRunSwapInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/turn_in_quest_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/turn_in_quest_reducer.rs index 4306a47f..08727f04 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/turn_in_quest_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/turn_in_quest_reducer.rs @@ -47,9 +47,11 @@ pub trait turn_in_quest { &self, input: QuestTurnInInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl turn_in_quest for super::RemoteReducers { &self, input: QuestTurnInInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(TurnInQuestArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_and_return_procedure.rs index b87880a7..31acccce 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait unpublish_custom_world_profile_and_return { input: CustomWorldProfileUnpublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl unpublish_custom_world_profile_and_return for super::RemoteProcedures { input: CustomWorldProfileUnpublishInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_reducer.rs index 05274f62..51af927f 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/unpublish_custom_world_profile_reducer.rs @@ -50,9 +50,11 @@ pub trait unpublish_custom_world_profile { &self, input: CustomWorldProfileUnpublishInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl unpublish_custom_world_profile for super::RemoteReducers { &self, input: CustomWorldProfileUnpublishInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(UnpublishCustomWorldProfileArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/update_match_3_d_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/update_match_3_d_work_procedure.rs index ea2ee9b4..cdc42782 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/update_match_3_d_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/update_match_3_d_work_procedure.rs @@ -31,10 +31,10 @@ pub trait update_match_3_d_work { input: Match3DWorkUpdateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl update_match_3_d_work for super::RemoteProcedures { input: Match3DWorkUpdateInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, Match3DWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_run_pause_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_run_pause_procedure.rs index 1679b5ec..3388380c 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_run_pause_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_run_pause_procedure.rs @@ -31,10 +31,10 @@ pub trait update_puzzle_run_pause { input: PuzzleRunPauseInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl update_puzzle_run_pause for super::RemoteProcedures { input: PuzzleRunPauseInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_work_procedure.rs index 6710b4da..80571241 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_work_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/update_puzzle_work_procedure.rs @@ -31,10 +31,10 @@ pub trait update_puzzle_work { input: PuzzleWorkUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl update_puzzle_work for super::RemoteProcedures { input: PuzzleWorkUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleWorkProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/update_square_hole_work_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/update_square_hole_work_procedure.rs new file mode 100644 index 00000000..914b3f05 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/update_square_hole_work_procedure.rs @@ -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::square_hole_work_procedure_result_type::SquareHoleWorkProcedureResult; +use super::square_hole_work_update_input_type::SquareHoleWorkUpdateInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct UpdateSquareHoleWorkArgs { + pub input: SquareHoleWorkUpdateInput, +} + +impl __sdk::InModule for UpdateSquareHoleWorkArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `update_square_hole_work`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait update_square_hole_work { + fn update_square_hole_work(&self, input: SquareHoleWorkUpdateInput) { + self.update_square_hole_work_then(input, |_, _| {}); + } + + fn update_square_hole_work_then( + &self, + input: SquareHoleWorkUpdateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl update_square_hole_work for super::RemoteProcedures { + fn update_square_hole_work_then( + &self, + input: SquareHoleWorkUpdateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, SquareHoleWorkProcedureResult>( + "update_square_hole_work", + UpdateSquareHoleWorkArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_auth_store_snapshot_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_auth_store_snapshot_procedure.rs index 31460874..5d4da3cb 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_auth_store_snapshot_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_auth_store_snapshot_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_auth_store_snapshot { input: AuthStoreSnapshotUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_auth_store_snapshot for super::RemoteProcedures { input: AuthStoreSnapshotUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, AuthStoreSnapshotProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_and_return_procedure.rs index abc39bfe..be3ff473 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_chapter_progression_and_return { input: ChapterProgressionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_chapter_progression_and_return for super::RemoteProcedures { input: ChapterProgressionInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, ChapterProgressionProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_reducer.rs index 0cb4bb7a..de37e994 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_chapter_progression_reducer.rs @@ -47,9 +47,11 @@ pub trait upsert_chapter_progression { &self, input: ChapterProgressionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl upsert_chapter_progression for super::RemoteReducers { &self, input: ChapterProgressionInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(UpsertChapterProgressionArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_agent_operation_progress_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_agent_operation_progress_procedure.rs index 554b95b2..6d8e39a2 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_agent_operation_progress_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_agent_operation_progress_procedure.rs @@ -34,10 +34,10 @@ pub trait upsert_custom_world_agent_operation_progress { input: CustomWorldAgentOperationProgressInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -47,10 +47,10 @@ impl upsert_custom_world_agent_operation_progress for super::RemoteProcedures { input: CustomWorldAgentOperationProgressInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldAgentOperationProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_and_return_procedure.rs index 343e1807..a761ab95 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_custom_world_profile_and_return { input: CustomWorldProfileUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_custom_world_profile_and_return for super::RemoteProcedures { input: CustomWorldProfileUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, CustomWorldLibraryMutationResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_reducer.rs index e343b491..91ca2652 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_custom_world_profile_reducer.rs @@ -50,9 +50,11 @@ pub trait upsert_custom_world_profile { &self, input: CustomWorldProfileUpsertInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -61,9 +63,11 @@ impl upsert_custom_world_profile for super::RemoteReducers { &self, input: CustomWorldProfileUpsertInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(UpsertCustomWorldProfileArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_and_return_procedure.rs index b7f3a28d..91ba0d0e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_npc_state_and_return { input: NpcStateUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_npc_state_and_return for super::RemoteProcedures { input: NpcStateUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, NpcStateProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_reducer.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_reducer.rs index f363770d..afbe61f8 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_reducer.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_npc_state_reducer.rs @@ -47,9 +47,11 @@ pub trait upsert_npc_state { &self, input: NpcStateUpsertInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()>; } @@ -58,9 +60,11 @@ impl upsert_npc_state for super::RemoteReducers { &self, input: NpcStateUpsertInput, - callback: impl FnOnce(&super::ReducerEventContext, Result, __sdk::InternalError>) - + Send - + 'static, + callback: impl FnOnce( + &super::ReducerEventContext, + Result, __sdk::InternalError>, + ) + Send + + 'static, ) -> __sdk::Result<()> { self.imp .invoke_reducer_with_callback(UpsertNpcStateArgs { input }, callback) diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_platform_browse_history_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_platform_browse_history_and_return_procedure.rs index 614a6d05..36e5f464 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_platform_browse_history_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_platform_browse_history_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_platform_browse_history_and_return { input: RuntimeBrowseHistorySyncInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_platform_browse_history_and_return for super::RemoteProcedures { input: RuntimeBrowseHistorySyncInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeBrowseHistoryProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_setting_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_setting_and_return_procedure.rs index 119eab70..f8fa0351 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_setting_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_setting_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_runtime_setting_and_return { input: RuntimeSettingUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_runtime_setting_and_return for super::RemoteProcedures { input: RuntimeSettingUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeSettingProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_snapshot_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_snapshot_and_return_procedure.rs index eceae785..fe0746ba 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_snapshot_and_return_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/upsert_runtime_snapshot_and_return_procedure.rs @@ -31,10 +31,10 @@ pub trait upsert_runtime_snapshot_and_return { input: RuntimeSnapshotUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl upsert_runtime_snapshot_and_return for super::RemoteProcedures { input: RuntimeSnapshotUpsertInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, RuntimeSnapshotProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/module_bindings/use_puzzle_runtime_prop_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/use_puzzle_runtime_prop_procedure.rs index 45bd3a73..1e2dbe13 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/use_puzzle_runtime_prop_procedure.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/use_puzzle_runtime_prop_procedure.rs @@ -31,10 +31,10 @@ pub trait use_puzzle_runtime_prop { input: PuzzleRunPropInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ); } @@ -44,10 +44,10 @@ impl use_puzzle_runtime_prop for super::RemoteProcedures { input: PuzzleRunPropInput, __callback: impl FnOnce( - &super::ProcedureEventContext, - Result, - ) + Send - + 'static, + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, ) { self.imp .invoke_procedure_with_callback::<_, PuzzleRunProcedureResult>( diff --git a/server-rs/crates/spacetime-client/src/square_hole.rs b/server-rs/crates/spacetime-client/src/square_hole.rs new file mode 100644 index 00000000..c4c3e6cb --- /dev/null +++ b/server-rs/crates/spacetime-client/src/square_hole.rs @@ -0,0 +1,432 @@ +use super::*; +use crate::mapper::*; + +impl SpacetimeClient { + pub async fn create_square_hole_agent_session( + &self, + input: SquareHoleAgentSessionCreateRecordInput, + ) -> Result { + let procedure_input = SquareHoleAgentSessionCreateInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + seed_text: input.seed_text, + welcome_message_id: input.welcome_message_id, + welcome_message_text: input.welcome_message_text, + config_json: input.config_json, + created_at_micros: input.created_at_micros, + }; + + self.call_after_connect(move |connection, sender| { + connection.procedures().create_square_hole_agent_session_then( + procedure_input, + move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_agent_session_procedure_result); + send_once(&sender, mapped); + }, + ); + }) + .await + } + + pub async fn get_square_hole_agent_session( + &self, + session_id: String, + owner_user_id: String, + ) -> Result { + let procedure_input = SquareHoleAgentSessionGetInput { + session_id, + owner_user_id, + }; + + self.call_after_connect(move |connection, sender| { + connection.procedures().get_square_hole_agent_session_then( + procedure_input, + move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_agent_session_procedure_result); + send_once(&sender, mapped); + }, + ); + }) + .await + } + + pub async fn submit_square_hole_agent_message( + &self, + input: SquareHoleAgentMessageSubmitRecordInput, + ) -> Result { + let procedure_input = SquareHoleAgentMessageSubmitInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + user_message_id: input.user_message_id, + user_message_text: input.user_message_text, + submitted_at_micros: input.submitted_at_micros, + }; + + self.call_after_connect(move |connection, sender| { + connection.procedures().submit_square_hole_agent_message_then( + procedure_input, + move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_agent_session_procedure_result); + send_once(&sender, mapped); + }, + ); + }) + .await + } + + pub async fn finalize_square_hole_agent_message( + &self, + input: SquareHoleAgentMessageFinalizeRecordInput, + ) -> Result { + let procedure_input = SquareHoleAgentMessageFinalizeInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + assistant_message_id: input.assistant_message_id, + assistant_reply_text: input.assistant_reply_text, + config_json: input.config_json, + progress_percent: input.progress_percent, + stage: input.stage, + updated_at_micros: input.updated_at_micros, + error_message: input.error_message, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .finalize_square_hole_agent_message_turn_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_agent_session_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn compile_square_hole_draft( + &self, + input: SquareHoleCompileDraftRecordInput, + ) -> Result { + let procedure_input = SquareHoleDraftCompileInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + profile_id: input.profile_id, + author_display_name: input.author_display_name, + game_name: input.game_name, + summary_text: input.summary_text, + tags_json: input.tags_json, + cover_image_src: input.cover_image_src, + compiled_at_micros: input.compiled_at_micros, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .compile_square_hole_draft_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_agent_session_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn update_square_hole_work( + &self, + input: SquareHoleWorkUpdateRecordInput, + ) -> Result { + let procedure_input = SquareHoleWorkUpdateInput { + profile_id: input.profile_id, + owner_user_id: input.owner_user_id, + game_name: input.game_name, + theme_text: input.theme_text, + twist_rule: input.twist_rule, + summary_text: input.summary_text, + tags_json: input.tags_json, + cover_image_src: input.cover_image_src, + shape_count: input.shape_count, + difficulty: input.difficulty, + updated_at_micros: input.updated_at_micros, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .update_square_hole_work_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_work_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn publish_square_hole_work( + &self, + profile_id: String, + owner_user_id: String, + published_at_micros: i64, + ) -> Result { + let procedure_input = SquareHoleWorkPublishInput { + profile_id, + owner_user_id, + published_at_micros, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .publish_square_hole_work_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_work_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn list_square_hole_works( + &self, + owner_user_id: String, + ) -> Result, SpacetimeClientError> { + self.list_square_hole_works_with_input(SquareHoleWorksListInput { + owner_user_id, + published_only: false, + }) + .await + } + + pub async fn list_square_hole_gallery( + &self, + ) -> Result, SpacetimeClientError> { + self.list_square_hole_works_with_input(SquareHoleWorksListInput { + // 中文注释:公开广场只依赖 published_only,owner_user_id 用固定值通过输入校验。 + owner_user_id: "square-hole-public-gallery".to_string(), + published_only: true, + }) + .await + } + + async fn list_square_hole_works_with_input( + &self, + procedure_input: SquareHoleWorksListInput, + ) -> Result, SpacetimeClientError> { + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .list_square_hole_works_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_works_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn get_square_hole_work_detail( + &self, + profile_id: String, + owner_user_id: String, + ) -> Result { + let procedure_input = SquareHoleWorkGetInput { + profile_id, + owner_user_id, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .get_square_hole_work_detail_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_work_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn delete_square_hole_work( + &self, + profile_id: String, + owner_user_id: String, + ) -> Result, SpacetimeClientError> { + let procedure_input = SquareHoleWorkDeleteInput { + profile_id, + owner_user_id, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .delete_square_hole_work_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_works_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn start_square_hole_run( + &self, + input: SquareHoleRunStartRecordInput, + ) -> Result { + let procedure_input = SquareHoleRunStartInput { + run_id: input.run_id, + owner_user_id: input.owner_user_id, + profile_id: input.profile_id, + started_at_ms: input.started_at_ms, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .start_square_hole_run_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_run_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn get_square_hole_run( + &self, + run_id: String, + owner_user_id: String, + ) -> Result { + let procedure_input = SquareHoleRunGetInput { + run_id, + owner_user_id, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .get_square_hole_run_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_run_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn drop_square_hole_shape( + &self, + input: SquareHoleRunDropRecordInput, + ) -> Result { + let client_event_id = input.client_event_id.clone(); + let procedure_input = SquareHoleRunDropInput { + run_id: input.run_id, + owner_user_id: input.owner_user_id, + hole_id: input.hole_id, + client_snapshot_version: input.client_snapshot_version, + client_event_id: input.client_event_id, + dropped_at_ms: input.dropped_at_ms, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .drop_square_hole_shape_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_drop_shape_procedure_result) + .map(|mut confirmation| { + if confirmation.accepted { + confirmation.run.last_confirmed_action_id = + Some(client_event_id); + } + confirmation + }); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn stop_square_hole_run( + &self, + input: SquareHoleRunStopRecordInput, + ) -> Result { + let procedure_input = SquareHoleRunStopInput { + run_id: input.run_id, + owner_user_id: input.owner_user_id, + stopped_at_ms: input.stopped_at_ms, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .stop_square_hole_run_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_run_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn restart_square_hole_run( + &self, + input: SquareHoleRunRestartRecordInput, + ) -> Result { + let procedure_input = SquareHoleRunRestartInput { + source_run_id: input.source_run_id, + next_run_id: input.next_run_id, + owner_user_id: input.owner_user_id, + restarted_at_ms: input.restarted_at_ms, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .restart_square_hole_run_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_run_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn finish_square_hole_time_up( + &self, + input: SquareHoleRunTimeUpRecordInput, + ) -> Result { + let procedure_input = SquareHoleRunTimeUpInput { + run_id: input.run_id, + owner_user_id: input.owner_user_id, + finished_at_ms: input.finished_at_ms, + }; + + self.call_after_connect(move |connection, sender| { + connection + .procedures() + .finish_square_hole_time_up_then(procedure_input, move |_, result| { + let mapped = result + .map_err(|error| SpacetimeClientError::Procedure(error.to_string())) + .and_then(map_square_hole_run_procedure_result); + send_once(&sender, mapped); + }); + }) + .await + } +} diff --git a/server-rs/crates/spacetime-module/Cargo.toml b/server-rs/crates/spacetime-module/Cargo.toml index 2ae5c223..743e0cc2 100644 --- a/server-rs/crates/spacetime-module/Cargo.toml +++ b/server-rs/crates/spacetime-module/Cargo.toml @@ -25,6 +25,7 @@ module-progression = { path = "../module-progression", default-features = false, module-quest = { path = "../module-quest", default-features = false, features = ["spacetime-types"] } module-runtime = { path = "../module-runtime", default-features = false, features = ["spacetime-types"] } module-runtime-item = { path = "../module-runtime-item", default-features = false, features = ["spacetime-types"] } +module-square-hole = { path = "../module-square-hole", default-features = false } module-story = { path = "../module-story", default-features = false, features = ["spacetime-types"] } shared-kernel = { path = "../shared-kernel" } spacetimedb = { workspace = true, features = ["unstable"] } diff --git a/server-rs/crates/spacetime-module/src/lib.rs b/server-rs/crates/spacetime-module/src/lib.rs index ce79efe6..9d9da19c 100644 --- a/server-rs/crates/spacetime-module/src/lib.rs +++ b/server-rs/crates/spacetime-module/src/lib.rs @@ -32,6 +32,7 @@ mod match3d; mod migration; mod puzzle; mod runtime; +mod square_hole; pub use ai::*; pub use asset_metadata::*; @@ -44,3 +45,4 @@ pub use gameplay::*; pub use match3d::*; pub use migration::*; pub use runtime::*; +pub use square_hole::*; diff --git a/server-rs/crates/spacetime-module/src/migration.rs b/server-rs/crates/spacetime-module/src/migration.rs index 75ff0de0..780e328e 100644 --- a/server-rs/crates/spacetime-module/src/migration.rs +++ b/server-rs/crates/spacetime-module/src/migration.rs @@ -13,6 +13,10 @@ use crate::puzzle::{ puzzle_agent_message, puzzle_agent_session, puzzle_event, puzzle_leaderboard_entry, puzzle_runtime_run, puzzle_work_profile, }; +use crate::square_hole::tables::{ + square_hole_agent_message, square_hole_agent_session, square_hole_runtime_run, + square_hole_work_profile, +}; const MIGRATION_SCHEMA_VERSION: u32 = 1; const MIGRATION_MAX_TABLE_NAME_LEN: usize = 96; @@ -208,6 +212,10 @@ macro_rules! migration_tables { match3d_agent_message, match3d_work_profile, match3d_runtime_run, + square_hole_agent_session, + square_hole_agent_message, + square_hole_work_profile, + square_hole_runtime_run, big_fish_creation_session, big_fish_agent_message, big_fish_asset_slot, diff --git a/server-rs/crates/spacetime-module/src/square_hole/mod.rs b/server-rs/crates/spacetime-module/src/square_hole/mod.rs new file mode 100644 index 00000000..4390cc55 --- /dev/null +++ b/server-rs/crates/spacetime-module/src/square_hole/mod.rs @@ -0,0 +1,1399 @@ +pub(crate) mod tables; +mod types; + +pub use tables::*; +pub use types::*; + +use crate::*; +use module_square_hole::{ + SquareHoleCreatorConfig as DomainSquareHoleCreatorConfig, + SquareHoleDropFeedback as DomainSquareHoleDropFeedback, + SquareHoleDropInput as DomainSquareHoleDropInput, + SquareHoleDropRejectReason as DomainSquareHoleDropRejectReason, + SquareHoleHoleSnapshot as DomainSquareHoleHoleSnapshot, + SquareHoleRunSnapshot as DomainSquareHoleRunSnapshot, + SquareHoleRunStatus as DomainSquareHoleRunStatus, + SquareHoleShapeSnapshot as DomainSquareHoleShapeSnapshot, + build_creator_config as build_domain_creator_config, + compile_result_draft as compile_domain_result_draft, confirm_drop_at as confirm_domain_drop_at, + resolve_run_timer_at as resolve_domain_run_timer_at, start_run_at as start_domain_run_at, + stop_run_at as stop_domain_run_at, +}; +use serde::Serialize; +use serde::de::DeserializeOwned; + +#[spacetimedb::procedure] +pub fn create_square_hole_agent_session( + ctx: &mut ProcedureContext, + input: SquareHoleAgentSessionCreateInput, +) -> SquareHoleAgentSessionProcedureResult { + match ctx.try_with_tx(|tx| create_square_hole_agent_session_tx(tx, input.clone())) { + Ok(session) => session_result(session), + Err(message) => session_error(message), + } +} + +#[spacetimedb::procedure] +pub fn get_square_hole_agent_session( + ctx: &mut ProcedureContext, + input: SquareHoleAgentSessionGetInput, +) -> SquareHoleAgentSessionProcedureResult { + match ctx.try_with_tx(|tx| get_square_hole_agent_session_tx(tx, input.clone())) { + Ok(session) => session_result(session), + Err(message) => session_error(message), + } +} + +#[spacetimedb::procedure] +pub fn submit_square_hole_agent_message( + ctx: &mut ProcedureContext, + input: SquareHoleAgentMessageSubmitInput, +) -> SquareHoleAgentSessionProcedureResult { + match ctx.try_with_tx(|tx| submit_square_hole_agent_message_tx(tx, input.clone())) { + Ok(session) => session_result(session), + Err(message) => session_error(message), + } +} + +#[spacetimedb::procedure] +pub fn finalize_square_hole_agent_message_turn( + ctx: &mut ProcedureContext, + input: SquareHoleAgentMessageFinalizeInput, +) -> SquareHoleAgentSessionProcedureResult { + match ctx.try_with_tx(|tx| finalize_square_hole_agent_message_turn_tx(tx, input.clone())) { + Ok(session) => session_result(session), + Err(message) => session_error(message), + } +} + +#[spacetimedb::procedure] +pub fn compile_square_hole_draft( + ctx: &mut ProcedureContext, + input: SquareHoleDraftCompileInput, +) -> SquareHoleAgentSessionProcedureResult { + match ctx.try_with_tx(|tx| compile_square_hole_draft_tx(tx, input.clone())) { + Ok(session) => session_result(session), + Err(message) => session_error(message), + } +} + +#[spacetimedb::procedure] +pub fn update_square_hole_work( + ctx: &mut ProcedureContext, + input: SquareHoleWorkUpdateInput, +) -> SquareHoleWorkProcedureResult { + match ctx.try_with_tx(|tx| update_square_hole_work_tx(tx, input.clone())) { + Ok(work) => work_result(work), + Err(message) => work_error(message), + } +} + +#[spacetimedb::procedure] +pub fn publish_square_hole_work( + ctx: &mut ProcedureContext, + input: SquareHoleWorkPublishInput, +) -> SquareHoleWorkProcedureResult { + match ctx.try_with_tx(|tx| publish_square_hole_work_tx(tx, input.clone())) { + Ok(work) => work_result(work), + Err(message) => work_error(message), + } +} + +#[spacetimedb::procedure] +pub fn list_square_hole_works( + ctx: &mut ProcedureContext, + input: SquareHoleWorksListInput, +) -> SquareHoleWorksProcedureResult { + match ctx.try_with_tx(|tx| list_square_hole_works_tx(tx, input.clone())) { + Ok(items) => SquareHoleWorksProcedureResult { + ok: true, + items_json: Some(to_json_string(&items)), + error_message: None, + }, + Err(message) => SquareHoleWorksProcedureResult { + ok: false, + items_json: None, + error_message: Some(message), + }, + } +} + +#[spacetimedb::procedure] +pub fn get_square_hole_work_detail( + ctx: &mut ProcedureContext, + input: SquareHoleWorkGetInput, +) -> SquareHoleWorkProcedureResult { + match ctx.try_with_tx(|tx| get_square_hole_work_detail_tx(tx, input.clone())) { + Ok(work) => work_result(work), + Err(message) => work_error(message), + } +} + +#[spacetimedb::procedure] +pub fn delete_square_hole_work( + ctx: &mut ProcedureContext, + input: SquareHoleWorkDeleteInput, +) -> SquareHoleWorksProcedureResult { + match ctx.try_with_tx(|tx| delete_square_hole_work_tx(tx, input.clone())) { + Ok(items) => SquareHoleWorksProcedureResult { + ok: true, + items_json: Some(to_json_string(&items)), + error_message: None, + }, + Err(message) => SquareHoleWorksProcedureResult { + ok: false, + items_json: None, + error_message: Some(message), + }, + } +} + +#[spacetimedb::procedure] +pub fn start_square_hole_run( + ctx: &mut ProcedureContext, + input: SquareHoleRunStartInput, +) -> SquareHoleRunProcedureResult { + match ctx.try_with_tx(|tx| start_square_hole_run_tx(tx, input.clone())) { + Ok(run) => run_result(run), + Err(message) => run_error(message), + } +} + +#[spacetimedb::procedure] +pub fn get_square_hole_run( + ctx: &mut ProcedureContext, + input: SquareHoleRunGetInput, +) -> SquareHoleRunProcedureResult { + match ctx.try_with_tx(|tx| get_square_hole_run_tx(tx, input.clone())) { + Ok(run) => run_result(run), + Err(message) => run_error(message), + } +} + +#[spacetimedb::procedure] +pub fn drop_square_hole_shape( + ctx: &mut ProcedureContext, + input: SquareHoleRunDropInput, +) -> SquareHoleDropShapeProcedureResult { + match ctx.try_with_tx(|tx| drop_square_hole_shape_tx(tx, input.clone())) { + Ok(result) => result, + Err(message) => SquareHoleDropShapeProcedureResult { + ok: false, + status: SQUARE_HOLE_DROP_REJECTED.to_string(), + run_json: None, + feedback_json: None, + failure_reason: None, + error_message: Some(message), + }, + } +} + +#[spacetimedb::procedure] +pub fn stop_square_hole_run( + ctx: &mut ProcedureContext, + input: SquareHoleRunStopInput, +) -> SquareHoleRunProcedureResult { + match ctx.try_with_tx(|tx| stop_square_hole_run_tx(tx, input.clone())) { + Ok(run) => run_result(run), + Err(message) => run_error(message), + } +} + +#[spacetimedb::procedure] +pub fn restart_square_hole_run( + ctx: &mut ProcedureContext, + input: SquareHoleRunRestartInput, +) -> SquareHoleRunProcedureResult { + match ctx.try_with_tx(|tx| restart_square_hole_run_tx(tx, input.clone())) { + Ok(run) => run_result(run), + Err(message) => run_error(message), + } +} + +#[spacetimedb::procedure] +pub fn finish_square_hole_time_up( + ctx: &mut ProcedureContext, + input: SquareHoleRunTimeUpInput, +) -> SquareHoleRunProcedureResult { + match ctx.try_with_tx(|tx| finish_square_hole_time_up_tx(tx, input.clone())) { + Ok(run) => run_result(run), + Err(message) => run_error(message), + } +} + +fn create_square_hole_agent_session_tx( + ctx: &ReducerContext, + input: SquareHoleAgentSessionCreateInput, +) -> Result { + require_non_empty(&input.session_id, "square_hole session_id")?; + require_non_empty(&input.owner_user_id, "square_hole owner_user_id")?; + require_non_empty(&input.welcome_message_id, "square_hole welcome_message_id")?; + if ctx + .db + .square_hole_agent_session() + .session_id() + .find(&input.session_id) + .is_some() + { + return Err("square_hole_agent_session.session_id 已存在".to_string()); + } + + let config = input + .config_json + .as_deref() + .map(parse_config) + .transpose()? + .unwrap_or_else(|| default_config_from_seed(&input.seed_text)); + validate_config(&config)?; + let created_at = Timestamp::from_micros_since_unix_epoch(input.created_at_micros); + let welcome = input.welcome_message_text.trim(); + + ctx.db + .square_hole_agent_session() + .insert(SquareHoleAgentSessionRow { + session_id: input.session_id.clone(), + owner_user_id: input.owner_user_id.clone(), + seed_text: input.seed_text.trim().to_string(), + current_turn: 0, + progress_percent: 0, + stage: SQUARE_HOLE_STAGE_COLLECTING.to_string(), + config_json: to_json_string(&config), + draft_json: String::new(), + last_assistant_reply: welcome.to_string(), + published_profile_id: String::new(), + created_at, + updated_at: created_at, + }); + ctx.db + .square_hole_agent_message() + .insert(SquareHoleAgentMessageRow { + message_id: input.welcome_message_id, + session_id: input.session_id.clone(), + role: SQUARE_HOLE_ROLE_ASSISTANT.to_string(), + kind: SQUARE_HOLE_KIND_TEXT.to_string(), + text: welcome.to_string(), + created_at, + }); + + get_square_hole_agent_session_tx( + ctx, + SquareHoleAgentSessionGetInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + }, + ) +} + +fn get_square_hole_agent_session_tx( + ctx: &ReducerContext, + input: SquareHoleAgentSessionGetInput, +) -> Result { + let row = find_owned_session(ctx, &input.session_id, &input.owner_user_id)?; + build_session_snapshot(ctx, &row) +} + +fn submit_square_hole_agent_message_tx( + ctx: &ReducerContext, + input: SquareHoleAgentMessageSubmitInput, +) -> Result { + require_non_empty(&input.user_message_id, "square_hole user_message_id")?; + require_non_empty(&input.user_message_text, "square_hole user_message_text")?; + let session = find_owned_session(ctx, &input.session_id, &input.owner_user_id)?; + if ctx + .db + .square_hole_agent_message() + .message_id() + .find(&input.user_message_id) + .is_some() + { + return Err("square_hole_agent_message.user_message_id 已存在".to_string()); + } + + let submitted_at = Timestamp::from_micros_since_unix_epoch(input.submitted_at_micros); + ctx.db + .square_hole_agent_message() + .insert(SquareHoleAgentMessageRow { + message_id: input.user_message_id, + session_id: input.session_id.clone(), + role: SQUARE_HOLE_ROLE_USER.to_string(), + kind: SQUARE_HOLE_KIND_TEXT.to_string(), + text: input.user_message_text.trim().to_string(), + created_at: submitted_at, + }); + replace_session( + ctx, + &session, + SquareHoleAgentSessionRow { + updated_at: submitted_at, + ..clone_session(&session) + }, + ); + + get_square_hole_agent_session_tx( + ctx, + SquareHoleAgentSessionGetInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + }, + ) +} + +fn finalize_square_hole_agent_message_turn_tx( + ctx: &ReducerContext, + input: SquareHoleAgentMessageFinalizeInput, +) -> Result { + let session = find_owned_session(ctx, &input.session_id, &input.owner_user_id)?; + let updated_at = Timestamp::from_micros_since_unix_epoch(input.updated_at_micros); + if let Some(message) = input + .error_message + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + { + return Err(message.to_string()); + } + + let next_config = input + .config_json + .as_deref() + .map(parse_config) + .transpose()? + .unwrap_or_else(|| parse_config_or_default(&session.config_json)); + validate_config(&next_config)?; + let assistant_text = input + .assistant_reply_text + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(&session.last_assistant_reply) + .to_string(); + if let Some(message_id) = input + .assistant_message_id + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + { + ctx.db + .square_hole_agent_message() + .insert(SquareHoleAgentMessageRow { + message_id: message_id.to_string(), + session_id: input.session_id.clone(), + role: SQUARE_HOLE_ROLE_ASSISTANT.to_string(), + kind: SQUARE_HOLE_KIND_TEXT.to_string(), + text: assistant_text.clone(), + created_at: updated_at, + }); + } + + replace_session( + ctx, + &session, + SquareHoleAgentSessionRow { + current_turn: session.current_turn.saturating_add(1), + progress_percent: input.progress_percent.min(100), + stage: normalize_stage(&input.stage), + config_json: to_json_string(&next_config), + last_assistant_reply: assistant_text, + updated_at, + ..clone_session(&session) + }, + ); + + get_square_hole_agent_session_tx( + ctx, + SquareHoleAgentSessionGetInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + }, + ) +} + +fn compile_square_hole_draft_tx( + ctx: &ReducerContext, + input: SquareHoleDraftCompileInput, +) -> Result { + require_non_empty(&input.profile_id, "square_hole profile_id")?; + let session = find_owned_session(ctx, &input.session_id, &input.owner_user_id)?; + let config = parse_config(&session.config_json)?; + validate_config(&config)?; + let domain_config = domain_config_from_snapshot(&config).map_err(|error| error.to_string())?; + let mut domain_draft = compile_domain_result_draft(input.profile_id.clone(), &domain_config); + if let Some(game_name) = clean_optional(&input.game_name) { + domain_draft.game_name = game_name; + } + if let Some(summary_text) = clean_optional(&input.summary_text) { + domain_draft.summary = summary_text; + } + if let Some(tags) = input.tags_json.as_deref().map(parse_tags).transpose()? { + if !tags.is_empty() { + domain_draft.tags = tags; + } + } + domain_draft.blockers = module_square_hole::validate_publish_requirements(&domain_draft); + domain_draft.publish_ready = domain_draft.blockers.is_empty(); + + let draft = SquareHoleDraftSnapshot { + profile_id: input.profile_id.clone(), + game_name: domain_draft.game_name.clone(), + theme_text: domain_draft.theme_text.clone(), + twist_rule: domain_draft.twist_rule.clone(), + summary_text: domain_draft.summary.clone(), + tags: domain_draft.tags.clone(), + shape_count: domain_draft.shape_count, + difficulty: domain_draft.difficulty, + }; + let compiled_at = Timestamp::from_micros_since_unix_epoch(input.compiled_at_micros); + let work = SquareHoleWorkProfileRow { + profile_id: input.profile_id.clone(), + work_id: input.profile_id.clone(), + owner_user_id: input.owner_user_id.clone(), + source_session_id: input.session_id.clone(), + author_display_name: clean_string(&input.author_display_name, "百梦主"), + game_name: draft.game_name.clone(), + theme_text: config.theme_text.clone(), + twist_rule: config.twist_rule.clone(), + summary_text: draft.summary_text.clone(), + tags_json: to_json_string(&draft.tags), + cover_image_src: clean_optional(&input.cover_image_src).unwrap_or_default(), + shape_count: config.shape_count, + difficulty: config.difficulty, + config_json: to_json_string(&config), + publication_status: SQUARE_HOLE_PUBLICATION_DRAFT.to_string(), + play_count: 0, + updated_at: compiled_at, + published_at: None, + }; + upsert_work(ctx, work); + replace_session( + ctx, + &session, + SquareHoleAgentSessionRow { + progress_percent: 80, + stage: SQUARE_HOLE_STAGE_DRAFT_COMPILED.to_string(), + draft_json: to_json_string(&draft), + published_profile_id: input.profile_id, + last_assistant_reply: "方洞挑战草稿已生成,可以进入结果页试玩和发布。".to_string(), + updated_at: compiled_at, + ..clone_session(&session) + }, + ); + + get_square_hole_agent_session_tx( + ctx, + SquareHoleAgentSessionGetInput { + session_id: input.session_id, + owner_user_id: input.owner_user_id, + }, + ) +} + +fn update_square_hole_work_tx( + ctx: &ReducerContext, + input: SquareHoleWorkUpdateInput, +) -> Result { + let current = find_owned_work(ctx, &input.profile_id, &input.owner_user_id)?; + let tags = parse_tags(&input.tags_json)?; + let config = SquareHoleCreatorConfigSnapshot { + theme_text: clean_string(&input.theme_text, "玩具"), + twist_rule: clean_string(&input.twist_rule, "方洞万能"), + shape_count: input.shape_count, + difficulty: input.difficulty, + }; + validate_config(&config)?; + let updated_at = Timestamp::from_micros_since_unix_epoch(input.updated_at_micros); + let next = SquareHoleWorkProfileRow { + profile_id: current.profile_id.clone(), + work_id: current.work_id.clone(), + owner_user_id: current.owner_user_id.clone(), + source_session_id: current.source_session_id.clone(), + author_display_name: current.author_display_name.clone(), + game_name: clean_string(&input.game_name, "未命名方洞挑战"), + theme_text: config.theme_text.clone(), + twist_rule: config.twist_rule.clone(), + summary_text: clean_string(&input.summary_text, "反直觉形状分拣玩法"), + tags_json: to_json_string(&tags), + cover_image_src: input.cover_image_src.trim().to_string(), + shape_count: config.shape_count, + difficulty: config.difficulty, + config_json: to_json_string(&config), + publication_status: current.publication_status.clone(), + play_count: current.play_count, + updated_at, + published_at: current.published_at, + }; + let snapshot = build_work_snapshot(&next)?; + replace_work(ctx, ¤t, next); + Ok(snapshot) +} + +fn publish_square_hole_work_tx( + ctx: &ReducerContext, + input: SquareHoleWorkPublishInput, +) -> Result { + let current = find_owned_work(ctx, &input.profile_id, &input.owner_user_id)?; + validate_publishable_work(¤t)?; + let published_at = Timestamp::from_micros_since_unix_epoch(input.published_at_micros); + let next = SquareHoleWorkProfileRow { + publication_status: SQUARE_HOLE_PUBLICATION_PUBLISHED.to_string(), + updated_at: published_at, + published_at: Some(published_at), + ..clone_work(¤t) + }; + let snapshot = build_work_snapshot(&next)?; + replace_work(ctx, ¤t, next); + if !current.source_session_id.is_empty() { + if let Some(session) = ctx + .db + .square_hole_agent_session() + .session_id() + .find(¤t.source_session_id) + .filter(|row| row.owner_user_id == input.owner_user_id) + { + replace_session( + ctx, + &session, + SquareHoleAgentSessionRow { + stage: SQUARE_HOLE_STAGE_PUBLISHED.to_string(), + progress_percent: 100, + updated_at: published_at, + ..clone_session(&session) + }, + ); + } + } + Ok(snapshot) +} + +fn list_square_hole_works_tx( + ctx: &ReducerContext, + input: SquareHoleWorksListInput, +) -> Result, String> { + let rows = if input.published_only { + ctx.db + .square_hole_work_profile() + .by_square_hole_work_publication_status() + .filter(SQUARE_HOLE_PUBLICATION_PUBLISHED) + .collect::>() + } else { + require_non_empty(&input.owner_user_id, "square_hole owner_user_id")?; + ctx.db + .square_hole_work_profile() + .by_square_hole_work_owner_user_id() + .filter(&input.owner_user_id) + .collect::>() + }; + let mut items = rows + .iter() + .map(build_work_snapshot) + .collect::, _>>()?; + items.sort_by(|left, right| right.updated_at_micros.cmp(&left.updated_at_micros)); + Ok(items) +} + +fn get_square_hole_work_detail_tx( + ctx: &ReducerContext, + input: SquareHoleWorkGetInput, +) -> Result { + let row = ctx + .db + .square_hole_work_profile() + .profile_id() + .find(&input.profile_id) + .ok_or_else(|| "方洞挑战作品不存在".to_string())?; + if row.owner_user_id != input.owner_user_id + && row.publication_status != SQUARE_HOLE_PUBLICATION_PUBLISHED + { + return Err("无权访问该方洞挑战作品".to_string()); + } + build_work_snapshot(&row) +} + +fn delete_square_hole_work_tx( + ctx: &ReducerContext, + input: SquareHoleWorkDeleteInput, +) -> Result, String> { + let current = find_owned_work(ctx, &input.profile_id, &input.owner_user_id)?; + ctx.db + .square_hole_work_profile() + .profile_id() + .delete(¤t.profile_id); + list_square_hole_works_tx( + ctx, + SquareHoleWorksListInput { + owner_user_id: input.owner_user_id, + published_only: false, + }, + ) +} + +fn start_square_hole_run_tx( + ctx: &ReducerContext, + input: SquareHoleRunStartInput, +) -> Result { + let work = find_playable_work(ctx, &input.profile_id, &input.owner_user_id)?; + let config = parse_config(&work.config_json)?; + let domain_config = domain_config_from_snapshot(&config).map_err(|error| error.to_string())?; + let started_at_ms = input.started_at_ms.max(0) as u64; + let domain_run = start_domain_run_at( + input.run_id.clone(), + input.owner_user_id.clone(), + input.profile_id.clone(), + &domain_config, + started_at_ms, + ) + .map_err(|error| error.to_string())?; + let snapshot = snapshot_from_domain(&domain_run, input.started_at_ms.max(0)); + let created_at = Timestamp::from_micros_since_unix_epoch(input.started_at_ms * 1000); + ctx.db + .square_hole_runtime_run() + .insert(run_row_from_snapshot(&snapshot, created_at, created_at)); + replace_work( + ctx, + &work, + SquareHoleWorkProfileRow { + play_count: work.play_count.saturating_add(1), + updated_at: created_at, + ..clone_work(&work) + }, + ); + Ok(snapshot) +} + +fn get_square_hole_run_tx( + ctx: &ReducerContext, + input: SquareHoleRunGetInput, +) -> Result { + let row = find_owned_run(ctx, &input.run_id, &input.owner_user_id)?; + refresh_run_row(ctx, row, current_server_ms(ctx)) +} + +fn drop_square_hole_shape_tx( + ctx: &ReducerContext, + input: SquareHoleRunDropInput, +) -> Result { + let row = find_owned_run(ctx, &input.run_id, &input.owner_user_id)?; + let snapshot = deserialize_snapshot(&row.snapshot_json)?; + let domain_run = domain_snapshot_from_snapshot(&snapshot, &row.owner_user_id); + let confirmation = confirm_domain_drop_at( + &domain_run, + &DomainSquareHoleDropInput { + run_id: input.run_id, + owner_user_id: input.owner_user_id, + hole_id: input.hole_id, + client_snapshot_version: input.client_snapshot_version, + client_event_id: input.client_event_id, + dropped_at_ms: input.dropped_at_ms.max(0) as u64, + }, + ) + .map_err(|error| error.to_string())?; + let next = snapshot_from_domain(&confirmation.run, input.dropped_at_ms.max(0)); + replace_run( + ctx, + &row, + run_row_from_snapshot(&next, row.created_at, ctx.timestamp), + ); + let status = if confirmation.feedback.accepted { + SQUARE_HOLE_DROP_ACCEPTED + } else { + match confirmation.feedback.reject_reason { + Some(DomainSquareHoleDropRejectReason::SnapshotVersionMismatch) => { + SQUARE_HOLE_DROP_VERSION_CONFLICT + } + Some(DomainSquareHoleDropRejectReason::RunNotActive) + | Some(DomainSquareHoleDropRejectReason::TimeUp) => SQUARE_HOLE_DROP_RUN_FINISHED, + _ => SQUARE_HOLE_DROP_REJECTED, + } + }; + + Ok(SquareHoleDropShapeProcedureResult { + ok: true, + status: status.to_string(), + run_json: Some(to_json_string(&next)), + feedback_json: Some(to_json_string(&feedback_from_domain( + &confirmation.feedback, + ))), + failure_reason: confirmation + .feedback + .reject_reason + .map(domain_reject_reason_to_text) + .map(str::to_string), + error_message: None, + }) +} + +fn stop_square_hole_run_tx( + ctx: &ReducerContext, + input: SquareHoleRunStopInput, +) -> Result { + let row = find_owned_run(ctx, &input.run_id, &input.owner_user_id)?; + let snapshot = deserialize_snapshot(&row.snapshot_json)?; + let domain_run = domain_snapshot_from_snapshot(&snapshot, &row.owner_user_id); + let stopped = stop_domain_run_at(&domain_run); + let next = snapshot_from_domain(&stopped, input.stopped_at_ms.max(0)); + replace_run( + ctx, + &row, + run_row_from_snapshot(&next, row.created_at, ctx.timestamp), + ); + Ok(next) +} + +fn restart_square_hole_run_tx( + ctx: &ReducerContext, + input: SquareHoleRunRestartInput, +) -> Result { + let source = find_owned_run(ctx, &input.source_run_id, &input.owner_user_id)?; + start_square_hole_run_tx( + ctx, + SquareHoleRunStartInput { + run_id: input.next_run_id, + owner_user_id: input.owner_user_id, + profile_id: source.profile_id, + started_at_ms: input.restarted_at_ms, + }, + ) +} + +fn finish_square_hole_time_up_tx( + ctx: &ReducerContext, + input: SquareHoleRunTimeUpInput, +) -> Result { + let row = find_owned_run(ctx, &input.run_id, &input.owner_user_id)?; + let snapshot = deserialize_snapshot(&row.snapshot_json)?; + let domain_run = domain_snapshot_from_snapshot(&snapshot, &row.owner_user_id); + let expired = resolve_domain_run_timer_at(&domain_run, input.finished_at_ms.max(0) as u64); + let next = snapshot_from_domain(&expired, input.finished_at_ms.max(0)); + replace_run( + ctx, + &row, + run_row_from_snapshot(&next, row.created_at, ctx.timestamp), + ); + Ok(next) +} + +fn build_session_snapshot( + ctx: &ReducerContext, + row: &SquareHoleAgentSessionRow, +) -> Result { + let config = parse_config(&row.config_json)?; + let draft = if row.draft_json.trim().is_empty() { + None + } else { + Some(parse_json(&row.draft_json, "square_hole draft_json")?) + }; + let mut messages = ctx + .db + .square_hole_agent_message() + .by_square_hole_agent_message_session_id() + .filter(&row.session_id) + .map(|message| SquareHoleAgentMessageSnapshot { + message_id: message.message_id, + session_id: message.session_id, + role: message.role, + kind: message.kind, + text: message.text, + created_at_micros: message.created_at.to_micros_since_unix_epoch(), + }) + .collect::>(); + messages.sort_by(|left, right| left.created_at_micros.cmp(&right.created_at_micros)); + + Ok(SquareHoleAgentSessionSnapshot { + session_id: row.session_id.clone(), + owner_user_id: row.owner_user_id.clone(), + seed_text: row.seed_text.clone(), + current_turn: row.current_turn, + progress_percent: row.progress_percent, + stage: row.stage.clone(), + config, + draft, + messages, + last_assistant_reply: row.last_assistant_reply.clone(), + published_profile_id: empty_to_none(&row.published_profile_id), + created_at_micros: row.created_at.to_micros_since_unix_epoch(), + updated_at_micros: row.updated_at.to_micros_since_unix_epoch(), + }) +} + +fn build_work_snapshot(row: &SquareHoleWorkProfileRow) -> Result { + let config = parse_config(&row.config_json)?; + Ok(SquareHoleWorkSnapshot { + work_id: row.work_id.clone(), + profile_id: row.profile_id.clone(), + owner_user_id: row.owner_user_id.clone(), + source_session_id: row.source_session_id.clone(), + author_display_name: row.author_display_name.clone(), + game_name: row.game_name.clone(), + theme_text: row.theme_text.clone(), + twist_rule: row.twist_rule.clone(), + summary_text: row.summary_text.clone(), + tags: parse_tags(&row.tags_json)?, + cover_image_src: row.cover_image_src.clone(), + shape_count: row.shape_count, + difficulty: row.difficulty, + config, + publication_status: row.publication_status.clone(), + publish_ready: is_work_publish_ready(row), + play_count: row.play_count, + updated_at_micros: row.updated_at.to_micros_since_unix_epoch(), + published_at_micros: row + .published_at + .map(|value| value.to_micros_since_unix_epoch()), + }) +} + +fn refresh_run_row( + ctx: &ReducerContext, + row: SquareHoleRuntimeRunRow, + server_now_ms: i64, +) -> Result { + let snapshot = deserialize_snapshot(&row.snapshot_json)?; + let domain_run = domain_snapshot_from_snapshot(&snapshot, &row.owner_user_id); + let refreshed = resolve_domain_run_timer_at(&domain_run, server_now_ms.max(0) as u64); + let next = snapshot_from_domain(&refreshed, server_now_ms); + if next.snapshot_version != snapshot.snapshot_version || next.status != snapshot.status { + replace_run( + ctx, + &row, + run_row_from_snapshot(&next, row.created_at, ctx.timestamp), + ); + } + Ok(next) +} + +fn find_owned_session( + ctx: &ReducerContext, + session_id: &str, + owner_user_id: &str, +) -> Result { + require_non_empty(session_id, "square_hole session_id")?; + require_non_empty(owner_user_id, "square_hole owner_user_id")?; + ctx.db + .square_hole_agent_session() + .session_id() + .find(&session_id.to_string()) + .filter(|row| row.owner_user_id == owner_user_id) + .ok_or_else(|| "方洞挑战会话不存在".to_string()) +} + +fn find_owned_work( + ctx: &ReducerContext, + profile_id: &str, + owner_user_id: &str, +) -> Result { + require_non_empty(profile_id, "square_hole profile_id")?; + require_non_empty(owner_user_id, "square_hole owner_user_id")?; + ctx.db + .square_hole_work_profile() + .profile_id() + .find(&profile_id.to_string()) + .filter(|row| row.owner_user_id == owner_user_id) + .ok_or_else(|| "方洞挑战作品不存在".to_string()) +} + +fn find_playable_work( + ctx: &ReducerContext, + profile_id: &str, + owner_user_id: &str, +) -> Result { + let row = ctx + .db + .square_hole_work_profile() + .profile_id() + .find(&profile_id.to_string()) + .ok_or_else(|| "方洞挑战作品不存在".to_string())?; + if row.owner_user_id != owner_user_id + && row.publication_status != SQUARE_HOLE_PUBLICATION_PUBLISHED + { + return Err("无权试玩该方洞挑战作品".to_string()); + } + Ok(row) +} + +fn find_owned_run( + ctx: &ReducerContext, + run_id: &str, + owner_user_id: &str, +) -> Result { + require_non_empty(run_id, "square_hole run_id")?; + require_non_empty(owner_user_id, "square_hole owner_user_id")?; + ctx.db + .square_hole_runtime_run() + .run_id() + .find(&run_id.to_string()) + .filter(|row| row.owner_user_id == owner_user_id) + .ok_or_else(|| "方洞挑战运行态不存在".to_string()) +} + +fn upsert_work(ctx: &ReducerContext, work: SquareHoleWorkProfileRow) { + if ctx + .db + .square_hole_work_profile() + .profile_id() + .find(&work.profile_id) + .is_some() + { + ctx.db + .square_hole_work_profile() + .profile_id() + .delete(&work.profile_id); + } + ctx.db.square_hole_work_profile().insert(work); +} + +fn replace_session( + ctx: &ReducerContext, + current: &SquareHoleAgentSessionRow, + next: SquareHoleAgentSessionRow, +) { + ctx.db + .square_hole_agent_session() + .session_id() + .delete(¤t.session_id); + ctx.db.square_hole_agent_session().insert(next); +} + +fn replace_work( + ctx: &ReducerContext, + current: &SquareHoleWorkProfileRow, + next: SquareHoleWorkProfileRow, +) { + ctx.db + .square_hole_work_profile() + .profile_id() + .delete(¤t.profile_id); + ctx.db.square_hole_work_profile().insert(next); +} + +fn replace_run( + ctx: &ReducerContext, + current: &SquareHoleRuntimeRunRow, + next: SquareHoleRuntimeRunRow, +) { + ctx.db + .square_hole_runtime_run() + .run_id() + .delete(¤t.run_id); + ctx.db.square_hole_runtime_run().insert(next); +} + +fn clone_session(row: &SquareHoleAgentSessionRow) -> SquareHoleAgentSessionRow { + SquareHoleAgentSessionRow { + session_id: row.session_id.clone(), + owner_user_id: row.owner_user_id.clone(), + seed_text: row.seed_text.clone(), + current_turn: row.current_turn, + progress_percent: row.progress_percent, + stage: row.stage.clone(), + config_json: row.config_json.clone(), + draft_json: row.draft_json.clone(), + last_assistant_reply: row.last_assistant_reply.clone(), + published_profile_id: row.published_profile_id.clone(), + created_at: row.created_at, + updated_at: row.updated_at, + } +} + +fn clone_work(row: &SquareHoleWorkProfileRow) -> SquareHoleWorkProfileRow { + SquareHoleWorkProfileRow { + profile_id: row.profile_id.clone(), + work_id: row.work_id.clone(), + owner_user_id: row.owner_user_id.clone(), + source_session_id: row.source_session_id.clone(), + author_display_name: row.author_display_name.clone(), + game_name: row.game_name.clone(), + theme_text: row.theme_text.clone(), + twist_rule: row.twist_rule.clone(), + summary_text: row.summary_text.clone(), + tags_json: row.tags_json.clone(), + cover_image_src: row.cover_image_src.clone(), + shape_count: row.shape_count, + difficulty: row.difficulty, + config_json: row.config_json.clone(), + publication_status: row.publication_status.clone(), + play_count: row.play_count, + updated_at: row.updated_at, + published_at: row.published_at, + } +} + +fn validate_config(config: &SquareHoleCreatorConfigSnapshot) -> Result<(), String> { + domain_config_from_snapshot(config) + .map(|_| ()) + .map_err(|error| error.to_string()) +} + +fn validate_publishable_work(row: &SquareHoleWorkProfileRow) -> Result<(), String> { + if row.game_name.trim().is_empty() { + return Err("方洞挑战发布需要填写游戏名称".to_string()); + } + if row.summary_text.trim().is_empty() { + return Err("方洞挑战发布需要简介".to_string()); + } + if parse_tags(&row.tags_json)?.is_empty() { + return Err("方洞挑战发布需要至少 1 个标签".to_string()); + } + validate_config(&parse_config(&row.config_json)?) +} + +fn is_work_publish_ready(row: &SquareHoleWorkProfileRow) -> bool { + validate_publishable_work(row).is_ok() +} + +fn default_config_from_seed(seed_text: &str) -> SquareHoleCreatorConfigSnapshot { + SquareHoleCreatorConfigSnapshot { + theme_text: clean_string(seed_text, "玩具"), + twist_rule: "方洞万能".to_string(), + shape_count: 12, + difficulty: 4, + } +} + +fn parse_config_or_default(value: &str) -> SquareHoleCreatorConfigSnapshot { + parse_config(value).unwrap_or_else(|_| default_config_from_seed("玩具")) +} + +fn parse_config(value: &str) -> Result { + parse_json(value, "square_hole config_json").map( + |mut config: SquareHoleCreatorConfigSnapshot| { + config.theme_text = clean_string(&config.theme_text, "玩具"); + config.twist_rule = clean_string(&config.twist_rule, "方洞万能"); + config.difficulty = config.difficulty.clamp( + module_square_hole::SQUARE_HOLE_MIN_DIFFICULTY, + module_square_hole::SQUARE_HOLE_MAX_DIFFICULTY, + ); + config + }, + ) +} + +fn parse_tags(value: &str) -> Result, String> { + let parsed = parse_json::>(value, "square_hole tags_json")?; + Ok(normalize_tags(parsed)) +} + +fn normalize_tags(tags: Vec) -> Vec { + let mut result = Vec::new(); + for tag in tags { + let trimmed = tag.trim(); + if !trimmed.is_empty() && !result.iter().any(|item: &String| item == trimmed) { + result.push(trimmed.to_string()); + } + if result.len() >= 6 { + break; + } + } + result +} + +fn normalize_stage(value: &str) -> String { + match value.trim() { + SQUARE_HOLE_STAGE_READY_TO_COMPILE => SQUARE_HOLE_STAGE_READY_TO_COMPILE.to_string(), + SQUARE_HOLE_STAGE_DRAFT_COMPILED => SQUARE_HOLE_STAGE_DRAFT_COMPILED.to_string(), + SQUARE_HOLE_STAGE_PUBLISHED => SQUARE_HOLE_STAGE_PUBLISHED.to_string(), + _ => SQUARE_HOLE_STAGE_COLLECTING.to_string(), + } +} + +fn domain_config_from_snapshot( + config: &SquareHoleCreatorConfigSnapshot, +) -> Result { + build_domain_creator_config( + &config.theme_text, + &config.twist_rule, + config.shape_count, + config.difficulty, + ) +} + +fn snapshot_from_domain( + run: &DomainSquareHoleRunSnapshot, + server_now_ms: i64, +) -> SquareHoleRunSnapshot { + SquareHoleRunSnapshot { + run_id: run.run_id.clone(), + profile_id: run.profile_id.clone(), + owner_user_id: run.owner_user_id.clone(), + status: domain_status_to_text(run.status).to_string(), + snapshot_version: run.snapshot_version, + started_at_ms: run.started_at_ms.min(i64::MAX as u64) as i64, + duration_limit_ms: run.duration_limit_ms.min(i64::MAX as u64) as i64, + server_now_ms, + remaining_ms: run.remaining_ms.min(i64::MAX as u64) as i64, + total_shape_count: run.total_shape_count, + completed_shape_count: run.completed_shape_count, + combo: run.combo, + best_combo: run.best_combo, + score: run.score, + rule_label: run.rule_label.clone(), + current_shape: run.current_shape.as_ref().map(shape_from_domain), + holes: run.holes.iter().map(hole_from_domain).collect(), + last_feedback: run.last_feedback.as_ref().map(feedback_from_domain), + } +} + +fn domain_snapshot_from_snapshot( + snapshot: &SquareHoleRunSnapshot, + owner_user_id: &str, +) -> DomainSquareHoleRunSnapshot { + DomainSquareHoleRunSnapshot { + run_id: snapshot.run_id.clone(), + profile_id: snapshot.profile_id.clone(), + owner_user_id: owner_user_id.to_string(), + status: domain_status_from_text(&snapshot.status), + snapshot_version: snapshot.snapshot_version, + started_at_ms: to_u64_ms(snapshot.started_at_ms), + duration_limit_ms: to_u64_ms(snapshot.duration_limit_ms), + remaining_ms: to_u64_ms(snapshot.remaining_ms), + total_shape_count: snapshot.total_shape_count, + completed_shape_count: snapshot.completed_shape_count, + combo: snapshot.combo, + best_combo: snapshot.best_combo, + score: snapshot.score, + rule_label: snapshot.rule_label.clone(), + current_shape: snapshot + .current_shape + .as_ref() + .map(domain_shape_from_snapshot), + holes: snapshot + .holes + .iter() + .map(domain_hole_from_snapshot) + .collect(), + last_feedback: snapshot + .last_feedback + .as_ref() + .map(domain_feedback_from_snapshot), + } +} + +fn shape_from_domain(shape: &DomainSquareHoleShapeSnapshot) -> SquareHoleShapeSnapshot { + SquareHoleShapeSnapshot { + shape_id: shape.shape_id.clone(), + shape_kind: shape.shape_kind.clone(), + label: shape.label.clone(), + color: shape.color.clone(), + } +} + +fn domain_shape_from_snapshot(shape: &SquareHoleShapeSnapshot) -> DomainSquareHoleShapeSnapshot { + DomainSquareHoleShapeSnapshot { + shape_id: shape.shape_id.clone(), + shape_kind: shape.shape_kind.clone(), + label: shape.label.clone(), + color: shape.color.clone(), + } +} + +fn hole_from_domain(hole: &DomainSquareHoleHoleSnapshot) -> SquareHoleHoleSnapshot { + SquareHoleHoleSnapshot { + hole_id: hole.hole_id.clone(), + hole_kind: hole.hole_kind.clone(), + label: hole.label.clone(), + x: hole.x, + y: hole.y, + } +} + +fn domain_hole_from_snapshot(hole: &SquareHoleHoleSnapshot) -> DomainSquareHoleHoleSnapshot { + DomainSquareHoleHoleSnapshot { + hole_id: hole.hole_id.clone(), + hole_kind: hole.hole_kind.clone(), + label: hole.label.clone(), + x: hole.x, + y: hole.y, + } +} + +fn feedback_from_domain(feedback: &DomainSquareHoleDropFeedback) -> SquareHoleDropFeedbackSnapshot { + SquareHoleDropFeedbackSnapshot { + accepted: feedback.accepted, + reject_reason: feedback + .reject_reason + .map(domain_reject_reason_to_text) + .map(str::to_string), + message: feedback.message.clone(), + } +} + +fn domain_feedback_from_snapshot( + feedback: &SquareHoleDropFeedbackSnapshot, +) -> DomainSquareHoleDropFeedback { + DomainSquareHoleDropFeedback { + accepted: feedback.accepted, + reject_reason: feedback + .reject_reason + .as_deref() + .map(domain_reject_reason_from_text), + message: feedback.message.clone(), + } +} + +fn run_row_from_snapshot( + snapshot: &SquareHoleRunSnapshot, + created_at: Timestamp, + updated_at: Timestamp, +) -> SquareHoleRuntimeRunRow { + let finished_at_ms = if snapshot.status == SQUARE_HOLE_RUN_RUNNING { + 0 + } else { + snapshot.server_now_ms + }; + SquareHoleRuntimeRunRow { + run_id: snapshot.run_id.clone(), + owner_user_id: snapshot.owner_user_id.clone(), + profile_id: snapshot.profile_id.clone(), + status: snapshot.status.clone(), + snapshot_version: snapshot.snapshot_version, + started_at_ms: snapshot.started_at_ms, + duration_limit_ms: snapshot.duration_limit_ms, + finished_at_ms, + elapsed_ms: snapshot + .server_now_ms + .saturating_sub(snapshot.started_at_ms) + .max(0), + total_shape_count: snapshot.total_shape_count, + completed_shape_count: snapshot.completed_shape_count, + score: snapshot.score, + snapshot_json: to_json_string(snapshot), + created_at, + updated_at, + } +} + +fn domain_status_to_text(status: DomainSquareHoleRunStatus) -> &'static str { + match status { + DomainSquareHoleRunStatus::Running => SQUARE_HOLE_RUN_RUNNING, + DomainSquareHoleRunStatus::Won => SQUARE_HOLE_RUN_WON, + DomainSquareHoleRunStatus::Failed => SQUARE_HOLE_RUN_FAILED, + DomainSquareHoleRunStatus::Stopped => SQUARE_HOLE_RUN_STOPPED, + } +} + +fn domain_status_from_text(value: &str) -> DomainSquareHoleRunStatus { + match value { + SQUARE_HOLE_RUN_WON | "won" => DomainSquareHoleRunStatus::Won, + SQUARE_HOLE_RUN_FAILED | "failed" => DomainSquareHoleRunStatus::Failed, + SQUARE_HOLE_RUN_STOPPED | "stopped" => DomainSquareHoleRunStatus::Stopped, + _ => DomainSquareHoleRunStatus::Running, + } +} + +fn domain_reject_reason_to_text(reason: DomainSquareHoleDropRejectReason) -> &'static str { + reason.as_str() +} + +fn domain_reject_reason_from_text(value: &str) -> DomainSquareHoleDropRejectReason { + match value { + "snapshot_version_mismatch" => DomainSquareHoleDropRejectReason::SnapshotVersionMismatch, + "hole_not_found" => DomainSquareHoleDropRejectReason::HoleNotFound, + "incompatible" => DomainSquareHoleDropRejectReason::Incompatible, + "time_up" => DomainSquareHoleDropRejectReason::TimeUp, + _ => DomainSquareHoleDropRejectReason::RunNotActive, + } +} + +fn to_u64_ms(value: i64) -> u64 { + value.max(0) as u64 +} + +fn current_server_ms(ctx: &ReducerContext) -> i64 { + ctx.timestamp + .to_micros_since_unix_epoch() + .saturating_div(1000) +} + +fn clean_optional(value: &Option) -> Option { + value + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) +} + +fn clean_string(value: &str, fallback: &str) -> String { + let trimmed = value.trim(); + if trimmed.is_empty() { + fallback.to_string() + } else { + trimmed.to_string() + } +} + +fn empty_to_none(value: &str) -> Option { + let trimmed = value.trim(); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_string()) + } +} + +fn require_non_empty(value: &str, label: &str) -> Result<(), String> { + if value.trim().is_empty() { + Err(format!("{label} 不能为空")) + } else { + Ok(()) + } +} + +fn parse_json(value: &str, label: &str) -> Result { + serde_json::from_str(value).map_err(|error| format!("{label} 非法: {error}")) +} + +fn deserialize_snapshot(value: &str) -> Result { + parse_json(value, "square_hole snapshot_json") +} + +fn to_json_string(value: &T) -> String { + serde_json::to_string(value).unwrap_or_else(|_| "{}".to_string()) +} + +fn session_result( + session: SquareHoleAgentSessionSnapshot, +) -> SquareHoleAgentSessionProcedureResult { + SquareHoleAgentSessionProcedureResult { + ok: true, + session_json: Some(to_json_string(&session)), + error_message: None, + } +} + +fn session_error(message: String) -> SquareHoleAgentSessionProcedureResult { + SquareHoleAgentSessionProcedureResult { + ok: false, + session_json: None, + error_message: Some(message), + } +} + +fn work_result(work: SquareHoleWorkSnapshot) -> SquareHoleWorkProcedureResult { + SquareHoleWorkProcedureResult { + ok: true, + work_json: Some(to_json_string(&work)), + error_message: None, + } +} + +fn work_error(message: String) -> SquareHoleWorkProcedureResult { + SquareHoleWorkProcedureResult { + ok: false, + work_json: None, + error_message: Some(message), + } +} + +fn run_result(run: SquareHoleRunSnapshot) -> SquareHoleRunProcedureResult { + SquareHoleRunProcedureResult { + ok: true, + run_json: Some(to_json_string(&run)), + error_message: None, + } +} + +fn run_error(message: String) -> SquareHoleRunProcedureResult { + SquareHoleRunProcedureResult { + ok: false, + run_json: None, + error_message: Some(message), + } +} diff --git a/server-rs/crates/spacetime-module/src/square_hole/tables.rs b/server-rs/crates/spacetime-module/src/square_hole/tables.rs new file mode 100644 index 00000000..59600a8d --- /dev/null +++ b/server-rs/crates/spacetime-module/src/square_hole/tables.rs @@ -0,0 +1,86 @@ +use crate::*; + +#[spacetimedb::table( + accessor = square_hole_agent_session, + index(accessor = by_square_hole_agent_session_owner_user_id, btree(columns = [owner_user_id])) +)] +pub struct SquareHoleAgentSessionRow { + #[primary_key] + pub(crate) session_id: String, + pub(crate) owner_user_id: String, + pub(crate) seed_text: String, + pub(crate) current_turn: u32, + pub(crate) progress_percent: u32, + pub(crate) stage: String, + pub(crate) config_json: String, + pub(crate) draft_json: String, + pub(crate) last_assistant_reply: String, + pub(crate) published_profile_id: String, + pub(crate) created_at: Timestamp, + pub(crate) updated_at: Timestamp, +} + +#[spacetimedb::table( + accessor = square_hole_agent_message, + index(accessor = by_square_hole_agent_message_session_id, btree(columns = [session_id])) +)] +pub struct SquareHoleAgentMessageRow { + #[primary_key] + pub(crate) message_id: String, + pub(crate) session_id: String, + pub(crate) role: String, + pub(crate) kind: String, + pub(crate) text: String, + pub(crate) created_at: Timestamp, +} + +#[spacetimedb::table( + accessor = square_hole_work_profile, + index(accessor = by_square_hole_work_owner_user_id, btree(columns = [owner_user_id])), + index(accessor = by_square_hole_work_publication_status, btree(columns = [publication_status])) +)] +pub struct SquareHoleWorkProfileRow { + #[primary_key] + pub(crate) profile_id: String, + pub(crate) work_id: String, + pub(crate) owner_user_id: String, + pub(crate) source_session_id: String, + pub(crate) author_display_name: String, + pub(crate) game_name: String, + pub(crate) theme_text: String, + pub(crate) twist_rule: String, + pub(crate) summary_text: String, + pub(crate) tags_json: String, + pub(crate) cover_image_src: String, + pub(crate) shape_count: u32, + pub(crate) difficulty: u32, + pub(crate) config_json: String, + pub(crate) publication_status: String, + pub(crate) play_count: u32, + pub(crate) updated_at: Timestamp, + pub(crate) published_at: Option, +} + +#[spacetimedb::table( + accessor = square_hole_runtime_run, + index(accessor = by_square_hole_run_owner_user_id, btree(columns = [owner_user_id])), + index(accessor = by_square_hole_run_profile_id, btree(columns = [profile_id])) +)] +pub struct SquareHoleRuntimeRunRow { + #[primary_key] + pub(crate) run_id: String, + pub(crate) owner_user_id: String, + pub(crate) profile_id: String, + pub(crate) status: String, + pub(crate) snapshot_version: u64, + pub(crate) started_at_ms: i64, + pub(crate) duration_limit_ms: i64, + pub(crate) finished_at_ms: i64, + pub(crate) elapsed_ms: i64, + pub(crate) total_shape_count: u32, + pub(crate) completed_shape_count: u32, + pub(crate) score: u32, + pub(crate) snapshot_json: String, + pub(crate) created_at: Timestamp, + pub(crate) updated_at: Timestamp, +} diff --git a/server-rs/crates/spacetime-module/src/square_hole/types.rs b/server-rs/crates/spacetime-module/src/square_hole/types.rs new file mode 100644 index 00000000..b2c04e37 --- /dev/null +++ b/server-rs/crates/spacetime-module/src/square_hole/types.rs @@ -0,0 +1,325 @@ +use crate::*; +use serde::{Deserialize, Serialize}; + +pub const SQUARE_HOLE_STAGE_COLLECTING: &str = "Collecting"; +pub const SQUARE_HOLE_STAGE_READY_TO_COMPILE: &str = "ReadyToCompile"; +pub const SQUARE_HOLE_STAGE_DRAFT_COMPILED: &str = "DraftCompiled"; +pub const SQUARE_HOLE_STAGE_PUBLISHED: &str = "Published"; + +pub const SQUARE_HOLE_ROLE_USER: &str = "user"; +pub const SQUARE_HOLE_ROLE_ASSISTANT: &str = "assistant"; +pub const SQUARE_HOLE_KIND_TEXT: &str = "text"; + +pub const SQUARE_HOLE_PUBLICATION_DRAFT: &str = "Draft"; +pub const SQUARE_HOLE_PUBLICATION_PUBLISHED: &str = "Published"; + +pub const SQUARE_HOLE_RUN_RUNNING: &str = "Running"; +pub const SQUARE_HOLE_RUN_WON: &str = "Won"; +pub const SQUARE_HOLE_RUN_FAILED: &str = "Failed"; +pub const SQUARE_HOLE_RUN_STOPPED: &str = "Stopped"; + +pub const SQUARE_HOLE_DROP_ACCEPTED: &str = "Accepted"; +pub const SQUARE_HOLE_DROP_REJECTED: &str = "Rejected"; +pub const SQUARE_HOLE_DROP_VERSION_CONFLICT: &str = "VersionConflict"; +pub const SQUARE_HOLE_DROP_RUN_FINISHED: &str = "RunFinished"; + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleAgentSessionCreateInput { + pub session_id: String, + pub owner_user_id: String, + pub seed_text: String, + pub welcome_message_id: String, + pub welcome_message_text: String, + pub config_json: Option, + pub created_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleAgentSessionGetInput { + pub session_id: String, + pub owner_user_id: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleAgentMessageSubmitInput { + pub session_id: String, + pub owner_user_id: String, + pub user_message_id: String, + pub user_message_text: String, + pub submitted_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleAgentMessageFinalizeInput { + pub session_id: String, + pub owner_user_id: String, + pub assistant_message_id: Option, + pub assistant_reply_text: Option, + pub config_json: Option, + pub progress_percent: u32, + pub stage: String, + pub updated_at_micros: i64, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleDraftCompileInput { + pub session_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub author_display_name: String, + pub game_name: Option, + pub summary_text: Option, + pub tags_json: Option, + pub cover_image_src: Option, + pub compiled_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorkUpdateInput { + pub profile_id: String, + pub owner_user_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary_text: String, + pub tags_json: String, + pub cover_image_src: String, + pub shape_count: u32, + pub difficulty: u32, + pub updated_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorkPublishInput { + pub profile_id: String, + pub owner_user_id: String, + pub published_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorksListInput { + pub owner_user_id: String, + pub published_only: bool, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorkGetInput { + pub profile_id: String, + pub owner_user_id: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorkDeleteInput { + pub profile_id: String, + pub owner_user_id: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunStartInput { + pub run_id: String, + pub owner_user_id: String, + pub profile_id: String, + pub started_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunGetInput { + pub run_id: String, + pub owner_user_id: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunDropInput { + pub run_id: String, + pub owner_user_id: String, + pub hole_id: String, + pub client_snapshot_version: u64, + pub client_event_id: String, + pub dropped_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunStopInput { + pub run_id: String, + pub owner_user_id: String, + pub stopped_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunRestartInput { + pub source_run_id: String, + pub next_run_id: String, + pub owner_user_id: String, + pub restarted_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunTimeUpInput { + pub run_id: String, + pub owner_user_id: String, + pub finished_at_ms: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleAgentSessionProcedureResult { + pub ok: bool, + pub session_json: Option, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorkProcedureResult { + pub ok: bool, + pub work_json: Option, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleWorksProcedureResult { + pub ok: bool, + pub items_json: Option, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleRunProcedureResult { + pub ok: bool, + pub run_json: Option, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, SpacetimeType)] +pub struct SquareHoleDropShapeProcedureResult { + pub ok: bool, + pub status: String, + pub run_json: Option, + pub feedback_json: Option, + pub failure_reason: Option, + pub error_message: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleCreatorConfigSnapshot { + pub theme_text: String, + pub twist_rule: String, + pub shape_count: u32, + pub difficulty: u32, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleAgentMessageSnapshot { + pub message_id: String, + pub session_id: String, + pub role: String, + pub kind: String, + pub text: String, + pub created_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleDraftSnapshot { + pub profile_id: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary_text: String, + pub tags: Vec, + pub shape_count: u32, + pub difficulty: u32, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleAgentSessionSnapshot { + pub session_id: String, + pub owner_user_id: String, + pub seed_text: String, + pub current_turn: u32, + pub progress_percent: u32, + pub stage: String, + pub config: SquareHoleCreatorConfigSnapshot, + pub draft: Option, + pub messages: Vec, + pub last_assistant_reply: String, + pub published_profile_id: Option, + pub created_at_micros: i64, + pub updated_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleWorkSnapshot { + pub work_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub source_session_id: String, + pub author_display_name: String, + pub game_name: String, + pub theme_text: String, + pub twist_rule: String, + pub summary_text: String, + pub tags: Vec, + pub cover_image_src: String, + pub shape_count: u32, + pub difficulty: u32, + pub config: SquareHoleCreatorConfigSnapshot, + pub publication_status: String, + pub publish_ready: bool, + pub play_count: u32, + pub updated_at_micros: i64, + pub published_at_micros: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleShapeSnapshot { + pub shape_id: String, + pub shape_kind: String, + pub label: String, + pub color: String, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleHoleSnapshot { + pub hole_id: String, + pub hole_kind: String, + pub label: String, + pub x: f32, + pub y: f32, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleDropFeedbackSnapshot { + pub accepted: bool, + pub reject_reason: Option, + pub message: String, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SquareHoleRunSnapshot { + pub run_id: String, + pub profile_id: String, + pub owner_user_id: String, + pub status: String, + pub snapshot_version: u64, + pub started_at_ms: i64, + pub duration_limit_ms: i64, + pub server_now_ms: i64, + pub remaining_ms: i64, + pub total_shape_count: u32, + pub completed_shape_count: u32, + pub combo: u32, + pub best_combo: u32, + pub score: u32, + pub rule_label: String, + pub current_shape: Option, + pub holes: Vec, + pub last_feedback: Option, +} diff --git a/src/components/custom-world-home/CustomWorldCreationHub.interaction.test.tsx b/src/components/custom-world-home/CustomWorldCreationHub.interaction.test.tsx index 54b7e11d..d7d720ac 100644 --- a/src/components/custom-world-home/CustomWorldCreationHub.interaction.test.tsx +++ b/src/components/custom-world-home/CustomWorldCreationHub.interaction.test.tsx @@ -107,12 +107,17 @@ test('creation hub reflects updated draft title summary and counts after rerende const rpgButton = screen.getByRole('button', { name: /角色扮演/u }); const puzzleButton = screen.getByRole('button', { name: /拼图.*创意礼物/u }); const match3dButton = screen.getByRole('button', { name: /抓大鹅/u }); + const squareHoleButton = screen.getByRole('button', { name: /方洞挑战/u }); expect( rpgButton.compareDocumentPosition(puzzleButton) & Node.DOCUMENT_POSITION_FOLLOWING, ).toBeTruthy(); expect((rpgButton as HTMLButtonElement).disabled).toBe(false); expect((match3dButton as HTMLButtonElement).disabled).toBe(false); + expect((squareHoleButton as HTMLButtonElement).disabled).toBe(false); + expect( + within(squareHoleButton).getAllByText('反直觉形状分拣').length, + ).toBeGreaterThan(0); expect( within(match3dButton).getAllByText('经典消除玩法').length, ).toBeGreaterThan(0); diff --git a/src/components/custom-world-home/CustomWorldCreationHub.tsx b/src/components/custom-world-home/CustomWorldCreationHub.tsx index 87fbc943..f340953e 100644 --- a/src/components/custom-world-home/CustomWorldCreationHub.tsx +++ b/src/components/custom-world-home/CustomWorldCreationHub.tsx @@ -4,6 +4,7 @@ import type { BigFishWorkSummary } from '../../../packages/shared/src/contracts/ import type { CustomWorldWorkSummary } from '../../../packages/shared/src/contracts/customWorldAgent'; import type { Match3DWorkSummary } from '../../../packages/shared/src/contracts/match3dWorks'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; +import type { SquareHoleWorkSummary } from '../../../packages/shared/src/contracts/squareHoleWorks'; import type { CustomWorldLibraryEntry } from '../../../packages/shared/src/contracts/runtime'; import type { CustomWorldProfile } from '../../types'; import type { PlatformCreationTypeId } from '../platform-entry/platformEntryCreationTypes'; @@ -48,6 +49,9 @@ type CustomWorldCreationHubProps = { match3dItems?: Match3DWorkSummary[]; onOpenMatch3DDetail?: (item: Match3DWorkSummary) => void; onDeleteMatch3D?: ((item: Match3DWorkSummary) => void) | null; + squareHoleItems?: SquareHoleWorkSummary[]; + onOpenSquareHoleDetail?: (item: SquareHoleWorkSummary) => void; + onDeleteSquareHole?: ((item: SquareHoleWorkSummary) => void) | null; puzzleItems?: PuzzleWorkSummary[]; onOpenPuzzleDetail?: (item: PuzzleWorkSummary) => void; onDeletePuzzle?: ((item: PuzzleWorkSummary) => void) | null; @@ -137,6 +141,9 @@ export function CustomWorldCreationHub({ match3dItems = [], onOpenMatch3DDetail, onDeleteMatch3D = null, + squareHoleItems = [], + onOpenSquareHoleDetail, + onDeleteSquareHole = null, puzzleItems = [], onOpenPuzzleDetail, onDeletePuzzle = null, @@ -152,10 +159,12 @@ export function CustomWorldCreationHub({ rpgLibraryEntries, bigFishItems, match3dItems, + squareHoleItems, puzzleItems, canDeleteRpg: Boolean(onDeletePublished), canDeleteBigFish: Boolean(onDeleteBigFish), canDeleteMatch3D: Boolean(onDeleteMatch3D), + canDeleteSquareHole: Boolean(onDeleteSquareHole), canDeletePuzzle: Boolean(onDeletePuzzle), }), [ @@ -164,10 +173,12 @@ export function CustomWorldCreationHub({ match3dItems, onDeleteBigFish, onDeleteMatch3D, + onDeleteSquareHole, onDeletePublished, onDeletePuzzle, puzzleItems, rpgLibraryEntries, + squareHoleItems, ], ); const [metricSnapshot] = useState(() => @@ -201,6 +212,9 @@ export function CustomWorldCreationHub({ case 'match3d': onOpenMatch3DDetail?.(item.source.item); return; + case 'square-hole': + onOpenSquareHoleDetail?.(item.source.item); + return; case 'rpg': if (item.status === 'draft') { onOpenDraft(item.source.item); @@ -237,6 +251,12 @@ export function CustomWorldCreationHub({ onDeleteMatch3D?.(sourceItem); }; } + case 'square-hole': { + const sourceItem = item.source.item; + return () => { + onDeleteSquareHole?.(sourceItem); + }; + } case 'rpg': { const sourceItem = item.source.item; return () => { diff --git a/src/components/custom-world-home/CustomWorldCreationStartCard.tsx b/src/components/custom-world-home/CustomWorldCreationStartCard.tsx index ee5c3df7..08d17866 100644 --- a/src/components/custom-world-home/CustomWorldCreationStartCard.tsx +++ b/src/components/custom-world-home/CustomWorldCreationStartCard.tsx @@ -40,7 +40,7 @@ export function CustomWorldCreationStartCard({ -
+
{visibleCreationTypes.map((item) => { const disabled = item.locked || busy; diff --git a/src/components/custom-world-home/creationWorkShelf.ts b/src/components/custom-world-home/creationWorkShelf.ts index 07f4f4eb..be9fdadf 100644 --- a/src/components/custom-world-home/creationWorkShelf.ts +++ b/src/components/custom-world-home/creationWorkShelf.ts @@ -2,16 +2,23 @@ import type { BigFishWorkSummary } from '../../../packages/shared/src/contracts/ import type { CustomWorldWorkSummary } from '../../../packages/shared/src/contracts/customWorldAgent'; import type { Match3DWorkSummary } from '../../../packages/shared/src/contracts/match3dWorks'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; +import type { SquareHoleWorkSummary } from '../../../packages/shared/src/contracts/squareHoleWorks'; import type { CustomWorldLibraryEntry } from '../../../packages/shared/src/contracts/runtime'; import { buildPublicWorkStagePath } from '../../routing/appPageRoutes'; import { buildBigFishPublicWorkCode, buildMatch3DPublicWorkCode, buildPuzzlePublicWorkCode, + buildSquareHolePublicWorkCode, } from '../../services/publicWorkCode'; import type { CustomWorldProfile } from '../../types'; -export type CreationWorkShelfKind = 'rpg' | 'big-fish' | 'match3d' | 'puzzle'; +export type CreationWorkShelfKind = + | 'rpg' + | 'big-fish' + | 'match3d' + | 'square-hole' + | 'puzzle'; export type CreationWorkShelfStatus = 'draft' | 'published'; export type CreationWorkShelfBadgeTone = 'warm' | 'success' | 'neutral'; @@ -56,6 +63,10 @@ export type CreationWorkShelfSource = kind: 'match3d'; item: Match3DWorkSummary; } + | { + kind: 'square-hole'; + item: SquareHoleWorkSummary; + } | { kind: 'puzzle'; item: PuzzleWorkSummary; @@ -87,10 +98,12 @@ export function buildCreationWorkShelfItems(params: { rpgLibraryEntries?: CustomWorldLibraryEntry[]; bigFishItems: BigFishWorkSummary[]; match3dItems?: Match3DWorkSummary[]; + squareHoleItems?: SquareHoleWorkSummary[]; puzzleItems: PuzzleWorkSummary[]; canDeleteRpg?: boolean; canDeleteBigFish?: boolean; canDeleteMatch3D?: boolean; + canDeleteSquareHole?: boolean; canDeletePuzzle?: boolean; }) { const { @@ -98,10 +111,12 @@ export function buildCreationWorkShelfItems(params: { rpgLibraryEntries = [], bigFishItems, match3dItems = [], + squareHoleItems = [], puzzleItems, canDeleteRpg = false, canDeleteBigFish = false, canDeleteMatch3D = false, + canDeleteSquareHole = false, canDeletePuzzle = false, } = params; @@ -115,6 +130,9 @@ export function buildCreationWorkShelfItems(params: { ...match3dItems.map((item) => mapMatch3DWorkToShelfItem(item, canDeleteMatch3D), ), + ...squareHoleItems.map((item) => + mapSquareHoleWorkToShelfItem(item, canDeleteSquareHole), + ), ...puzzleItems.map((item) => mapPuzzleWorkToShelfItem(item, canDeletePuzzle), ), @@ -319,6 +337,50 @@ function mapPuzzleWorkToShelfItem( }; } +function mapSquareHoleWorkToShelfItem( + item: SquareHoleWorkSummary, + canDelete: boolean, +): CreationWorkShelfItem { + const status = item.publicationStatus === 'published' ? 'published' : 'draft'; + const publicWorkCode = + status === 'published' + ? buildSquareHolePublicWorkCode(item.profileId) + : null; + + return { + id: item.workId, + kind: 'square-hole', + status, + title: item.gameName, + summary: item.summary, + updatedAt: item.updatedAt, + coverImageSrc: item.coverImageSrc ?? null, + coverRenderMode: 'image', + coverCharacterImageSrcs: [], + publicWorkCode, + sharePath: + publicWorkCode && status === 'published' + ? buildPublicWorkStagePath('work-detail', publicWorkCode) + : null, + openActionLabel: status === 'published' ? '查看详情' : '继续创作', + canDelete, + canShare: status === 'published' && Boolean(publicWorkCode), + badges: [ + buildStatusBadge(status), + { id: 'type', label: '方洞', tone: 'neutral' }, + ], + metrics: + status === 'published' + ? buildPublishedMetrics({ + playCount: item.playCount, + remixCount: 0, + likeCount: 0, + }) + : [], + source: { kind: 'square-hole', item }, + }; +} + function buildPublishedMetrics(params: { playCount?: number | null; remixCount?: number | null; diff --git a/src/components/platform-entry/PlatformEntryCreationTypeModal.tsx b/src/components/platform-entry/PlatformEntryCreationTypeModal.tsx index a9bf5e86..a5843be4 100644 --- a/src/components/platform-entry/PlatformEntryCreationTypeModal.tsx +++ b/src/components/platform-entry/PlatformEntryCreationTypeModal.tsx @@ -12,6 +12,7 @@ export interface PlatformEntryCreationTypeModalProps { onSelectRpg: () => void; onSelectBigFish: () => void; onSelectMatch3D: () => void; + onSelectSquareHole: () => void; onSelectPuzzle: () => void; } @@ -74,6 +75,7 @@ export function PlatformEntryCreationTypeModal({ onSelectRpg, onSelectBigFish, onSelectMatch3D, + onSelectSquareHole, onSelectPuzzle, }: PlatformEntryCreationTypeModalProps) { if (!isOpen) { @@ -93,7 +95,7 @@ export function PlatformEntryCreationTypeModal({ closeDisabled={isBusy} size="lg" > -
+
{visibleCreationTypes.map((item) => ( { @@ -825,6 +939,29 @@ const Match3DRuntimeShell = lazy(async () => { }; }); +const SquareHoleAgentWorkspace = lazy(async () => { + const module = await import( + '../square-hole-creation/SquareHoleAgentWorkspace' + ); + return { + default: module.SquareHoleAgentWorkspace, + }; +}); + +const SquareHoleResultView = lazy(async () => { + const module = await import('../square-hole-result/SquareHoleResultView'); + return { + default: module.SquareHoleResultView, + }; +}); + +const SquareHoleRuntimeShell = lazy(async () => { + const module = await import('../square-hole-runtime/SquareHoleRuntimeShell'); + return { + default: module.SquareHoleRuntimeShell, + }; +}); + const CustomWorldCreationHub = lazy(async () => { const module = await import('../custom-world-home/CustomWorldCreationHub'); return { @@ -947,6 +1084,20 @@ export function PlatformEntryFlowShellImpl({ 'match3d-result' | 'work-detail' >('match3d-result'); const [isMatch3DLoadingLibrary, setIsMatch3DLoadingLibrary] = useState(false); + const [squareHoleWorks, setSquareHoleWorks] = useState< + SquareHoleWorkSummary[] + >([]); + const [squareHoleGalleryEntries, setSquareHoleGalleryEntries] = useState< + SquareHoleWorkSummary[] + >([]); + const [squareHoleProfile, setSquareHoleProfile] = + useState(null); + const [squareHoleRun, setSquareHoleRun] = + useState(null); + const [squareHoleRuntimeReturnStage, setSquareHoleRuntimeReturnStage] = + useState('square-hole-result'); + const [isSquareHoleLoadingLibrary, setIsSquareHoleLoadingLibrary] = + useState(false); const [bigFishRun, setBigFishRun] = useState(null); const [bigFishRuntimeShare, setBigFishRuntimeShare] = useState<{ @@ -1057,6 +1208,11 @@ export function PlatformEntryFlowShellImpl({ resolveRpgCreationErrorMessage(error, fallback), [], ); + const resolveSquareHoleErrorMessage = useCallback( + (error: unknown, fallback: string) => + resolveRpgCreationErrorMessage(error, fallback), + [], + ); const refreshBigFishShelf = useCallback(async () => { setIsBigFishLoadingLibrary(true); @@ -1117,6 +1273,33 @@ export function PlatformEntryFlowShellImpl({ } }, []); + const refreshSquareHoleShelf = useCallback(async () => { + setIsSquareHoleLoadingLibrary(true); + + try { + const worksResponse = await listSquareHoleWorks(); + setSquareHoleWorks(worksResponse.items); + setSquareHoleError(null); + } catch (error) { + setSquareHoleError( + resolveSquareHoleErrorMessage(error, '读取方洞挑战作品列表失败。'), + ); + } finally { + setIsSquareHoleLoadingLibrary(false); + } + }, [resolveSquareHoleErrorMessage]); + + const refreshSquareHoleGallery = useCallback(async () => { + try { + const galleryResponse = await listSquareHoleGallery(); + setSquareHoleGalleryEntries(galleryResponse.items); + return galleryResponse.items; + } catch { + setSquareHoleGalleryEntries([]); + return []; + } + }, []); + const refreshPuzzleShelf = useCallback(async () => { setIsPuzzleLoadingLibrary(true); @@ -1349,12 +1532,16 @@ export function PlatformEntryFlowShellImpl({ const puzzlePublicEntries = puzzleGalleryEntries.map( mapPuzzleWorkToPlatformGalleryCard, ); + const squareHolePublicEntries = squareHoleGalleryEntries.map( + mapSquareHoleWorkToPlatformGalleryCard, + ); return mergePlatformPublicGalleryEntries( platformBootstrap.publishedGalleryEntries, [ ...bigFishPublicEntries, ...match3dPublicEntries, ...puzzlePublicEntries, + ...squareHolePublicEntries, ], ).slice(0, 6); }, [ @@ -1363,6 +1550,7 @@ export function PlatformEntryFlowShellImpl({ match3dGalleryEntries, platformBootstrap.publishedGalleryEntries, puzzleGalleryEntries, + squareHoleGalleryEntries, ]); const latestGalleryEntries = useMemo( () => @@ -1374,6 +1562,9 @@ export function PlatformEntryFlowShellImpl({ : []), ...match3dGalleryEntries.map(mapMatch3DWorkToPlatformGalleryCard), ...puzzleGalleryEntries.map(mapPuzzleWorkToPlatformGalleryCard), + ...squareHoleGalleryEntries.map( + mapSquareHoleWorkToPlatformGalleryCard, + ), ], ), [ @@ -1382,6 +1573,7 @@ export function PlatformEntryFlowShellImpl({ match3dGalleryEntries, platformBootstrap.publishedGalleryEntries, puzzleGalleryEntries, + squareHoleGalleryEntries, ], ); @@ -1618,6 +1810,61 @@ export function PlatformEntryFlowShellImpl({ }, }); + const squareHoleFlow = usePlatformCreationAgentFlowController< + SquareHoleSessionSnapshot, + CreateSquareHoleSessionRequest, + SquareHoleSessionResponse, + SendSquareHoleMessageRequest, + ExecuteSquareHoleActionRequest, + SquareHoleActionResponse + >({ + client: { + createSession: squareHoleCreationClient.createSession, + getSession: squareHoleCreationClient.getSession, + streamMessage: squareHoleCreationClient.streamMessage, + executeAction: squareHoleCreationClient.executeAction, + selectSession: (response) => response.session, + }, + createPayload: {}, + workspaceStage: 'square-hole-agent-workspace', + resultStage: 'square-hole-result', + platformStage: 'platform', + isCompileAction: (payload) => payload.action === 'square_hole_compile_draft', + resolveErrorMessage: resolveSquareHoleErrorMessage, + errorMessages: { + open: '开启方洞挑战共创工作台失败。', + restoreMissingSession: '这份方洞挑战草稿缺少会话信息,请重新开始创作。', + restore: '读取方洞挑战创作草稿失败。', + submit: '发送方洞挑战共创消息失败。', + execute: '执行方洞挑战操作失败。', + }, + enterCreateTab, + setSelectionStage, + onSessionOpened: () => { + setShowCreationTypeModal(false); + }, + onActionComplete: async ({ payload, response, setSession }) => { + setSession(response.session); + if (payload.action !== 'square_hole_compile_draft') { + return; + } + + const profileId = response.session.draft?.profileId; + if (!profileId) { + setSquareHoleProfile(null); + return; + } + + try { + const { item } = await getSquareHoleWorkDetail(profileId); + setSquareHoleProfile(item); + await refreshSquareHoleShelf().catch(() => undefined); + } catch { + setSquareHoleProfile(buildSquareHoleProfileFromSession(response.session)); + } + }, + }); + const puzzleFlow = usePlatformCreationAgentFlowController< PuzzleAgentSessionSnapshot, CreatePuzzleAgentSessionRequest, @@ -1752,6 +1999,17 @@ export function PlatformEntryFlowShellImpl({ const isStreamingMatch3DReply = match3dFlow.isStreamingReply; const setIsStreamingMatch3DReply = match3dFlow.setIsStreamingReply; + const squareHoleSession = squareHoleFlow.session; + const squareHoleError = squareHoleFlow.error; + const setSquareHoleSession = squareHoleFlow.setSession; + const setSquareHoleError = squareHoleFlow.setError; + const isSquareHoleBusy = squareHoleFlow.isBusy; + const streamingSquareHoleReplyText = squareHoleFlow.streamingReplyText; + const setStreamingSquareHoleReplyText = + squareHoleFlow.setStreamingReplyText; + const isStreamingSquareHoleReply = squareHoleFlow.isStreamingReply; + const setIsStreamingSquareHoleReply = squareHoleFlow.setIsStreamingReply; + const puzzleSession = puzzleFlow.session; const puzzleError = puzzleFlow.error; const setPuzzleError = puzzleFlow.setError; @@ -1793,6 +2051,25 @@ export function PlatformEntryFlowShellImpl({ setStreamingMatch3DReplyText, ]); + const openSquareHoleAgentWorkspace = useCallback(async () => { + setSquareHoleSession(null); + setSquareHoleProfile(null); + setSquareHoleRun(null); + setSquareHoleError(null); + setSquareHoleRuntimeReturnStage('square-hole-result'); + setStreamingSquareHoleReplyText(''); + setIsStreamingSquareHoleReply(false); + await squareHoleFlow.openWorkspace(); + }, [ + setIsStreamingSquareHoleReply, + setSquareHoleError, + setSquareHoleProfile, + setSquareHoleRun, + setSquareHoleSession, + setStreamingSquareHoleReplyText, + squareHoleFlow, + ]); + const openPuzzleAgentWorkspace = useCallback(async () => { setPuzzleRun(null); setPuzzleOperation(null); @@ -1890,6 +2167,15 @@ export function PlatformEntryFlowShellImpl({ setMatch3DError(null); setStreamingMatch3DReplyText(''); setIsStreamingMatch3DReply(false); + setSquareHoleSession(null); + setSquareHoleProfile(null); + setSquareHoleWorks([]); + setSquareHoleGalleryEntries([]); + setSquareHoleRun(null); + setSquareHoleRuntimeReturnStage('square-hole-result'); + setSquareHoleError(null); + setStreamingSquareHoleReplyText(''); + setIsStreamingSquareHoleReply(false); setPuzzleOperation(null); setPuzzleWorks([]); setSelectedPuzzleDetail(null); @@ -1927,18 +2213,25 @@ export function PlatformEntryFlowShellImpl({ selectionStage, setBigFishError, setIsStreamingMatch3DReply, + setIsStreamingSquareHoleReply, setMatch3DError, setMatch3DSession, setPuzzleError, setRpgCustomWorldError, setRpgGeneratedCustomWorldProfile, setSelectionStage, + setSquareHoleError, + setSquareHoleSession, setStreamingMatch3DReplyText, + setStreamingSquareHoleReplyText, ]); const handleCreationHubCreateType = useCallback( (type: PlatformCreationTypeId) => { - if (type === 'airp' || type === 'visual-novel') { + if ( + type === 'airp' || + type === 'visual-novel' + ) { return; } @@ -1967,6 +2260,13 @@ export function PlatformEntryFlowShellImpl({ return; } + if (type === 'square-hole') { + runProtectedAction(() => { + void openSquareHoleAgentWorkspace(); + }); + return; + } + if (type === 'puzzle') { runProtectedAction(() => { void openPuzzleAgentWorkspace(); @@ -1977,6 +2277,7 @@ export function PlatformEntryFlowShellImpl({ openBigFishAgentWorkspace, openMatch3DAgentWorkspace, openPuzzleAgentWorkspace, + openSquareHoleAgentWorkspace, prepareCreationLaunch, runProtectedAction, sessionController, @@ -1998,6 +2299,12 @@ export function PlatformEntryFlowShellImpl({ match3dFlow.leaveFlow(); }, [match3dFlow]); + const leaveSquareHoleFlow = useCallback(() => { + setSquareHoleRun(null); + setSquareHoleRuntimeReturnStage('square-hole-result'); + squareHoleFlow.leaveFlow(); + }, [squareHoleFlow]); + const leavePuzzleFlow = useCallback(() => { setPuzzleOperation(null); setPuzzleRun(null); @@ -2010,12 +2317,16 @@ export function PlatformEntryFlowShellImpl({ const submitMatch3DMessage = match3dFlow.submitMessage; + const submitSquareHoleMessage = squareHoleFlow.submitMessage; + const submitPuzzleMessage = puzzleFlow.submitMessage; const executeBigFishAction = bigFishFlow.executeAction; const executeMatch3DAction = match3dFlow.executeAction; + const executeSquareHoleAction = squareHoleFlow.executeAction; + const executePuzzleAction = puzzleFlow.executeAction; const retryPuzzleDraftGeneration = useCallback(() => { @@ -2069,6 +2380,19 @@ export function PlatformEntryFlowShellImpl({ } }, [match3dRun, match3dSession, selectionStage, setSelectionStage]); + useEffect(() => { + if (selectionStage === 'square-hole-result' && !squareHoleSession?.draft) { + setSelectionStage( + squareHoleSession ? 'square-hole-agent-workspace' : 'platform', + ); + } + if (selectionStage === 'square-hole-runtime' && !squareHoleRun) { + setSelectionStage( + squareHoleSession?.draft ? 'square-hole-result' : 'platform', + ); + } + }, [selectionStage, setSelectionStage, squareHoleRun, squareHoleSession]); + const startBigFishRun = useCallback(async () => { if (!bigFishSession) { return; @@ -2248,6 +2572,54 @@ export function PlatformEntryFlowShellImpl({ ], ); + const startSquareHoleRunFromProfile = useCallback( + async ( + profile: SquareHoleWorkProfile | SquareHoleWorkSummary, + returnStage: SquareHoleRuntimeReturnStage = 'square-hole-result', + mirrorErrorToPublicDetail = false, + ) => { + if (isSquareHoleBusy) { + return; + } + + squareHoleFlow.setIsBusy(true); + setSquareHoleError(null); + + try { + const { run } = await startSquareHoleRun(profile.profileId); + setSquareHoleRun(run); + setSquareHoleRuntimeReturnStage(returnStage); + setSelectionStage('square-hole-runtime'); + if (profile.publicationStatus === 'published') { + pushAppHistoryPath( + buildPublicWorkStagePath( + 'work-detail', + buildSquareHolePublicWorkCode(profile.profileId), + ), + ); + } + } catch (error) { + const message = resolveSquareHoleErrorMessage( + error, + '启动方洞挑战玩法失败。', + ); + setSquareHoleError(message); + if (mirrorErrorToPublicDetail) { + setPublicWorkDetailError(message); + } + } finally { + squareHoleFlow.setIsBusy(false); + } + }, + [ + isSquareHoleBusy, + resolveSquareHoleErrorMessage, + setSelectionStage, + setSquareHoleError, + squareHoleFlow, + ], + ); + const _buildPuzzleTestWork = useCallback( (draft: PuzzleResultDraft) => { const profileId = @@ -3074,6 +3446,48 @@ export function PlatformEntryFlowShellImpl({ ], ); + const handleDeleteSquareHoleWork = useCallback( + (work: SquareHoleWorkSummary) => { + if (deletingCreationWorkId) { + return; + } + + requestDeleteCreationWork({ + id: work.workId, + title: work.gameName, + detail: + work.publicationStatus === 'published' + ? '删除后会从你的作品列表和公开广场中移除。' + : '删除后会从你的作品列表中移除。', + run: () => { + setDeletingCreationWorkId(work.workId); + setSquareHoleError(null); + + void deleteSquareHoleWork(work.profileId) + .then((response) => { + setSquareHoleWorks(response.items); + void refreshSquareHoleGallery(); + }) + .catch((error) => { + setSquareHoleError( + resolveSquareHoleErrorMessage(error, '删除方洞挑战作品失败。'), + ); + }) + .finally(() => { + setDeletingCreationWorkId(null); + }); + }, + }); + }, + [ + deletingCreationWorkId, + refreshSquareHoleGallery, + requestDeleteCreationWork, + resolveSquareHoleErrorMessage, + setSquareHoleError, + ], + ); + const clearSelectedPublicWorkAuthor = useCallback(() => { publicWorkAuthorRequestKeyRef.current += 1; setSelectedPublicWorkAuthor(null); @@ -3255,6 +3669,12 @@ export function PlatformEntryFlowShellImpl({ return; } + if (isSquareHoleGalleryEntry(entry)) { + setPublicWorkDetailError('方洞挑战点赞将在后续版本开放。'); + setIsPublicWorkDetailBusy(false); + return; + } + void likeRpgEntryWorldGallery(entry.ownerUserId, entry.profileId) .then((updatedEntry) => { setSelectedDetailEntry((current) => @@ -3425,6 +3845,45 @@ export function PlatformEntryFlowShellImpl({ ], ); + const openSquareHolePublicWorkDetail = useCallback( + async (profileId: string) => { + setIsPublicWorkDetailBusy(true); + setSquareHoleError(null); + setPublicWorkDetailError(null); + setSelectionStage('work-detail'); + + try { + const entries = + squareHoleGalleryEntries.length > 0 + ? squareHoleGalleryEntries + : await refreshSquareHoleGallery(); + const matchedEntry = entries.find( + (entry) => entry.profileId === profileId, + ); + + if (!matchedEntry) { + throw new Error('未找到方洞挑战作品。'); + } + + openPublicWorkDetail(mapSquareHoleWorkToPublicWorkDetail(matchedEntry)); + } catch (error) { + setPublicWorkDetailError( + resolveSquareHoleErrorMessage(error, '读取方洞挑战详情失败。'), + ); + } finally { + setIsPublicWorkDetailBusy(false); + } + }, + [ + openPublicWorkDetail, + refreshSquareHoleGallery, + resolveSquareHoleErrorMessage, + setSelectionStage, + setSquareHoleError, + squareHoleGalleryEntries, + ], + ); + const openPuzzleDetail = useCallback( async ( profileId: string, @@ -3546,6 +4005,52 @@ export function PlatformEntryFlowShellImpl({ ], ); + const openSquareHoleDraft = useCallback( + async ( + item: SquareHoleWorkSummary, + options: { forceDraft?: boolean } = {}, + ) => { + setSquareHoleRun(null); + setSquareHoleError(null); + setSquareHoleProfile(null); + + if (item.publicationStatus === 'published' && !options.forceDraft) { + openPublicWorkDetail(mapSquareHoleWorkToPublicWorkDetail(item)); + return; + } + + if (!item.sourceSessionId?.trim()) { + setSquareHoleError('这份方洞挑战草稿缺少会话信息,请重新开始创作。'); + return; + } + + const restoredSession = await squareHoleFlow.restoreDraft( + item.sourceSessionId, + ); + if (!restoredSession) { + await refreshSquareHoleShelf().catch(() => undefined); + return; + } + + try { + const { item: profile } = await getSquareHoleWorkDetail(item.profileId); + setSquareHoleProfile(profile); + } catch (error) { + setSquareHoleProfile(buildSquareHoleProfileFromSession(restoredSession)); + setSquareHoleError( + resolveSquareHoleErrorMessage(error, '读取方洞挑战作品详情失败。'), + ); + } + }, + [ + openPublicWorkDetail, + refreshSquareHoleShelf, + resolveSquareHoleErrorMessage, + setSquareHoleError, + squareHoleFlow, + ], + ); + const openBigFishDraft = useCallback( async (item: BigFishWorkSummary) => { setBigFishRun(null); @@ -3660,6 +4165,21 @@ export function PlatformEntryFlowShellImpl({ return; } + if (isSquareHoleGalleryEntry(selectedPublicWorkDetail)) { + const work = mapPublicWorkDetailToSquareHoleWork( + selectedPublicWorkDetail, + ); + if (!work) { + setPublicWorkDetailError( + '当前方洞挑战作品信息不完整,暂时无法进入玩法。', + ); + return; + } + setPublicWorkDetailError(null); + void startSquareHoleRunFromProfile(work, 'work-detail', true); + return; + } + const launchEntry = selectedDetailEntry?.profileId === selectedPublicWorkDetail.profileId ? selectedDetailEntry @@ -3700,6 +4220,7 @@ export function PlatformEntryFlowShellImpl({ startBigFishRunFromWork, startPuzzleRunFromProfile, startMatch3DRunFromProfile, + startSquareHoleRunFromProfile, ]); const remixPublicWork = useCallback( @@ -3755,6 +4276,12 @@ export function PlatformEntryFlowShellImpl({ return; } + if (isSquareHoleGalleryEntry(entry)) { + setPublicWorkDetailError('方洞挑战作品改造将在后续版本开放。'); + setIsPublicWorkDetailBusy(false); + return; + } + void remixRpgEntryWorldGallery(entry.ownerUserId, entry.profileId) .then((response) => { const nextEntry = response.entry; @@ -3840,6 +4367,18 @@ export function PlatformEntryFlowShellImpl({ return; } + if (isSquareHoleGalleryEntry(entry)) { + const work = mapPublicWorkDetailToSquareHoleWork(entry); + if (!work?.sourceSessionId?.trim()) { + setPublicWorkDetailError( + '这份方洞挑战作品缺少原草稿会话,暂时无法编辑。', + ); + return; + } + void openSquareHoleDraft(work, { forceDraft: true }); + return; + } + const editEntry = selectedDetailEntry?.profileId === entry.profileId ? selectedDetailEntry @@ -3858,6 +4397,7 @@ export function PlatformEntryFlowShellImpl({ openBigFishDraft, openMatch3DDraft, openPuzzleDraft, + openSquareHoleDraft, runProtectedAction, selectedDetailEntry, selectedPuzzleDetail, @@ -3898,11 +4438,13 @@ export function PlatformEntryFlowShellImpl({ const shouldSearchBigFishFirst = upperKeyword.startsWith('BF'); const shouldSearchMatch3DFirst = upperKeyword.startsWith('M3'); const shouldSearchPuzzleFirst = upperKeyword.startsWith('PZ'); + const shouldSearchSquareHoleFirst = upperKeyword.startsWith('SH'); const shouldSearchWorkFirst = !shouldSearchUserIdFirst && !shouldSearchBigFishFirst && !shouldSearchMatch3DFirst && !shouldSearchPuzzleFirst && + !shouldSearchSquareHoleFirst && (upperKeyword.startsWith('CW') || /^\d{1,8}$/u.test(normalizedKeyword)); const shouldSearchUserFirst = shouldSearchUserIdFirst || @@ -3910,7 +4452,8 @@ export function PlatformEntryFlowShellImpl({ (!shouldSearchWorkFirst && !shouldSearchBigFishFirst && !shouldSearchMatch3DFirst && - !shouldSearchPuzzleFirst); + !shouldSearchPuzzleFirst && + !shouldSearchSquareHoleFirst); const tryOpenGalleryEntry = async () => { const entry = @@ -3985,6 +4528,21 @@ export function PlatformEntryFlowShellImpl({ openPublicWorkDetail(mapMatch3DWorkToPublicWorkDetail(matchedEntry)); }; + const tryOpenSquareHoleGalleryEntry = async () => { + const entries = + squareHoleGalleryEntries.length > 0 + ? squareHoleGalleryEntries + : await refreshSquareHoleGallery(); + const matchedEntry = entries.find((entry) => + isSameSquareHolePublicWorkCode(normalizedKeyword, entry.profileId), + ); + + if (!matchedEntry) { + throw new Error('未找到方洞挑战作品。'); + } + + openPublicWorkDetail(mapSquareHoleWorkToPublicWorkDetail(matchedEntry)); + }; try { if (shouldSearchUserIdFirst) { @@ -4008,6 +4566,11 @@ export function PlatformEntryFlowShellImpl({ return; } + if (shouldSearchSquareHoleFirst) { + await tryOpenSquareHoleGalleryEntry(); + return; + } + if (shouldSearchWorkFirst) { try { await tryOpenGalleryEntry(); @@ -4052,6 +4615,8 @@ export function PlatformEntryFlowShellImpl({ puzzleGalleryEntries, refreshBigFishGallery, refreshPuzzleGallery, + refreshSquareHoleGallery, + squareHoleGalleryEntries, ], ); @@ -4100,6 +4665,19 @@ export function PlatformEntryFlowShellImpl({ return; } + if ( + worldType === 'square-hole' || + worldType === 'square_hole' || + work.worldKey.startsWith('square-hole:') + ) { + const profileId = + work.profileId ?? work.worldKey.replace(/^square-hole:/u, ''); + if (profileId) { + void openSquareHolePublicWorkDetail(profileId); + } + return; + } + if ( worldType === 'big_fish' || worldType === 'big-fish' || @@ -4181,6 +4759,7 @@ export function PlatformEntryFlowShellImpl({ openPuzzlePublicWorkDetail, openPublicWorkDetail, openRpgPublicWorkDetail, + openSquareHolePublicWorkDetail, refreshBigFishGallery, resolveBigFishErrorMessage, ], @@ -4206,12 +4785,14 @@ export function PlatformEntryFlowShellImpl({ } void refreshMatch3DGallery(); void refreshPuzzleGallery(); + void refreshSquareHoleGallery(); } }, [ isBigFishCreationVisible, refreshBigFishGallery, refreshMatch3DGallery, refreshPuzzleGallery, + refreshSquareHoleGallery, selectionStage, ]); @@ -4223,12 +4804,14 @@ export function PlatformEntryFlowShellImpl({ ) { void refreshPuzzleShelf(); void refreshMatch3DShelf(); + void refreshSquareHoleShelf(); } }, [ platformBootstrap.canReadProtectedData, platformBootstrap.platformTab, refreshMatch3DShelf, refreshPuzzleShelf, + refreshSquareHoleShelf, selectionStage, ]); @@ -4257,24 +4840,28 @@ export function PlatformEntryFlowShellImpl({ platformBootstrap.isLoadingPlatform || isBigFishLoadingLibrary || isMatch3DLoadingLibrary || + isSquareHoleLoadingLibrary || isPuzzleLoadingLibrary } error={ platformBootstrap.isLoadingPlatform || isBigFishLoadingLibrary || isMatch3DLoadingLibrary || + isSquareHoleLoadingLibrary || isPuzzleLoadingLibrary ? null : (platformBootstrap.platformError ?? sessionController.agentWorkspaceRestoreError ?? bigFishError ?? match3dError ?? + squareHoleError ?? puzzleError) } onRetry={() => { platformBootstrap.setPlatformError(null); setBigFishError(null); setMatch3DError(null); + setSquareHoleError(null); setPuzzleError(null); void platformBootstrap.refreshCustomWorldWorks().catch((error) => { platformBootstrap.setPlatformError( @@ -4285,18 +4872,21 @@ export function PlatformEntryFlowShellImpl({ void refreshBigFishShelf(); } void refreshMatch3DShelf(); + void refreshSquareHoleShelf(); void refreshPuzzleShelf(); }} createError={ sessionController.creationTypeError ?? bigFishError ?? match3dError ?? + squareHoleError ?? puzzleError } createBusy={ sessionController.isCreatingAgentSession || isBigFishBusy || isMatch3DBusy || + isSquareHoleBusy || isPuzzleBusy } onCreateType={handleCreationHubCreateType} @@ -4347,6 +4937,15 @@ export function PlatformEntryFlowShellImpl({ onDeleteMatch3D={(item) => { handleDeleteMatch3DWork(item); }} + squareHoleItems={squareHoleWorks} + onOpenSquareHoleDetail={(item) => { + runProtectedAction(() => { + void openSquareHoleDraft(item); + }); + }} + onDeleteSquareHole={(item) => { + handleDeleteSquareHoleWork(item); + }} puzzleItems={puzzleWorks} onOpenPuzzleDetail={(item) => { runProtectedAction(() => { @@ -4433,6 +5032,11 @@ export function PlatformEntryFlowShellImpl({ return; } + if (isSquareHoleGalleryEntry(entry)) { + openPublicWorkDetail(entry); + return; + } + void openRpgPublicWorkDetail(entry); }} onOpenLibraryDetail={(entry) => { @@ -4486,7 +5090,8 @@ export function PlatformEntryFlowShellImpl({ isPublicWorkDetailBusy || isPuzzleBusy || isBigFishBusy || - isMatch3DBusy + isMatch3DBusy || + isSquareHoleBusy } error={publicWorkDetailError} actionMode={selectedPublicWorkActionMode} @@ -4958,6 +5563,173 @@ export function PlatformEntryFlowShellImpl({ )} + {selectionStage === 'square-hole-agent-workspace' && ( + + + } + > + { + void submitSquareHoleMessage(payload); + }} + onExecuteAction={(payload) => { + void executeSquareHoleAction(payload); + }} + /> + + + )} + + {selectionStage === 'square-hole-result' && squareHoleSession?.draft && ( + + } + > + { + setSelectionStage('square-hole-agent-workspace'); + }} + onSaved={(profile) => { + setSquareHoleProfile(profile); + }} + onPublished={(profile) => { + setSquareHoleProfile(profile); + void Promise.allSettled([ + refreshSquareHoleShelf(), + refreshSquareHoleGallery(), + ]); + openPublicWorkDetail( + mapSquareHoleWorkToPublicWorkDetail(profile), + ); + openPublishShareModal({ + title: profile.gameName, + publicWorkCode: buildSquareHolePublicWorkCode( + profile.profileId, + ), + stage: 'work-detail', + }); + }} + onStartTestRun={(profile) => { + setSquareHoleProfile(profile); + void startSquareHoleRunFromProfile( + profile, + 'square-hole-result', + ); + }} + /> + + + )} + + {selectionStage === 'square-hole-runtime' && ( + + } + > + { + if ( + squareHoleRun?.runId && + squareHoleRun.status.toLowerCase() === 'running' + ) { + void stopSquareHoleRun(squareHoleRun.runId).catch( + () => undefined, + ); + } + setSelectionStage(squareHoleRuntimeReturnStage); + }} + onRestart={() => { + if (!squareHoleRun?.runId || isSquareHoleBusy) { + return; + } + + squareHoleFlow.setIsBusy(true); + setSquareHoleError(null); + void restartSquareHoleRun(squareHoleRun.runId) + .then(({ run }) => { + setSquareHoleRun(run); + }) + .catch((error) => { + setSquareHoleError( + resolveSquareHoleErrorMessage( + error, + '重新开始方洞挑战失败。', + ), + ); + }) + .finally(() => { + squareHoleFlow.setIsBusy(false); + }); + }} + onOptimisticRunChange={setSquareHoleRun} + onDropShape={(payload) => { + const runId = payload.runId ?? squareHoleRun?.runId; + if (!runId) { + return Promise.reject( + new Error('方洞挑战运行态缺少 runId。'), + ); + } + return dropSquareHoleShape(runId, payload); + }} + onTimeExpired={() => { + if (!squareHoleRun?.runId) { + return; + } + + void finishSquareHoleTimeUp(squareHoleRun.runId) + .then(({ run }) => { + setSquareHoleRun(run); + }) + .catch((error) => { + setSquareHoleError( + resolveSquareHoleErrorMessage( + error, + '同步方洞挑战倒计时失败。', + ), + ); + }); + }} + /> + + + )} + {selectionStage === 'puzzle-agent-workspace' && ( { + runProtectedAction(() => { + void openSquareHoleAgentWorkspace(); + }); + }} onSelectPuzzle={() => { runProtectedAction(() => { void openPuzzleAgentWorkspace(); diff --git a/src/components/platform-entry/PlatformWorkDetailView.tsx b/src/components/platform-entry/PlatformWorkDetailView.tsx index f3850a21..964f218a 100644 --- a/src/components/platform-entry/PlatformWorkDetailView.tsx +++ b/src/components/platform-entry/PlatformWorkDetailView.tsx @@ -60,6 +60,9 @@ function getSourceLabel(entry: PlatformPublicGalleryCard) { if ('sourceType' in entry && entry.sourceType === 'match3d') { return '抓大鹅'; } + if ('sourceType' in entry && entry.sourceType === 'square-hole') { + return '方洞挑战'; + } return 'RPG'; } diff --git a/src/components/platform-entry/platformEntryCreationTypes.test.ts b/src/components/platform-entry/platformEntryCreationTypes.test.ts index b48a4639..833979de 100644 --- a/src/components/platform-entry/platformEntryCreationTypes.test.ts +++ b/src/components/platform-entry/platformEntryCreationTypes.test.ts @@ -35,6 +35,7 @@ test('new work entry config controls visibility and open order', () => { 'rpg', 'puzzle', 'match3d', + 'square-hole', 'airp', 'visual-novel', ]); diff --git a/src/components/platform-entry/platformEntryTypes.ts b/src/components/platform-entry/platformEntryTypes.ts index a4987ba1..34624732 100644 --- a/src/components/platform-entry/platformEntryTypes.ts +++ b/src/components/platform-entry/platformEntryTypes.ts @@ -25,6 +25,9 @@ export type SelectionStage = | 'match3d-agent-workspace' | 'match3d-result' | 'match3d-runtime' + | 'square-hole-agent-workspace' + | 'square-hole-result' + | 'square-hole-runtime' | 'puzzle-agent-workspace' | 'puzzle-generating' | 'puzzle-result' diff --git a/src/components/platform-entry/usePlatformCreationAgentFlowController.test.tsx b/src/components/platform-entry/usePlatformCreationAgentFlowController.test.tsx new file mode 100644 index 00000000..70318b21 --- /dev/null +++ b/src/components/platform-entry/usePlatformCreationAgentFlowController.test.tsx @@ -0,0 +1,137 @@ +/* @vitest-environment jsdom */ + +import { act, render, screen, waitFor } from '@testing-library/react'; +import { useEffect } from 'react'; +import { expect, test, vi } from 'vitest'; + +import { usePlatformCreationAgentFlowController } from './usePlatformCreationAgentFlowController'; + +type TestSession = { + sessionId: string; + messages: Array<{ + id: string; + role: string; + kind?: string; + text: string; + createdAt?: string; + }>; +}; + +type TestMessagePayload = { + clientMessageId: string; + text: string; +}; + +function TestHarness({ + streamMessage, +}: { + streamMessage: ( + sessionId: string, + payload: TestMessagePayload, + options?: { onUpdate?: (text: string) => void }, + ) => Promise; +}) { + const flow = usePlatformCreationAgentFlowController< + TestSession, + Record, + { session: TestSession }, + TestMessagePayload, + { action: string }, + { session: TestSession } + >({ + client: { + createSession: async () => ({ + session: { + sessionId: 'session-1', + messages: [], + }, + }), + getSession: async () => ({ + session: { + sessionId: 'session-1', + messages: [], + }, + }), + streamMessage, + executeAction: async () => ({ + session: { + sessionId: 'session-1', + messages: [], + }, + }), + selectSession: (response) => response.session, + }, + createPayload: {}, + workspaceStage: 'match3d-agent-workspace', + resultStage: 'match3d-result', + platformStage: 'platform', + isCompileAction: () => false, + resolveErrorMessage: (error, fallback) => + error instanceof Error ? error.message : fallback, + errorMessages: { + open: '打开失败', + restoreMissingSession: '缺少会话', + restore: '恢复失败', + submit: '发送失败', + execute: '执行失败', + }, + enterCreateTab: () => {}, + setSelectionStage: () => {}, + }); + + useEffect(() => { + void flow.openWorkspace({}); + }, []); + + return ( +
+ +
+ {flow.session?.messages.map((message) => ( +
{`${message.role}:${message.kind}:${message.text}`}
+ ))} +
+ {flow.error ?
{flow.error}
: null} +
+ ); +} + +test('creation agent flow preserves streamed assistant text when stream fails', async () => { + const streamMessage = vi.fn(async (_sessionId, _payload, options) => { + options?.onUpdate?.('先把方洞万能的反差定住。'); + throw new Error('方洞挑战聊天生成失败:LLM 请求超时'); + }); + + render(); + + await waitFor(() => { + expect(screen.getByRole('button', { name: '发送' })).toBeTruthy(); + }); + + await act(async () => { + screen.getByRole('button', { name: '发送' }).click(); + }); + + await waitFor(() => { + expect( + screen.getByText('方洞挑战聊天生成失败:LLM 请求超时'), + ).toBeTruthy(); + }); + + expect(screen.getByTestId('messages').textContent).toContain( + 'user:chat:做一个办公室文具方洞挑战', + ); + expect(screen.getByTestId('messages').textContent).toContain( + 'assistant:warning:先把方洞万能的反差定住。', + ); +}); diff --git a/src/components/platform-entry/usePlatformCreationAgentFlowController.ts b/src/components/platform-entry/usePlatformCreationAgentFlowController.ts index 71fe3052..56243f96 100644 --- a/src/components/platform-entry/usePlatformCreationAgentFlowController.ts +++ b/src/components/platform-entry/usePlatformCreationAgentFlowController.ts @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useRef, useState } from 'react'; import type { TextStreamOptions } from '../../services/aiTypes'; import type { SelectionStage } from './platformEntryTypes'; @@ -104,6 +104,16 @@ function buildOptimisticMessage { + latestStreamingReplyTextRef.current = text; + setStreamingReplyText(text); + }, []); + + const resetStreamingReply = useCallback(() => { + latestStreamingReplyTextRef.current = ''; + setStreamingReplyText(''); + setIsStreamingReply(false); + }, []); const openWorkspace = useCallback(async (createPayload?: TCreatePayload) => { if (isBusy) { @@ -138,8 +160,7 @@ export function usePlatformCreationAgentFlowController< setIsBusy(true); setError(null); - setStreamingReplyText(''); - setIsStreamingReply(false); + resetStreamingReply(); try { const response = await options.client.createSession( @@ -159,7 +180,7 @@ export function usePlatformCreationAgentFlowController< } finally { setIsBusy(false); } - }, [isBusy, options]); + }, [isBusy, options, resetStreamingReply]); const restoreDraft = useCallback( async (sessionId: string | null | undefined) => { @@ -171,8 +192,7 @@ export function usePlatformCreationAgentFlowController< setIsBusy(true); setError(null); - setStreamingReplyText(''); - setIsStreamingReply(false); + resetStreamingReply(); try { const response = await options.client.getSession(normalizedSessionId); @@ -194,7 +214,7 @@ export function usePlatformCreationAgentFlowController< setIsBusy(false); } }, - [options], + [options, resetStreamingReply], ); const submitMessage = useCallback( @@ -206,7 +226,7 @@ export function usePlatformCreationAgentFlowController< const optimisticMessage = buildOptimisticMessage(payload); setError(null); - setStreamingReplyText(''); + updateStreamingReplyText(''); setIsStreamingReply(true); setSession((current) => current @@ -223,12 +243,28 @@ export function usePlatformCreationAgentFlowController< session.sessionId, payload, { - onUpdate: setStreamingReplyText, + onUpdate: updateStreamingReplyText, }, ); setSession(nextSession); - setStreamingReplyText(''); + updateStreamingReplyText(''); } catch (caughtError) { + const interruptedReplyText = + latestStreamingReplyTextRef.current.trim(); + // 上游流可能在已经吐出可读回复后才失败;把这段回复落进本地消息列表,避免 UI 收尾时突然消失。 + if (interruptedReplyText) { + const interruptedMessage = + buildInterruptedAssistantMessage(interruptedReplyText); + setSession((current) => + current + ? { + ...current, + messages: [...current.messages, interruptedMessage], + updatedAt: interruptedMessage.createdAt, + } + : current, + ); + } setError( options.resolveErrorMessage(caughtError, options.errorMessages.submit), ); @@ -236,7 +272,7 @@ export function usePlatformCreationAgentFlowController< setIsStreamingReply(false); } }, - [isStreamingReply, options, session], + [isStreamingReply, options, session, updateStreamingReplyText], ); const executeAction = useCallback( @@ -284,17 +320,15 @@ export function usePlatformCreationAgentFlowController< const leaveFlow = useCallback(() => { setError(null); - setStreamingReplyText(''); - setIsStreamingReply(false); + resetStreamingReply(); options.enterCreateTab(); options.setSelectionStage(options.platformStage); - }, [options]); + }, [options, resetStreamingReply]); const resetTransientState = useCallback(() => { setError(null); - setStreamingReplyText(''); - setIsStreamingReply(false); - }, []); + resetStreamingReply(); + }, [resetStreamingReply]); return { session, diff --git a/src/components/rpg-entry/RpgEntryHomeView.tsx b/src/components/rpg-entry/RpgEntryHomeView.tsx index 14a04ac0..f8de96a6 100644 --- a/src/components/rpg-entry/RpgEntryHomeView.tsx +++ b/src/components/rpg-entry/RpgEntryHomeView.tsx @@ -82,6 +82,7 @@ import { isBigFishGalleryEntry, isMatch3DGalleryEntry, isPuzzleGalleryEntry, + isSquareHoleGalleryEntry, type PlatformPublicGalleryCard, type PlatformWorldCardLike, resolvePlatformWorldCoverImage, @@ -1134,7 +1135,9 @@ function buildPublicGalleryCardKey(entry: PlatformPublicGalleryCard) { ? 'puzzle' : isMatch3DGalleryEntry(entry) ? 'match3d' - : 'rpg'; + : isSquareHoleGalleryEntry(entry) + ? 'square-hole' + : 'rpg'; return `${kind}:${entry.ownerUserId}:${entry.profileId}`; } @@ -1242,7 +1245,9 @@ function describePublicGalleryCardKind(entry: PlatformPublicGalleryCard) { ? '拼图' : isMatch3DGalleryEntry(entry) ? '抓鹅' - : describePlatformThemeLabel(entry.themeMode); + : isSquareHoleGalleryEntry(entry) + ? '方洞' + : describePlatformThemeLabel(entry.themeMode); return formatPlatformWorkDisplayTag(kind); } @@ -1514,6 +1519,12 @@ function formatPlayedWorkType(value: string | null | undefined) { if (normalizedValue === 'puzzle') { return '拼图'; } + if (normalizedValue === 'match3d' || normalizedValue === 'match_3d') { + return '抓鹅'; + } + if (normalizedValue === 'square-hole' || normalizedValue === 'square_hole') { + return '方洞'; + } if (normalizedValue === 'big_fish' || normalizedValue === 'big-fish') { return '大鱼'; } diff --git a/src/components/rpg-entry/rpgEntryWorldPresentation.ts b/src/components/rpg-entry/rpgEntryWorldPresentation.ts index 646dbf4a..d1068f52 100644 --- a/src/components/rpg-entry/rpgEntryWorldPresentation.ts +++ b/src/components/rpg-entry/rpgEntryWorldPresentation.ts @@ -2,6 +2,7 @@ import type { BigFishWorkSummary } from '../../../packages/shared/src/contracts/ import type { Match3DWorkSummary } from '../../../packages/shared/src/contracts/match3dWorks'; import type { PuzzleDraftLevel } from '../../../packages/shared/src/contracts/puzzleAgentDraft'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; +import type { SquareHoleWorkSummary } from '../../../packages/shared/src/contracts/squareHoleWorks'; import type { CustomWorldGalleryCard, CustomWorldLibraryEntry, @@ -12,6 +13,7 @@ import { buildBigFishPublicWorkCode, buildMatch3DPublicWorkCode, buildPuzzlePublicWorkCode, + buildSquareHolePublicWorkCode, } from '../../services/publicWorkCode'; import type { CustomWorldProfile } from '../../types'; @@ -23,6 +25,7 @@ export type PlatformWorldCardLike = | CustomWorldLibraryEntry | PlatformBigFishGalleryCard | PlatformMatch3DGalleryCard + | PlatformSquareHoleGalleryCard | PlatformPuzzleGalleryCard; export type PlatformPuzzleGalleryCard = { @@ -97,10 +100,33 @@ export type PlatformMatch3DGalleryCard = { updatedAt: string; }; +export type PlatformSquareHoleGalleryCard = { + sourceType: 'square-hole'; + workId: string; + profileId: string; + sourceSessionId?: string | null; + publicWorkCode: string; + ownerUserId: string; + authorDisplayName: string; + worldName: string; + subtitle: string; + summaryText: string; + coverImageSrc: string | null; + themeTags: string[]; + playCount?: number; + remixCount?: number; + likeCount?: number; + recentPlayCount7d?: number; + visibility: 'published'; + publishedAt: string | null; + updatedAt: string; +}; + export type PlatformPublicGalleryCard = | CustomWorldGalleryCard | PlatformBigFishGalleryCard | PlatformMatch3DGalleryCard + | PlatformSquareHoleGalleryCard | PlatformPuzzleGalleryCard; export function isLibraryWorldEntry( @@ -127,6 +153,12 @@ export function isMatch3DGalleryEntry( return 'sourceType' in entry && entry.sourceType === 'match3d'; } +export function isSquareHoleGalleryEntry( + entry: PlatformWorldCardLike, +): entry is PlatformSquareHoleGalleryCard { + return 'sourceType' in entry && entry.sourceType === 'square-hole'; +} + export function mapPuzzleWorkToPlatformGalleryCard( work: PuzzleWorkSummary, ): PlatformPuzzleGalleryCard { @@ -180,6 +212,33 @@ export function mapMatch3DWorkToPlatformGalleryCard( }; } +export function mapSquareHoleWorkToPlatformGalleryCard( + work: SquareHoleWorkSummary, +): PlatformSquareHoleGalleryCard { + return { + sourceType: 'square-hole', + workId: work.workId, + profileId: work.profileId, + sourceSessionId: work.sourceSessionId ?? null, + publicWorkCode: buildSquareHolePublicWorkCode(work.profileId), + ownerUserId: work.ownerUserId, + authorDisplayName: '玩家', + worldName: work.gameName, + subtitle: '反直觉形状分拣', + summaryText: work.summary, + coverImageSrc: work.coverImageSrc ?? null, + themeTags: + work.tags.length > 0 ? work.tags : [work.themeText, '方洞挑战'], + playCount: work.playCount ?? 0, + remixCount: 0, + likeCount: 0, + recentPlayCount7d: 0, + visibility: 'published', + publishedAt: work.publishedAt ?? null, + updatedAt: work.updatedAt, + }; +} + export function mapBigFishWorkToPlatformGalleryCard( work: BigFishWorkSummary, ): PlatformBigFishGalleryCard { @@ -371,6 +430,12 @@ export function buildPlatformWorldTags(entry: PlatformWorldCardLike) { return entry.themeTags.length > 0 ? entry.themeTags.slice(0, 3) : ['抓大鹅']; } + if (isSquareHoleGalleryEntry(entry)) { + return entry.themeTags.length > 0 + ? entry.themeTags.slice(0, 3) + : ['方洞']; + } + if (!isLibraryWorldEntry(entry)) { return [ describePlatformThemeLabel(entry.themeMode), @@ -449,6 +514,10 @@ export function resolvePlatformPublicWorkCode( return entry.publicWorkCode; } + if (isSquareHoleGalleryEntry(entry)) { + return entry.publicWorkCode; + } + return entry.publicWorkCode; } diff --git a/src/components/square-hole-creation/SquareHoleAgentWorkspace.tsx b/src/components/square-hole-creation/SquareHoleAgentWorkspace.tsx new file mode 100644 index 00000000..b8bbccad --- /dev/null +++ b/src/components/square-hole-creation/SquareHoleAgentWorkspace.tsx @@ -0,0 +1,149 @@ +import type { + ExecuteSquareHoleActionRequest, + SendSquareHoleMessageRequest, + SquareHoleAnchorItemResponse, + SquareHoleSessionSnapshot, +} from '../../../packages/shared/src/contracts/squareHoleAgent'; +import { + buildCreationAgentChatMessage, + createCreationAgentChatQuickActions, + createCreationAgentClientMessageId, + resolveCreationAgentQuickActionMessage, +} from '../../services/creation-agent'; +import { + type CreationAgentAnchorView, + type CreationAgentSessionView, + type CreationAgentTheme, + CreationAgentWorkspace, +} from '../creation-agent'; + +type SquareHoleAgentWorkspaceProps = { + session: SquareHoleSessionSnapshot | null; + streamingReplyText?: string; + isStreamingReply?: boolean; + isBusy?: boolean; + error?: string | null; + onBack: () => void; + onSubmitMessage: (payload: SendSquareHoleMessageRequest) => void; + onExecuteAction: (payload: ExecuteSquareHoleActionRequest) => void; +}; + +const SQUARE_HOLE_AGENT_THEME: CreationAgentTheme = { + accentTextClass: 'text-sky-100/86', + accentBgClass: 'bg-cyan-200', + accentButtonClass: 'bg-cyan-200 shadow-slate-950/20', + userBubbleClass: 'bg-slate-950 text-white', + heroClass: + 'border border-cyan-100/18 bg-[radial-gradient(circle_at_top_left,rgba(125,211,252,0.28),transparent_34%),radial-gradient(circle_at_bottom_right,rgba(248,113,113,0.2),transparent_32%),linear-gradient(135deg,rgba(15,23,42,0.96),rgba(20,83,45,0.92))]', + anchorGridClass: 'grid gap-2 sm:grid-cols-4', +}; + +const SQUARE_HOLE_QUICK_ACTIONS = [ + ...createCreationAgentChatQuickActions(), + { + key: 'square-hole-auto-config', + label: '自动配置', + }, +]; + +function mapSquareHoleAnchor( + anchor: SquareHoleAnchorItemResponse, +): CreationAgentAnchorView { + return { + key: anchor.key, + label: anchor.label, + value: anchor.value, + status: anchor.status, + }; +} + +function mapSquareHoleSession( + session: SquareHoleSessionSnapshot, +): CreationAgentSessionView { + // 中文注释:方洞工作台只展示共创对话和四个创作锚点,正式运行规则由后端运行态快照裁决。 + const chatMessages = session.messages.filter( + (message) => + message.kind === 'chat' || + message.kind === 'summary' || + message.kind === 'warning', + ); + + return { + sessionId: session.sessionId, + title: null, + assistantSummary: null, + currentTurn: session.currentTurn, + progressPercent: session.progressPercent, + anchors: [ + session.anchorPack.theme, + session.anchorPack.twistRule, + session.anchorPack.shapeCount, + session.anchorPack.difficulty, + ].map(mapSquareHoleAnchor), + messages: chatMessages, + recommendedReplies: [], + }; +} + +function buildSquareHoleChatPayload({ + text, + quickFillRequested = false, +}: { + text: string; + quickFillRequested?: boolean; +}) { + return buildCreationAgentChatMessage({ + clientMessageId: createCreationAgentClientMessageId('square-hole'), + text, + quickFillRequested, + }); +} + +export function SquareHoleAgentWorkspace({ + session, + streamingReplyText = '', + isStreamingReply = false, + isBusy = false, + error = null, + onBack, + onSubmitMessage, + onExecuteAction, +}: SquareHoleAgentWorkspaceProps) { + return ( + { + onSubmitMessage(buildSquareHoleChatPayload({ text })); + }} + onPrimaryAction={() => { + onExecuteAction({ action: 'square_hole_compile_draft' }); + }} + onQuickAction={(action) => { + const quickActionMessage = + action.key === 'square-hole-auto-config' + ? { + text: '自动配置', + quickFillRequested: true, + } + : resolveCreationAgentQuickActionMessage( + action.key, + '请总结一下当前方洞挑战设定。', + ); + + onSubmitMessage(buildSquareHoleChatPayload(quickActionMessage)); + }} + /> + ); +} + +export default SquareHoleAgentWorkspace; diff --git a/src/components/square-hole-creation/index.ts b/src/components/square-hole-creation/index.ts new file mode 100644 index 00000000..b480a237 --- /dev/null +++ b/src/components/square-hole-creation/index.ts @@ -0,0 +1 @@ +export { SquareHoleAgentWorkspace } from './SquareHoleAgentWorkspace'; diff --git a/src/components/square-hole-result/SquareHoleResultView.tsx b/src/components/square-hole-result/SquareHoleResultView.tsx new file mode 100644 index 00000000..d5711f46 --- /dev/null +++ b/src/components/square-hole-result/SquareHoleResultView.tsx @@ -0,0 +1,580 @@ +import { + ArrowLeft, + CheckCircle2, + ImagePlus, + Loader2, + Play, + Send, +} from 'lucide-react'; +import { type ChangeEvent, useEffect, useMemo, useState } from 'react'; + +import type { SquareHoleResultDraft } from '../../../packages/shared/src/contracts/squareHoleAgent'; +import type { + PutSquareHoleWorkRequest, + SquareHoleWorkProfile, +} from '../../../packages/shared/src/contracts/squareHoleWorks'; +import { + publishSquareHoleWork, + updateSquareHoleWork, +} from '../../services/square-hole-works'; +import { ResolvedAssetImage } from '../ResolvedAssetImage'; + +type SquareHoleResultViewProps = { + profile: SquareHoleWorkProfile; + draft?: SquareHoleResultDraft | null; + isBusy?: boolean; + error?: string | null; + onBack: () => void; + onSaved?: (profile: SquareHoleWorkProfile) => void; + onPublished?: (profile: SquareHoleWorkProfile) => void; + onStartTestRun: (profile: SquareHoleWorkProfile) => void; +}; + +type SquareHoleAutoSaveState = 'idle' | 'saving' | 'saved' | 'error'; + +type SquareHoleResultEditState = { + gameName: string; + summary: string; + tagsText: string; + coverImageSrc: string; + themeText: string; + twistRule: string; + shapeCountText: string; + difficultyText: string; +}; + +const SQUARE_HOLE_AUTOSAVE_DEBOUNCE_MS = 600; + +function normalizeTags(value: string) { + return [ + ...new Set( + value + .split(/[\n,,、]/u) + .map((entry) => entry.trim()) + .filter(Boolean), + ), + ]; +} + +function normalizeShapeCount(value: string) { + const parsed = Number.parseInt(value.trim(), 10); + return Number.isFinite(parsed) && parsed >= 6 && parsed <= 24 + ? parsed + : null; +} + +function normalizeDifficulty(value: string) { + const parsed = Number.parseInt(value.trim(), 10); + return Number.isFinite(parsed) && parsed >= 1 && parsed <= 10 + ? parsed + : null; +} + +function createEditState( + profile: SquareHoleWorkProfile, +): SquareHoleResultEditState { + return { + gameName: profile.gameName, + summary: profile.summary, + tagsText: profile.tags.join(','), + coverImageSrc: profile.coverImageSrc?.trim() || '', + themeText: profile.themeText, + twistRule: profile.twistRule, + shapeCountText: String(profile.shapeCount), + difficultyText: String(profile.difficulty), + }; +} + +function buildSavePayload( + editState: SquareHoleResultEditState, +): PutSquareHoleWorkRequest | null { + const shapeCount = normalizeShapeCount(editState.shapeCountText); + const difficulty = normalizeDifficulty(editState.difficultyText); + const gameName = editState.gameName.trim(); + const themeText = editState.themeText.trim(); + const twistRule = editState.twistRule.trim(); + const summary = editState.summary.trim(); + const tags = normalizeTags(editState.tagsText); + + if ( + !gameName || + !themeText || + !twistRule || + !summary || + tags.length === 0 || + !shapeCount || + !difficulty + ) { + return null; + } + + return { + gameName, + themeText, + twistRule, + summary, + tags, + coverImageSrc: editState.coverImageSrc.trim() || null, + shapeCount, + difficulty, + }; +} + +function buildPublishBlockers(editState: SquareHoleResultEditState) { + const blockers = [ + ...(editState.gameName.trim() ? [] : ['游戏名称不能为空。']), + ...(editState.themeText.trim() ? [] : ['题材主题不能为空。']), + ...(editState.twistRule.trim() ? [] : ['反差规则不能为空。']), + ...(editState.summary.trim() ? [] : ['简介不能为空。']), + ...(normalizeTags(editState.tagsText).length > 0 + ? [] + : ['至少需要 1 个标签。']), + ...(normalizeShapeCount(editState.shapeCountText) + ? [] + : ['形状数量需要在 6 到 24 之间。']), + ...(normalizeDifficulty(editState.difficultyText) + ? [] + : ['难度必须为 1 到 10。']), + ]; + + return [...new Set(blockers)]; +} + +function readImageAsDataUrl(file: File) { + return new Promise((resolve, reject) => { + if (!file.type.startsWith('image/')) { + reject(new Error('请选择图片文件。')); + return; + } + + const reader = new FileReader(); + reader.onerror = () => reject(new Error('封面图读取失败,请重试。')); + reader.onload = () => resolve(String(reader.result || '')); + reader.readAsDataURL(file); + }); +} + +function buildPlayableProfile( + profile: SquareHoleWorkProfile, + editState: SquareHoleResultEditState, +) { + const payload = buildSavePayload(editState); + if (!payload) { + return profile; + } + + return { + ...profile, + gameName: payload.gameName, + themeText: payload.themeText ?? profile.themeText, + twistRule: payload.twistRule, + summary: payload.summary, + tags: payload.tags, + coverImageSrc: payload.coverImageSrc, + shapeCount: payload.shapeCount, + difficulty: payload.difficulty, + }; +} + +function SquareHoleResultHeader({ + autoSaveState, + isBusy, + onBack, +}: { + autoSaveState: SquareHoleAutoSaveState; + isBusy: boolean; + onBack: () => void; +}) { + const badge = + autoSaveState === 'saving' ? ( +
+ 保存中 +
+ ) : autoSaveState === 'saved' ? ( +
+ 已自动保存 +
+ ) : autoSaveState === 'error' ? ( +
+ 保存失败 +
+ ) : null; + + return ( +
+ + {badge} +
+ ); +} + +export function SquareHoleResultView({ + profile, + draft = null, + isBusy = false, + error = null, + onBack, + onSaved, + onPublished, + onStartTestRun, +}: SquareHoleResultViewProps) { + const [editState, setEditState] = useState(() => createEditState(profile)); + const [autoSaveState, setAutoSaveState] = + useState('idle'); + const [localError, setLocalError] = useState(null); + const [isPublishing, setIsPublishing] = useState(false); + const [isStartingTestRun, setIsStartingTestRun] = useState(false); + const blockers = useMemo(() => buildPublishBlockers(editState), [editState]); + const canSubmit = blockers.length === 0; + + useEffect(() => { + setEditState(createEditState(profile)); + setAutoSaveState('idle'); + setLocalError(null); + }, [profile.profileId, profile.updatedAt]); + + useEffect(() => { + const payload = buildSavePayload(editState); + if (!payload) { + return undefined; + } + + const currentTags = normalizeTags(profile.tags.join(',')); + const changed = + payload.gameName !== profile.gameName || + payload.themeText !== profile.themeText || + payload.twistRule !== profile.twistRule || + payload.summary !== profile.summary || + (payload.coverImageSrc ?? '') !== (profile.coverImageSrc ?? '') || + payload.shapeCount !== profile.shapeCount || + payload.difficulty !== profile.difficulty || + payload.tags.length !== currentTags.length || + payload.tags.some((tag, index) => tag !== currentTags[index]); + + if (!changed) { + return undefined; + } + + setAutoSaveState('saving'); + setLocalError(null); + let cancelled = false; + const timer = window.setTimeout(() => { + void updateSquareHoleWork(profile.profileId, payload) + .then(({ item }) => { + if (cancelled) { + return; + } + setAutoSaveState('saved'); + onSaved?.(item); + }) + .catch((saveError) => { + if (cancelled) { + return; + } + setAutoSaveState('error'); + setLocalError( + saveError instanceof Error ? saveError.message : '自动保存失败。', + ); + }); + }, SQUARE_HOLE_AUTOSAVE_DEBOUNCE_MS); + + return () => { + cancelled = true; + window.clearTimeout(timer); + }; + }, [editState, onSaved, profile]); + + const saveNow = async () => { + const payload = buildSavePayload(editState); + if (!payload) { + setLocalError(blockers[0] ?? '请补全作品信息。'); + return null; + } + + setAutoSaveState('saving'); + setLocalError(null); + const { item } = await updateSquareHoleWork(profile.profileId, payload); + setAutoSaveState('saved'); + onSaved?.(item); + return item; + }; + + const handleCoverImageChange = async (event: ChangeEvent) => { + const file = event.target.files?.[0] ?? null; + event.target.value = ''; + if (!file) { + return; + } + + try { + const dataUrl = await readImageAsDataUrl(file); + setEditState((current) => ({ + ...current, + coverImageSrc: dataUrl, + })); + setLocalError(null); + } catch (caughtError) { + setLocalError( + caughtError instanceof Error ? caughtError.message : '封面图读取失败。', + ); + } + }; + + const handleStartTestRun = async () => { + if (!canSubmit || isStartingTestRun) { + setLocalError(blockers[0] ?? null); + return; + } + + setIsStartingTestRun(true); + try { + const savedProfile = await saveNow(); + onStartTestRun(savedProfile ?? buildPlayableProfile(profile, editState)); + } catch (caughtError) { + setLocalError( + caughtError instanceof Error ? caughtError.message : '启动试玩前保存失败。', + ); + } finally { + setIsStartingTestRun(false); + } + }; + + const handlePublish = async () => { + if (!canSubmit || isPublishing) { + setLocalError(blockers[0] ?? null); + return; + } + + setIsPublishing(true); + try { + const savedProfile = await saveNow(); + const { item } = await publishSquareHoleWork( + savedProfile?.profileId ?? profile.profileId, + ); + onPublished?.(item); + setLocalError(null); + } catch (caughtError) { + setLocalError( + caughtError instanceof Error ? caughtError.message : '发布方洞挑战失败。', + ); + } finally { + setIsPublishing(false); + } + }; + + const busy = isBusy || isPublishing || isStartingTestRun; + const displayError = error ?? localError; + + return ( +
+ + +
+
+
+
+ {editState.coverImageSrc ? ( +
+ +
+
+ {editState.shapeCountText || '-'} 个 +
+
+ 难度 {editState.difficultyText || '-'} +
+
+ {draft?.publishReady ?? profile.publishReady ? '可发布' : '草稿'} +
+
+
+ +
+
+ + + + +