const io = require('socket.io-client'); const axios = require('axios'); // 配置 const GAME_SERVER = 'http://localhost:3000'; const TEST_USER = { username: 'angtest123', password: 'angtest123', email: 'angjustinl@163.com' }; /** * 登录游戏服务器获取token */ async function loginToGameServer() { console.log('📝 步骤 1: 登录游戏服务器'); console.log(` 用户名: ${TEST_USER.username}`); try { const response = await axios.post(`${GAME_SERVER}/auth/login`, { identifier: TEST_USER.username, password: TEST_USER.password }); if (response.data.success) { console.log('✅ 登录成功'); console.log(` 用户ID: ${response.data.data.user.id}`); console.log(` 昵称: ${response.data.data.user.nickname}`); console.log(` 邮箱: ${response.data.data.user.email}`); console.log(` Token: ${response.data.data.access_token.substring(0, 20)}...`); return { userId: response.data.data.user.id, username: response.data.data.user.username, token: response.data.data.access_token }; } else { throw new Error(response.data.message || '登录失败'); } } catch (error) { console.error('❌ 登录失败:', error.response?.data?.message || error.message); throw error; } } // 使用用户 API Key 测试 Zulip 集成 async function testWithUserApiKey() { console.log('🚀 开始测试用户 API Key 的 Zulip 集成'); console.log('='.repeat(60)); try { // 登录获取 token const userInfo = await loginToGameServer(); console.log('\n📡 步骤 2: 连接 WebSocket 并测试 Zulip 集成'); console.log(` 连接到: ${GAME_SERVER}/game`); const socket = io(`${GAME_SERVER}/game`, { transports: ['websocket'], timeout: 20000 }); let testStep = 0; socket.on('connect', () => { console.log('✅ WebSocket 连接成功'); testStep = 1; // 使用真实的 JWT token const loginMessage = { type: 'login', token: userInfo.token }; console.log('📤 步骤 3: 发送登录消息(使用 JWT Token)'); socket.emit('login', loginMessage); }); socket.on('login_success', (data) => { console.log('✅ 步骤 3 完成: 登录成功'); console.log(' 会话ID:', data.sessionId); console.log(' 用户ID:', data.userId); console.log(' 用户名:', data.username); console.log(' 当前地图:', data.currentMap); testStep = 2; // 等待 Zulip 客户端初始化 console.log('\n⏳ 等待 3 秒让 Zulip 客户端初始化...'); setTimeout(() => { const chatMessage = { t: 'chat', content: `🎮 【用户API Key测试】来自 ${userInfo.username} 的消息!\n` + `时间: ${new Date().toLocaleString()}\n` + `使用真实 API Key 发送此消息。`, scope: 'local' }; console.log('📤 步骤 4: 发送消息到 Zulip(使用真实 API Key)'); console.log(' 目标 Stream: Whale Port'); socket.emit('chat', chatMessage); }, 3000); }); socket.on('chat_sent', (data) => { console.log('✅ 步骤 4 完成: 消息发送成功'); console.log(' 响应:', JSON.stringify(data, null, 2)); // 只在第一次收到 chat_sent 时发送第二条消息 if (testStep === 2) { testStep = 3; setTimeout(() => { // 先切换到 Pumpkin Valley 地图 console.log('\n📤 步骤 5: 切换到 Pumpkin Valley 地图'); const positionUpdate = { t: 'position', x: 150, y: 400, mapId: 'pumpkin_valley' }; socket.emit('position_update', positionUpdate); // 等待位置更新后发送消息 setTimeout(() => { const chatMessage2 = { t: 'chat', content: '🎃 在南瓜谷发送的测试消息!', scope: 'local' }; console.log('📤 步骤 6: 在 Pumpkin Valley 发送消息'); socket.emit('chat', chatMessage2); }, 1000); }, 2000); } }); socket.on('chat_render', (data) => { console.log('\n📨 收到来自 Zulip 的消息:'); console.log(' 发送者:', data.from); console.log(' 内容:', data.txt); console.log(' Stream:', data.stream || '未知'); console.log(' Topic:', data.topic || '未知'); }); socket.on('error', (error) => { console.log('❌ 收到错误:', JSON.stringify(error, null, 2)); }); socket.on('disconnect', () => { console.log('\n🔌 WebSocket 连接已关闭'); console.log('\n' + '='.repeat(60)); console.log('📊 测试结果汇总'); console.log('='.repeat(60)); console.log(' 完成步骤:', testStep, '/ 3'); if (testStep >= 3) { console.log(' ✅ 核心功能正常!'); console.log(' 💡 请检查 Zulip 中的 "Whale Port" 和 "Pumpkin Valley" Streams 查看消息'); } else { console.log(' ⚠️ 部分测试未完成'); } console.log('='.repeat(60)); process.exit(testStep >= 3 ? 0 : 1); }); socket.on('connect_error', (error) => { console.error('❌ 连接错误:', error.message); process.exit(1); }); // 20秒后自动关闭(给足够时间完成测试) setTimeout(() => { console.log('\n⏰ 测试时间到,关闭连接'); socket.disconnect(); }, 20000); } catch (error) { console.error('\n❌ 测试失败:', error.message); process.exit(1); } } // 运行测试 testWithUserApiKey();