Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
57 lines
2.0 KiB
JavaScript
57 lines
2.0 KiB
JavaScript
const WebSocket = require('ws')
|
|
|
|
const base = 'ws://127.0.0.1:3000/ws?room=SCOREQA'
|
|
|
|
function connect(name) {
|
|
return new Promise((resolve, reject) => {
|
|
const ws = new WebSocket(base)
|
|
const messages = []
|
|
ws.on('message', (data) => {
|
|
const msg = JSON.parse(data.toString())
|
|
messages.push(msg)
|
|
if (msg.type === 'joined') resolve({ ws, messages, team: msg.team })
|
|
})
|
|
ws.on('error', reject)
|
|
})
|
|
}
|
|
|
|
function waitFor(condFn, timeout = 5000) {
|
|
const start = Date.now()
|
|
return new Promise((resolve, reject) => {
|
|
const check = () => {
|
|
if (condFn()) return resolve(undefined)
|
|
if (Date.now() - start > timeout) return reject(new Error('timeout'))
|
|
setTimeout(check, 50)
|
|
}
|
|
check()
|
|
})
|
|
}
|
|
|
|
;(async () => {
|
|
const p1 = await connect('p1')
|
|
const p2 = await connect('p2')
|
|
await waitFor(() => p1.messages.some(m => m.type === 'game_state'))
|
|
let state = p1.messages.find(m => m.type === 'game_state')
|
|
console.log('start turn', state.turn_team, 'hammer', state.hammer)
|
|
|
|
const thrower1 = state.turn_team === p1.team ? p1 : p2
|
|
thrower1.ws.send(JSON.stringify({ type: 'throw', broom_x: 0.2, broom_y: 38.7, weight: 9, curl: 1, friction: 1.0 }))
|
|
await waitFor(() => p1.messages.some(m => m.type === 'trajectory'), 15000)
|
|
await waitFor(() => p1.messages.slice(-1)[0]?.type === 'game_state', 15000)
|
|
await new Promise(r => setTimeout(r, 500))
|
|
state = p1.messages.slice(-1)[0]
|
|
console.log('After first throw:', state)
|
|
const thrower2 = state.turn_team === p1.team ? p1 : p2
|
|
thrower2.ws.send(JSON.stringify({ type: 'throw', broom_x: -0.1, broom_y: 38.8, weight: 9, curl: 1, friction: 1.0 }))
|
|
await waitFor(() => p1.messages.filter(m => m.type === 'trajectory').length >= 2, 15000)
|
|
await waitFor(() => p1.messages.slice(-1)[0]?.type === 'game_state', 15000)
|
|
await new Promise(r => setTimeout(r, 500))
|
|
console.log('Final stones', p1.messages.slice(-1)[0].stones)
|
|
p1.ws.close()
|
|
p2.ws.close()
|
|
process.exit(0)
|
|
})().catch(e => {
|
|
console.error(e)
|
|
process.exit(1)
|
|
})
|