From 5143593d4c97654dad8812c7a064091de60883a1 Mon Sep 17 00:00:00 2001 From: Samuel Sloniker Date: Tue, 15 Jun 2021 14:21:59 -0700 Subject: [PATCH] . --- client.html | 2 ++ wss.py | 68 +++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/client.html b/client.html index 84dedb0..3b32914 100644 --- a/client.html +++ b/client.html @@ -105,6 +105,8 @@ errorbox.style.display = 'block' canvas.style.display = 'none' console.error('Server reported error: ' + code + ': ' + msg) + } else if (type == 'ack') { + ws.send('ack') } } ws.onerror = setup diff --git a/wss.py b/wss.py index ddf5c9f..78540f1 100644 --- a/wss.py +++ b/wss.py @@ -7,22 +7,61 @@ import random import time import shutil import tempfile +import queue from websocket_server import WebsocketServer def cycle(): try: changed = hcapi.get_img() - except ImportError as e: - server.send_message_to_all('err%noconn%Server failed to capture screenshot') + except Exception as e: + #server.send_message_to_all('err%noconn%Server failed to capture screenshot') + for client in clients.values(): + client.send('err%noconn%Server failed to capture screenshot') time.sleep(3) return for i in changed: - threading.Thread(target=do_img, args=(i,)).start() + threading.Thread(target=do_img, args=(i,)).start() + for client in clients.values(): + client.ack() + + +class Client: + def __init__(self, client, server): + self.client = client + self.server = server + self.queue = queue.Queue() + self.good = True + + def send(self, item, name): + self.messages[name] = item + + def ack(self): + self.queue.put(['ack']) + + def cycle(self): + while not self.good: + pass + + item = self.queue.get() + + if item[0] == 'msg': + self.server.send_message(self.client, item[1]) + else: + self.server.send_message(self.client, 'ack') + self.good = False + + def run(self): + while True: + self.cycle() +clients = {} def do_img(imgname): - server.send_message_to_all(img(imgname)) + #server.send_message_to_all(img(imgname)) + for client in clients.values(): + print(client) + client.send(img(imgname), img) def img(imgname): @@ -34,29 +73,38 @@ def img(imgname): return response def new_client(client, server): - print('got client') try: imgname = hcapi.get_full_img() except Exception as e: server.send_message(client, 'err%noconn%Server failed to capture screenshot') return + clients[client['id']] = Client(client, server) + with open(imgname, 'rb') as f: img = f.read() os.unlink(imgname) server.send_message(client, f'pic%0x0%data:imgage/jpeg;base64,{base64.b64encode(img).decode("utf-8")}') + clients[client['id']] = Client(client, server) + clients[client['id']].ack() + threading.Thread(target=clients[client['id']].run).start() def do_touch(client, server, message): - password, x, y, w = message.split(' ') - if password == 'password': - x, y, w = int(x), int(y), int(w) - hcapi.touch(x, y, w) + action = message.split(' ', 1)[0] + if action == 'ack': + clients[client['id']].good = True else: - server.send_message(client, f'badpass') + _, password, x, y, w = message.split(' ') + if password == 'password': + x, y, w = int(x), int(y), int(w) + hcapi.touch(x, y, w) + else: + clients[client['id']].send(f'badpass') def do_cycles(): while True: cycle() + time.sleep(0.2) tmp = tempfile.mkdtemp(prefix="HCRA-") try: