#!/usr/bin/env python import asyncio from websockets.server import serve adminId = "1234" BOAT_STATE_INCTRL = 1 BOAT_STATE_AVAILABLE = 0 BOAT_STATE_LOCKED = -1 boats = [ { "id": 0, "name": "test boat", "state": BOAT_STATE_AVAILABLE }, { "id": 1, "name": "varent object", "state": BOAT_STATE_AVAILABLE } ] clients = [] def onCMD(data): global boats, adminId print("command:" + str(data)) if (len(data) != 4): return if (data[1] != adminId): return boot = int(data[2]) if (boot >= 0 and boot <= 3): boats[boot] = data[3] print(boats) def sendData(data): global boats print("data to send: " + str(data)) async def echoBoats(client): global boats data = "boats:" for boat in boats: if (boat['state'] != BOAT_STATE_LOCKED): data += str(boat['id']) + ";" + str(boat['name']) + ";" if (boat["state"] == BOAT_STATE_AVAILABLE): data += 'available:' elif (boat["state"] == BOAT_STATE_INCTRL): data += 'in:' await client['ws'].send(data) async def echoLockedBoats(client): global boats if (client['id'] == adminId): data = "lockedBoats:" for boat in boats: if (boat['state'] == BOAT_STATE_LOCKED): data += str(boat['id']) + ";" + str(boat['name']) + ";locked:" await client['ws'].send(data + '\n') async def echoClients(client): global clients if (client['id'] == adminId): data = "clients:" for client in clients: data += str(client['id']) + ";" + str(client['boat']) + ";" + str(client['state']) + ":" await client['ws'].send(data + '\n') async def onMessage(message, client): global boats data = message.replace('\n', '').split(';') if(data[0] != client["id"]): print("invalid id: " + str(data[0]) + " != " + str(client["id"])) else: if (data[1] == "boats"): await echoBoats(client) elif(data[1] == "ctrl"): print("controll") elif(data[1] == "end"): print("end") elif(data[1] == "free"): print("free") elif(data[1] == "lock"): print("lock") elif(data[1] == "locked"): await echoLockedBoats(client) elif(data[1] == "kick"): print("kick") elif(data[1] == "clients"): await echoClients(client) elif(data[1] == "d"): print("controll cmd (" + client['id'] + "): " + data[2]) else: print("something else: '" + data[1] + "'") async def newClient(message, ws): message = message.split(';') client = { "id": message[0], "boat": None, "ws": ws, "state": "active" } print("new client connected: " + client['id']) for clie in clients: if (clie['id'] == client['id']): clie['state'] = 'terminated' clients.append(client) if (client['id'] == adminId): await echoBoats(client) await echoLockedBoats(client) await echoClients(client) return client async def run(ws, path): client = None async for message in ws: client = await newClient(message, ws) if (client is not None): break async for message in ws: if (client['state'] == 'active'): await onMessage(message, client) else: break async def main(): async with serve(run, "0.0.0.0", 8080): await asyncio.Future() asyncio.run(main())