57 lines
1.8 KiB
Python

import asyncio
import websockets
import json
clients = {}
vars = {}
async def handshake(ws,j):
if not clients.get(j.get('project_id')):
clients[j.get('project_id')] = {}
clients[j.get('project_id')][j.get('user')] = ws
print(f"{j.get('user')} connected from {ws.host}:{ws.port}")
return(j.get('project_id'),j.get('user'))
async def get_variables(websocket,project_id,user):
for name,value in vars.get(project_id,{}).items():
if not name:
continue
await websocket.send(json.dumps({"method":"set","name":name,"value":value}))
async def set_variable(project_id,user,var):
if not vars.get(project_id,''):
vars[project_id] = {}
vars[project_id][var.get('name','')] = var.get('value','')
data = json.dumps(var)
for name,ws in clients.get(project_id,{}).items():
if name == user:
continue
print(f"> {name} - {data}")
await ws.send(data)
async def disconnect(project_id,user):
print("disconnecting",user)
clients.get(project_id,[]).pop(user)
async def process(websocket, path):
project_id = ""
user = ""
async for msg in websocket:
print(f"< {user} - {msg}")
try:
data = json.loads(msg)
method = data.get('method','')
if method == 'handshake':
project_id,user = await handshake(websocket,data)
await get_variables(websocket,project_id,user)
if method in ['set','create']:
await set_variable(project_id,user,data)
finally:
pass
await disconnect(project_id,user)
start_server = websockets.serve(process, 'localhost', 5000, compression=None)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()