Skip to content

Phira-mp + 專案概覽

專案結構

Phira-mp-plus/

├── Cargo.toml                   # 工作區根 (workspace)
├── Cargo.lock
├── LICENSE                      # AGPL-3.0
├── README.md

├── server_config.yml            # YAML 設定檔(首次執行自動產生預設範本)
├── data/                        # 執行時期資料目錄
│   ├── extensions.json          #   插件擴展資料持久化
│   ├── rounds/                  #   輪次 Touches/Judges 記錄
│   └── plugins/                 #   插件私有資料
├── log/                         # 執行日誌(每小時輪轉)

├── phira-mp-plus-server/        # 伺服端核心
│   ├── Cargo.toml               #   axum / tokio / wasmtime / clap 等依賴
│   ├── locales/                 #   Fluent i18n 翻譯檔案
│   │   ├── en-US.ftl
│   │   ├── zh-CN.ftl
│   │   └── zh-TW.ftl
│   └── src/
│       ├── main.rs              #   程序入口與生命週期
│       ├── logging.rs           #   tracing 輸出與日誌輪轉
│       ├── terminal.rs          #   終端能力偵測與 Screen 降級策略
│       ├── lib.rs               #   模組匯出
│       ├── server.rs            #   伺服器核心: PlusConfig / PlusServerState / PlusServer
│       │                        #     accept 迴圈、壓力測試方法、狀態查詢分發
│       ├── session.rs           #   會話管理: Session / User 模型、認證、命令處理
│       │                        #     Touches/Judges 資料流向插件事件 + 磁碟儲存
│       ├── room.rs              #   房間狀態機: InternalRoomState / Room
│       │                        #     選譜→準備→遊玩→結算、玩家即時資料快取
│       ├── plugin.rs            #   插件管理器 + WASM 宿主: PluginManager / PluginHost trait
│       │                        #     插件載入、事件分發、CLI/HTTP/API 註冊
│       ├── plugin_http.rs       #   HTTP 服務裝配與動態請求分發
│       ├── plugin_http/
│       │   ├── router.rs        #   動態路由匹配
│       │   ├── sse.rs           #   SSE 事件匯流排、快照與流轉換
│       │   └── websocket.rs     #   即時 WebSocket 橋接
│       ├── wasm_host.rs         #   WASM 執行時期: wasmtime 實例、JSON ABI、host/api 橋接
│       ├── extensions.rs        #   擴展資料系統: 使用者/房間 KV 儲存 + auth 快取持久化
│       ├── ban.rs               #   黑名單系統: 全域封禁 + 房間黑名單
│       ├── round_store.rs       #   輪次資料儲存: JSONL 格式、按 round_uuid/player_id 組織
│       ├── rate_limiter.rs      #   速率限制: 滑動視窗 (連線) + 令牌桶 (命令)
│       ├── cli.rs               #   CLI 命令處理器: 30+ 管理命令、插件擴展命令
│       ├── cli_tui.rs           #   TUI 終端介面: ratatui + crossterm
│       └── l10n.rs              #   在地化: Fluent Bundle / tl! 巨集

├── phira-mp-plus-server-api/    # WASM 插件共享型別 crate
│   └── src/lib.rs               #   PluginEvent / PluginInfo / HttpHandle
│                                #   ServerStateQuery / PluginApiHandler

├── phira-mp/                    # 上游 phira-mp 子模組(協定層與原始服務端)
│   ├── phira-mp-common/         #   網路協定: 二進位編碼 (BinaryData trait)、
│   │   └── src/                 #     命令定義 (ClientCommand / ServerCommand)、
│   │       ├── lib.rs           #     Stream 幀協定、RoomId / RoomState / 訊息類型
│   │       ├── command.rs
│   │       ├── bin.rs           #     BinaryReader / BinaryWriter (LEB128, 小端)
│   │       └── framing.rs       #     打包/拆包 (VARINT 長度前綴)
│   ├── phira-mp-macros/         #   #[derive(BinaryData)] 程序巨集
│   ├── phira-mp-server/         #   原始單機服務端 (reference)
│   └── phira-mp-client/         #   TCP 客戶端函式庫 (供遊戲整合)

├── docs/                        # 本地文件
│   ├── cli.md                   #   CLI 命令參考
│   └── plugin-dev.md            #   WASM 插件開發指南 + WIT API 參考

└── server_config.yml            # YAML 設定檔 (同級副本, 執行時讀取)

終端相容性

啟動時會檢測 stdin/stdout、TERMSTYTMUX。GNU Screen 自動切換到逐行相容控制臺,不啟用顏色、備用螢幕、滑鼠捕獲或 Bracketed Paste;tmux 仍可使用完整 TUI。專案同時遵循 NO_COLOR,逐行輸出會再次過濾殘留控制序列。非互動環境同樣使用逐行控制臺。

SSE 房間事件

GET /rooms/listen 建立連線後先發送 ready,隨後以 update_room 補發當前房間快照,再持續推送 create_roomupdate_roomjoin_roomleave_roomnew_round。可用下列命令直接檢查資料流:

bash
curl -N http://127.0.0.1:12347/rooms/listen

建構特性

特性說明預設
plugin-systemWASM 插件支援(wasmtime)

設定參考

完整的設定項見 server_config.yml

設定項型別預設值說明
portu1612346TCP 監聽埠
http_portu1612347HTTP/SSE 服務埠
monitorsVec<i32>[2]允許旁觀的使用者 ID
phira_api_endpointStringhttps://phira.5wyxi.comPhira API 端點
plugins_dirStringplugins插件目錄
chat_enabledbooltrue聊天功能開關
cli_enabledbooltrueCLI 控制臺開關
connection_rate_limitu3230連線速率限制(視窗內允許次數)
connection_rate_windowu3210連線速率統計視窗(秒)
max_users_per_roomusize8每房間最大玩家數
round_data_retention_daysu327輪次 Touches/Judges 保留天數(0=不保留)
server_nameString伺服器名稱

Last modified byFireflyF09on2026-06-26 16:11

Built with VitePress