Files
Vocard/web/ipc/client.py
2023-05-27 21:04:04 +08:00

58 lines
1.6 KiB
Python

import websockets, json, asyncio
from uuid import uuid4
class IPCClient:
def __init__(
self,
host = "127.0.0.1",
port = 8000,
secret_key = None,
callback = None
):
self.host = host
self.port = port
self.websocket = None
self.secret_key = secret_key
self.callback = callback
self.id = uuid4()
self.is_connected = False
async def connect_and_reconnect(self):
while True:
if not self.is_connected:
await self.connect()
print("Reconnect in next 10s!")
await asyncio.sleep(10)
async def connect(self):
try:
self.websocket = await websockets.connect(f"ws://{self.host}:{self.port}", extra_headers={"Client-Id": str(self.id)})
await self.start_receiver()
except:
self.is_connected = False
pass
async def send(self, message, user):
if not self.is_connected:
await self.connect_and_reconnect()
data = json.loads(message)
payload = {
"sercet": self.secret_key,
"data": data | {"user_id": user.id, "guild_id": user.guild_id}
}
await self.websocket.send(json.dumps(payload))
async def receive(self):
print("Connected ipc server!")
self.is_connected = True
async for message in self.websocket:
if self.callback:
data = json.loads(message)
self.callback(data)
async def start_receiver(self):
await self.receive()