{"connection":{"url":"wss://whaletownend.xinghangee.icu/game","namespace":"/","transports":["websocket","polling"],"options":{"timeout":20000,"forceNew":true,"reconnection":true,"reconnectionAttempts":3,"reconnectionDelay":1000}},"authentication":{"required":true,"method":"JWT Token","tokenFormat":{"issuer":"whale-town","audience":"whale-town-users","type":"access","requiredFields":["sub","username","email","role"],"example":{"sub":"user_123","username":"player_name","email":"user@example.com","role":"user","type":"access","aud":"whale-town-users","iss":"whale-town","iat":1767768599,"exp":1768373399}}},"events":{"clientToServer":{"login":{"description":"用户登录","format":{"type":"login","token":"JWT_TOKEN_HERE"},"example":{"type":"login","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"responses":["login_success","login_error"]},"chat":{"description":"发送聊天消息","format":{"t":"chat","content":"string","scope":"local | global"},"example":{"t":"chat","content":"大家好！我刚进入游戏","scope":"local"},"responses":["chat_sent","chat_error"]},"position_update":{"description":"更新玩家位置","format":{"t":"position","x":"number","y":"number","mapId":"string"},"example":{"t":"position","x":150,"y":400,"mapId":"whale_port"},"responses":[]}},"serverToClient":{"login_success":{"description":"登录成功响应","format":{"t":"login_success","sessionId":"string","userId":"string","username":"string","currentMap":"string"},"example":{"t":"login_success","sessionId":"89aff162-52d9-484e-9a35-036ba63a2280","userId":"user_123","username":"Player_123","currentMap":"whale_port"}},"login_error":{"description":"登录失败响应","format":{"t":"login_error","message":"string"},"example":{"t":"login_error","message":"Token验证失败"}},"chat_sent":{"description":"消息发送成功确认","format":{"t":"chat_sent","messageId":"number","message":"string"},"example":{"t":"chat_sent","messageId":137,"message":"消息发送成功"}},"chat_error":{"description":"消息发送失败","format":{"t":"chat_error","message":"string"},"example":{"t":"chat_error","message":"消息内容不能为空"}},"chat_render":{"description":"接收到聊天消息","format":{"t":"chat_render","from":"string","txt":"string","bubble":"boolean"},"example":{"t":"chat_render","from":"Player_456","txt":"欢迎新玩家！","bubble":true}}}},"maps":{"whale_port":{"name":"Whale Port","displayName":"鲸鱼港","zulipStream":"Whale Port","description":"游戏的主要港口区域"},"pumpkin_valley":{"name":"Pumpkin Valley","displayName":"南瓜谷","zulipStream":"Pumpkin Valley","description":"充满南瓜的神秘山谷"},"novice_village":{"name":"Novice Village","displayName":"新手村","zulipStream":"Novice Village","description":"新玩家的起始区域"}},"examples":{"javascript":{"connection":"\n// 使用原生 WebSocket 客户端连接\nconst ws = new WebSocket('wss://whaletownend.xinghangee.icu/game');\n\nws.onopen = function() {\n  console.log('连接成功');\n  \n  // 发送登录消息\n  ws.send(JSON.stringify({\n    type: 'login',\n    token: 'YOUR_JWT_TOKEN_HERE'\n  }));\n};\n\nws.onmessage = function(event) {\n  const data = JSON.parse(event.data);\n  console.log('收到消息:', data);\n  \n  // 处理不同类型的消息\n  if (data.t === 'login_success') {\n    console.log('登录成功:', data);\n    \n    // 发送聊天消息\n    ws.send(JSON.stringify({\n      t: 'chat',\n      content: '大家好！',\n      scope: 'local'\n    }));\n  } else if (data.t === 'chat_render') {\n    console.log('收到消息:', data.from, '说:', data.txt);\n  }\n};\n\nws.onclose = function(event) {\n  console.log('连接关闭:', event.code, event.reason);\n};\n\nws.onerror = function(error) {\n  console.error('连接错误:', error);\n};\n          ","godot":"\n# Godot WebSocket 客户端示例\nextends Node\n\nvar socket = WebSocketClient.new()\nvar url = \"wss://whaletownend.xinghangee.icu/game\"\n\nfunc _ready():\n    socket.connect(\"connection_closed\", self, \"_closed\")\n    socket.connect(\"connection_error\", self, \"_error\")\n    socket.connect(\"connection_established\", self, \"_connected\")\n    socket.connect(\"data_received\", self, \"_on_data\")\n    \n    var err = socket.connect_to_url(url)\n    if err != OK:\n        print(\"连接失败\")\n\nfunc _connected(protocol):\n    print(\"连接成功\")\n\nfunc _on_data():\n    var packet = socket.get_peer(1).get_packet()\n    var message = JSON.parse(packet.get_string_from_utf8())\n    print(\"收到消息: \", message.result)\n\nfunc _closed(was_clean_close):\n    print(\"连接关闭\")\n\nfunc _error():\n    print(\"连接错误\")\n          "}},"troubleshooting":{"commonIssues":[{"issue":"Token验证失败","solution":"确保JWT Token包含正确的issuer、audience和type字段"},{"issue":"连接超时","solution":"检查服务器是否运行，防火墙设置是否正确"},{"issue":"消息发送失败","solution":"确保已经成功登录，消息内容不为空"}],"testTools":[{"name":"WebSocket King","url":"https://websocketking.com/","description":"在线WebSocket测试工具"},{"name":"Postman","description":"Postman也支持WebSocket连接测试"}]}}