diff options
| author | 2018-10-06 15:37:05 +0100 | |
|---|---|---|
| committer | 2018-10-06 15:37:05 +0100 | |
| commit | 0794a5173ae2a45aad4f91f76a0fd0a9fe2939c4 (patch) | |
| tree | 6652a20f47bb0113d9a70b392533a608664b12a4 /src/Socket.py | |
| parent | Attempt to register servers for read/write when sending github hook notices (diff) | |
| signature | ||
Add a way to track non-IRC sockets within the main epoll loop; use this for a
unix domain control socket!
Diffstat (limited to 'src/Socket.py')
| -rw-r--r-- | src/Socket.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/Socket.py b/src/Socket.py new file mode 100644 index 00000000..f405b0a9 --- /dev/null +++ b/src/Socket.py @@ -0,0 +1,51 @@ + + +class Socket(object): + def __init__(self, socket, on_read, encoding="utf8"): + self.socket = socket + self._on_read = on_read + self.encoding = encoding + + self._write_buffer = b"" + self._read_buffer = b"" + self.delimiter = None + self.length = None + self.connected = True + + def fileno(self): + return self.socket.fileno() + + def disconnect(self): + self.connected = False + + def _decode(self, s): + return s.decode(self.encoding) if self.encoding else s + def _encode(self, s): + return s.encode(self.encoding) if self.encoding else s + + def read(self): + data = self.socket.recv(1024) + if not data: + return None + + data = self._read_buffer+data + self._read_buffer = b"" + if not self.delimiter == None: + data_split = data.split(delimiter) + if data_split[-1]: + self._read_buffer = data_split.pop(-1) + return [self._decode(data) for data in data_split] + return [data.decode(self.encoding)] + + def parse_data(self, data): + self._on_read(self, data) + + def send(self, data): + self._write_buffer += self._encode(data) + + def _send(self): + self._write_buffer = self._write_buffer[self.socket.send( + self._write_buffer):] + + def waiting_send(self): + return bool(len(self._write_buffer)) |
