-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconstants.py
92 lines (77 loc) · 2.12 KB
/
constants.py
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import socket
import struct
import pickle
from dataclasses import astuple, dataclass
PORT = 53535
MAIN_PORT = 53530
VIDEO_PORT = 53531
AUDIO_PORT = 53532
# ADDR = ('', PORT)
DISCONNECT = 'QUIT!'
OK = 'OK'
SIZE = 1024
SERVER = 'SERVER'
# requests
GET = 'GET'
POST = 'POST'
ADD = 'ADD'
RM = 'RM'
# data types
VIDEO = 'Video'
AUDIO = 'Audio'
TEXT = 'Text'
FILE = 'File'
MEDIA_SIZE = {VIDEO: 25000, AUDIO: 4500}
def send_bytes(self, msg):
# Prefix each message with a 4-byte length (network byte order)
msg = struct.pack('>I', len(msg)) + msg
self.sendall(msg)
def recv_bytes(self):
# Read message length and unpack it into an integer
raw_msglen = self.recvall(4)
if not raw_msglen:
return b''
msglen = struct.unpack('>I', raw_msglen)[0]
# Read the message data
return self.recvall(msglen)
def recvall(self, n):
# Helper function to recv n bytes or return None if EOF is hit
data = bytearray()
while len(data) < n:
try:
packet = self.recv(n - len(data))
except (BrokenPipeError, ConnectionResetError, OSError):
print(f"[ERROR] Connection not present")
return b''
if not packet:
return b''
data.extend(packet)
return data
def disconnect(self):
msg = Message(SERVER, DISCONNECT)
try:
self.send_bytes(pickle.dumps(msg))
except (BrokenPipeError, ConnectionResetError, OSError):
print(f"[ERROR] Connection not present")
self.close()
socket.socket.send_bytes = send_bytes
socket.socket.recv_bytes = recv_bytes
socket.socket.recvall = recvall
socket.socket.disconnect = disconnect
@dataclass
class Message:
from_name: str
request: str
data_type: str = None
data: any = None
to_names: tuple[str] = None
def __str__(self):
if self.data_type in [VIDEO, AUDIO]:
data = ""
else:
data = self.data
return f"[{self.from_name}] {self.request}:{self.data_type} -> {self.to_names} {data}"
def __iter__(self):
return iter(astuple(self))
def __getitem__(self, keys):
return iter(getattr(self, k) for k in keys)