"""内嵌的网页客户端。 为什么要内嵌而不是写一堆静态文件 -------------------------------- 服务端只需要一个 ``/`` 路由就能给出完整的可视化客户端,部署时不用管理 静态目录、不用配 CORS,`pip install` 完就能玩。页面本身也是 SSE 协议的一份"活文档":想接自己的客户端时,照着这里的 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"实时通道 :http://{host}:{port}/api/stream?farm=<牧场名>(SSE 单向推送)\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" "登录(网页用;脚本可以不带 Cookie 继续 ?farm=)\n" "----------------------------------------------\n" 'POST /api/login {"username":"名字"} → 设置 Cookie,登录后只能操作自己的牧场\n' "GET /api/me 当前登录用户(未登录为 null)\n" "POST /api/logout 退出登录\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|sell|build|pause|save|reset 便捷入口\n" 'POST /api/farms {"farm":"名字"} 创建/进入牧场\n' "POST /api/admin/save 全部存档\n" "POST /api/admin/shutdown 优雅停机\n" )