-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
75 lines (55 loc) · 1.91 KB
/
client.py
File metadata and controls
75 lines (55 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import time
from collections.abc import Callable
from typing import Dict
try:
import thread
except ImportError:
import _thread as thread
import websocket # pip install websocket-client
import json
callbacks: Dict[int, Callable] = {}
class ClientConnector:
def __init__(self, url, port, routes):
self.routes = routes
self.ws = websocket.WebSocketApp(f"ws://{url}:{port}", on_message=self.on_message)
thread.start_new_thread(lambda: self.ws.run_forever(), ())
def on_message(self, message):
print(message)
message: Dict = json.loads(message)
server_id = message.get('server_id')
client_id = message.get('client_id')
url = message.get('url')
if url and server_id:
handler = self.routes.get(url)
res = handler(self, message.get('data')) or None
self.ws.send(json.dumps({"server_id": server_id, "data": res}))
elif url:
handler = self.routes.get(url)
handler(self, message.get('data'))
elif client_id:
handler = callbacks.pop(client_id)
handler(self, message.get('data'))
def send(self, url, message=None, callback=None):
res = {"url": url}
if message:
res["data"] = message
if callback:
client_id = time.time_ns()
res['client_id'] = client_id
callbacks[client_id] = callback
self.ws.send(json.dumps(res))
class MessageController:
@staticmethod
def create(connector, data):
print(data)
@staticmethod
def check(connector, data):
return 'hello, bro!'
connector = ClientConnector('localhost', 8765, {
"/messages/create": MessageController.create,
"check": MessageController.check
})
while True:
input()
connector.send('/messages/get', callback=lambda self, x: print(x))
connector.send('/messages/get', 'dataaaa')