Make player container an ordered dictionary

This commit is contained in:
Paul Brinkmeier 2023-01-16 16:13:44 +01:00
parent 5fbe00aefa
commit 2d294ddfd2
3 changed files with 19 additions and 9 deletions

View File

@ -13,7 +13,7 @@ export default {
data() { data() {
return { return {
ws: new WebSocket(import.meta.env.VITE_GLEBBY_SERVER_URL), ws: new WebSocket(import.meta.env.VITE_GLEBBY_SERVER_URL),
model: null model: null as any
} }
}, },
created() { created() {
@ -24,7 +24,14 @@ export default {
if (payload.type === 'init') { if (payload.type === 'init') {
console.log('Received initial game state:') console.log('Received initial game state:')
console.log(payload.state) console.log(payload.state)
this.model = payload.state const players = new Map()
for (const player of payload.state.players) {
players.set(player.id, player)
}
this.model = {
yourId: payload.state.yourId,
players
}
this.ws.removeEventListener('message', messageListener) this.ws.removeEventListener('message', messageListener)
} }
} }

View File

@ -8,11 +8,11 @@ interface Player {
interface Model { interface Model {
yourId: number, yourId: number,
players: Player[] players: Map<number, Player>
} }
function getPlayer(model: Model, id: number): Player | undefined { function getPlayer(model: Model, id: number): Player | undefined {
return model.players.find(player => player.id === id) return model.players.get(id)
} }
/* /*
@ -41,13 +41,13 @@ export default defineComponent({
switch (payload.type) { switch (payload.type) {
case 'join': case 'join':
this.model.players.push({ this.model.players.set(message.from, {
id: message.from, id: message.from,
name: '' name: ''
}) })
break break
case 'leave': case 'leave':
this.model.players = this.model.players.filter(player => player.id !== message.from) this.model.players.delete(message.from)
break break
case 'chat': case 'chat':
this.chatMessages.push(payload.message) this.chatMessages.push(payload.message)
@ -81,7 +81,7 @@ export default defineComponent({
</script> </script>
<template> <template>
<pre>{{ JSON.stringify(model, null, 2) }}</pre> <pre>{{ model }}</pre>
<h1>I am #{{ model.yourId }}</h1> <h1>I am #{{ model.yourId }}</h1>
<form @submit.prevent="setName"> <form @submit.prevent="setName">
<input v-model="playerName" placeholder="enter your name..."> <input v-model="playerName" placeholder="enter your name...">
@ -93,7 +93,7 @@ export default defineComponent({
</form> </form>
<h2>players</h2> <h2>players</h2>
<ul v-if="model"> <ul v-if="model">
<li v-for="player in model.players" :key="player.id">{{ player.name }}#{{ player.id }}</li> <li v-for="[id, player] in model.players" :key="id">{{ player.name }}#{{ player.id }}</li>
</ul> </ul>
<h2>chat</h2> <h2>chat</h2>
<ul v-if="model"> <ul v-if="model">

View File

@ -1,6 +1,7 @@
import json import json
import simple_websocket import simple_websocket
from collections import OrderedDict
from flask import Flask from flask import Flask
from flask_sock import Sock from flask_sock import Sock
from queue import Queue from queue import Queue
@ -14,7 +15,9 @@ class Client:
class GlebbyState: class GlebbyState:
def __init__(self): def __init__(self):
self.clients_lock = Lock() self.clients_lock = Lock()
self.clients = dict() # We want to preserve the order that clients arrived in,
# e.g. for whose turn it is
self.clients = OrderedDict()
self.next_client_id_lock = Lock() self.next_client_id_lock = Lock()
self.next_client_id = 0 self.next_client_id = 0