add boat state terminated

This commit is contained in:
Laila van Reenen 2024-08-10 10:58:06 +02:00
parent 33cee85edb
commit 6d22572a75
Signed by: LailaTheElf
GPG Key ID: 1F4E6EE3E6DDF769

View File

@ -3,21 +3,21 @@
import asyncio import asyncio
from websockets.server import serve from websockets.server import serve
adminId = "1234" ADMIN_ID = "1234"
BOAT_STATE_INCTRL = 1 BOAT_STATE_INCTRL = 2
BOAT_STATE_AVAILABLE = 0 BOAT_STATE_AVAILABLE = 1
BOAT_STATE_LOCKED = -1 BOAT_STATE_LOCKED = 0
BOAT_STATE_TERMINATED = -1
boats = [] Boats = []
clients = [] Clients = []
async def echo_boats(client): async def echo_boats(client):
"""echo list of all not locked boats to client""" """echo list of all not locked boats to client"""
global boats
data = "boats:" data = "boats:"
for boat in boats: for boat in Boats:
if boat['state'] != BOAT_STATE_LOCKED: if boat['state'] != BOAT_STATE_LOCKED and boat['state'] != BOAT_STATE_TERMINATED:
data += str(boat['id']) + ";" + str(boat['name']) + ";" data += str(boat['id']) + ";" + str(boat['name']) + ";"
if boat["state"] == BOAT_STATE_AVAILABLE: if boat["state"] == BOAT_STATE_AVAILABLE:
data += 'available:' data += 'available:'
@ -27,20 +27,19 @@ async def echo_boats(client):
async def echo_locked_boats(client): async def echo_locked_boats(client):
"""echo list of all locked boats to client""" """echo list of all locked boats to client"""
global boats if client['id'] == ADMIN_ID:
if client['id'] == adminId:
data = "lockedBoats:" data = "lockedBoats:"
for boat in boats: for boat in Boats:
if boat['state'] == BOAT_STATE_LOCKED: if boat['state'] == BOAT_STATE_LOCKED:
data += str(boat['id']) + ";" + str(boat['name']) + ";locked:" data += str(boat['id']) + ";" + str(boat['name']) + ";locked:"
await client['ws'].send(data + '\n') await client['ws'].send(data + '\n')
async def echo_clients(client): async def echo_clients(client):
"""echo list of all clients to client""" """echo list of all clients to client"""
if client['id'] == adminId: if client['id'] == ADMIN_ID:
data = "clients:" data = "clients:"
for client in clients: for clie in Clients:
data += str(client['id']) + ";" + str(client['boat']) + ";" + str(client['state']) + ":" data += str(clie['id']) + ";" + str(clie['boat']) + ";" + str(clie['state']) + ":"
await client['ws'].send(data + '\n') await client['ws'].send(data + '\n')
async def take_controll(client, boat): async def take_controll(client, boat):
@ -48,8 +47,8 @@ async def take_controll(client, boat):
if client['boat'] is not None: if client['boat'] is not None:
client['boat']["state"] = BOAT_STATE_AVAILABLE client['boat']["state"] = BOAT_STATE_AVAILABLE
client["boat"] = None client["boat"] = None
for b in boats: for b in Boats:
if b['id'] == boat: if b['id'] == boat and b['state'] != BOAT_STATE_TERMINATED:
if b['state'] == BOAT_STATE_AVAILABLE: if b['state'] == BOAT_STATE_AVAILABLE:
b["state"] = BOAT_STATE_INCTRL b["state"] = BOAT_STATE_INCTRL
print("take controll: " + str(client["id"]) + " -> " + b["name"]) print("take controll: " + str(client["id"]) + " -> " + b["name"])
@ -62,24 +61,24 @@ async def take_controll(client, boat):
async def free_boat(boat): async def free_boat(boat):
"""make boat available for next client""" """make boat available for next client"""
for client in clients: for client in Clients:
if client["boat"]['id'] == boat: if client["boat"]['id'] == boat:
client["boat"] = None client["boat"] = None
break break
for b in boats: for b in Boats:
if b['id'] == boat: if b['id'] == boat and b['state'] != BOAT_STATE_TERMINATED:
if boat['state'] == BOAT_STATE_INCTRL: if boat['state'] == BOAT_STATE_INCTRL:
boat["state"] = BOAT_STATE_AVAILABLE boat["state"] = BOAT_STATE_AVAILABLE
break break
async def lock_boat(boat): async def lock_boat(boat):
"""lock a boat so client can't take controll over it""" """lock a boat so client can't take controll over it"""
for client in clients: for client in Clients:
if client["boat"]['id'] == boat: if client["boat"]['id'] == boat:
client["boat"] = None client["boat"] = None
break break
for b in boats: for b in Boats:
if b['id'] == int(boat): if b['id'] == boat and b['state'] != BOAT_STATE_TERMINATED:
boat["state"] = BOAT_STATE_LOCKED boat["state"] = BOAT_STATE_LOCKED
break break
@ -98,10 +97,10 @@ async def on_message(message, client):
elif data[1] == "end": elif data[1] == "end":
await take_controll(client, -1) await take_controll(client, -1)
elif data[1] == "free": elif data[1] == "free":
if client["id"] == adminId: if client["id"] == ADMIN_ID:
await free_boat(data[2]) await free_boat(data[2])
elif data[1] == "lock": elif data[1] == "lock":
if client["id"] == adminId: if client["id"] == ADMIN_ID:
await lock_boat(data[2]) await lock_boat(data[2])
elif data[1] == "locked": elif data[1] == "locked":
await echo_locked_boats(client) await echo_locked_boats(client)
@ -122,11 +121,11 @@ async def new_client(clientId, ws):
"""handler for every new client connection""" """handler for every new client connection"""
client = { "id": clientId, "boat": None, "ws": ws, "state": "active" } client = { "id": clientId, "boat": None, "ws": ws, "state": "active" }
print("new client connected: " + client['id']) print("new client connected: " + client['id'])
for clie in clients: for clie in Clients:
if clie['id'] == client['id']: if clie['id'] == client['id']:
clie['state'] = 'terminated' clie['state'] = 'terminated'
clients.append(client) Clients.append(client)
if client['id'] == adminId: if client['id'] == ADMIN_ID:
await echo_boats(client) await echo_boats(client)
await echo_locked_boats(client) await echo_locked_boats(client)
await echo_clients(client) await echo_clients(client)
@ -136,10 +135,11 @@ async def new_boat(boatId, name, ws):
"""handler for every new boat connection""" """handler for every new boat connection"""
boat = { "id": boatId, "name": name, "ws": ws, "state": BOAT_STATE_AVAILABLE } boat = { "id": boatId, "name": name, "ws": ws, "state": BOAT_STATE_AVAILABLE }
print("new boat connected: " + boatId) print("new boat connected: " + boatId)
for bo in boats: for bo in Boats:
if bo['id'] == boat['id']: if bo['id'] == boat['id']:
bo['state'] = 'terminated' bo['state'] = BOAT_STATE_TERMINATED
boats.append(boat) await bo['ws'].close()
Boats.append(boat)
return boat return boat
async def run(ws, path): async def run(ws, path):