"""内嵌的网页客户端。 为什么要内嵌而不是写一堆静态文件 -------------------------------- 服务端只需要一个 ``/`` 路由就能给出完整的可视化客户端,部署时不用管理 静态目录、不用配 CORS,`pip install` 完就能玩。页面本身也是 WebSocket 协议的一份"活文档":想接自己的客户端时,照着这里的 JS 抄就行。 注意:这个字符串里既有 CSS 又有 JS,花括号很多,所以**不要**用 ``f-string`` 渲染它(为此把需要拼接的部分放在 :func:`dashboard_text` 里)。 """ from __future__ import annotations DASHBOARD_HTML = r""" SimpleFarm 服务器

SimpleFarm 小型农场游戏服务器

未连接

农田

牧场

    快捷动作

    市场行情 红涨绿跌

    服务器排行榜

    农事日志

    """ def dashboard_text(host: str, port: int) -> str: """给终端/curl 看的纯文本索引。""" return ( "SimpleFarm 游戏服务器\n" "======================\n" f"网页客户端:http://{host}:{port}/\n" f"接口文档 :http://{host}:{port}/docs\n" f"健康检查 :http://{host}:{port}/api/health\n" f"实时通道 :ws://{host}:{port}/ws?farm=<牧场名>\n" "\n" "给 AI / 脚本的最短路径\n" "----------------------\n" f"curl 'http://{host}:{port}/api/actions?farm=default'\n" f"curl -X POST 'http://{host}:{port}/api/actions?farm=default' \\\n" " -H 'Content-Type: application/json' \\\n" " -d '{\"action\":\"plant\",\"params\":{\"plot\":1,\"crop\":\"wheat\"}}'\n" "\n" "读取类\n" "------\n" "GET /api/world 世界概览 + 排行榜\n" "GET /api/farms 牧场列表\n" "GET /api/state 完整状态\n" "GET /api/catalog 作物/牲畜/价格\n" "GET /api/actions 当前合法动作(AI 推荐入口)\n" "GET /api/log 最近事件\n" "GET /api/help 规则 + 动作清单 + 参数说明\n" "\n" "写入类\n" "------\n" "POST /api/actions {\"action\":\"...\",\"params\":{...}} 通用入口\n" "POST /api/batch {\"actions\":[{...},{...}]} 批量\n" "POST /api/plant|water|harvest|harvest_all|buy_animal|feed|\n" " collect|buy_feed|buy_plot|sleep|pause|save|reset 便捷入口\n" "POST /api/farms {\"farm\":\"名字\"} 创建/进入牧场\n" "POST /api/admin/save 全部存档\n" "POST /api/admin/shutdown 优雅停机\n" )