124 lines
3.4 KiB
Python
124 lines
3.4 KiB
Python
#!/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())
|
|
|