webpnp/model.py
Dominic Zimmer add16e6c89 Update model
2020-04-17 00:43:16 +02:00

76 lines
2.4 KiB
Python

import random
import base64
import json
import os
import datetime
def generate_random_id(_s=set()):
while (new_id := base64.b32encode(bytearray(random.randint(0, 0xFF) for _ in range(10)))[:16].decode().lower()) in _s:
pass
_s.add(new_id)
return new_id
class Model:
def __init__(self, filename = "tehmodel.json"):
self.sockets = {} # mapping: client -> socket
self.filename = filename
self.model = None
if os.path.isfile(filename):
with open(filename) as f:
try:
self.model = json.load(f)
except:
self.model = {}
else:
self.model = {}
self.assert_model()
def assert_model(self):
if not "clients" in self.model:
self.model["clients"] = {}
if not "sessions" in self.model:
self.model["sessions"] = {}
async def handle_post(self, clientid, data):
print("I have received P O S T data: " + str(data))
print("let me tell everyone")
for k, v in self.sockets.items():
await v.send_json({"message": "nudes"})
def save(self):
with open(self.filename, "w") as f:
json.dump(self.model, f)
if not os.path.isdir("backups"):
try:
os.mkdir("backups")
except FileExistsError:
print("backups is a file, no directory. Please delete yourself")
datestring = datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d-%H%M%S")
with open(f"backups/{datestring}_{self.filename}", "w") as f:
json.dump(self.model, f)
def exists_client(self, clientid: str) -> bool:
return clientid in self.model["clients"]
def create_client(self) -> str:
clientname = generate_random_id()
newclient = {"id": clientname}
self.model["clients"][clientname] = newclient
return clientname
def create_session(self) -> str:
sessionname = generate_random_id()
newsession = {"id": sessionname, "clients": []}
self.model["sessions"][sessionname] = newsession
return sessionname
def subscribe(self, clientid, socket):
self.sockets[clientid] = socket
def unsubscribe(self, socket):
for k,v in self.sockets.items():
if v == socket:
self.sockets.pop(k)