| Total Complexity | 9 |
| Total Lines | 57 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
| 1 | import errno |
||
| 2 | import sys |
||
| 3 | import uuid |
||
| 4 | |||
| 5 | HEADER_LENGTH = 10 |
||
| 6 | |||
| 7 | |||
| 8 | class Client: |
||
| 9 | |||
| 10 | def __init__(self, client_socket): |
||
| 11 | self.name = f"client {uuid.uuid4()}".encode("utf-8") |
||
| 12 | self.socket = client_socket |
||
| 13 | |||
| 14 | username_header = f"{len(self.name) : <{HEADER_LENGTH}}".encode("utf-8") |
||
| 15 | self.socket.send(username_header + self.name) |
||
| 16 | |||
| 17 | self.send_message = '' |
||
| 18 | |||
| 19 | def send(self): |
||
| 20 | message = self.send_message.encode("utf-8") |
||
| 21 | message_header = f"{len(message) :< {HEADER_LENGTH}}".encode("utf-8") |
||
| 22 | self.socket.send(message_header + message) |
||
| 23 | self.send_message = '' |
||
| 24 | |||
| 25 | def retrieve_next_message(self, new_messages): |
||
| 26 | username_header = self.socket.recv(HEADER_LENGTH) |
||
| 27 | if not len(username_header): |
||
| 28 | print("Connection closed by the server") |
||
| 29 | sys.exit() |
||
| 30 | |||
| 31 | username_length = int(username_header.decode("utf-8").strip()) |
||
| 32 | username = self.socket.recv(username_length).decode("utf-8") |
||
| 33 | |||
| 34 | message_header = self.socket.recv(HEADER_LENGTH) |
||
| 35 | message_length = int(message_header.decode("utf-8").strip()) |
||
| 36 | message = self.socket.recv(message_length).decode("utf-8") |
||
| 37 | |||
| 38 | new_messages.append({'author': username, 'content': message}) |
||
| 39 | |||
| 40 | def fetch_new_messages(self): |
||
| 41 | new_messages = [] |
||
| 42 | |||
| 43 | try: |
||
| 44 | while True: |
||
| 45 | self.retrieve_next_message(new_messages) |
||
| 46 | |||
| 47 | except IOError as e: |
||
| 48 | if e.errno not in [errno.EAGAIN, errno.EWOULDBLOCK]: |
||
| 49 | print("reading error", str(e)) |
||
| 50 | sys.exit() |
||
| 51 | |||
| 52 | return new_messages |
||
| 53 | |||
| 54 | except Exception as e: |
||
| 55 | print("general error", str(e)) |
||
| 56 | sys.exit() |
||
| 57 |