controlpanel-old/backend/state.py

48 lines
1.2 KiB
Python

import asyncio
from tinydb import TinyDB
from settings import settings
from proto import Computer
db = TinyDB(settings.database_path)
computers = db.table("computers")
class StateManager:
def __init__(self):
self.websockets = set()
self.current_state = None
self.update_state()
def update_state(self):
self.current_state = {"computers": computers.all()}
async def push_state(self, socket):
try:
await socket.send_json(self.current_state)
except RuntimeError:
print("dead socket?")
self.websockets.remove(socket)
async def on_connect(self, socket):
self.websockets.add(socket)
await self.push_state(socket)
async def on_disconnect(self, socket):
self.websockets.remove(socket)
async def on_change(self):
self.update_state()
await asyncio.gather(*[self.push_state(socket) for socket in self.websockets])
async def on_computer_register(self, computer: Computer):
# uUiD iS nOt JsOn SeRiAlIzAbLe
computer_data = computer.dict()
computer_data["uuid"] = str(computer_data["uuid"])
computers.insert(computer_data)
await self.on_change()