aboutsummaryrefslogtreecommitdiff
path: root/src/Socket.py
diff options
context:
space:
mode:
authorGravatar jesopo2018-10-06 15:37:05 +0100
committerGravatar jesopo2018-10-06 15:37:05 +0100
commit0794a5173ae2a45aad4f91f76a0fd0a9fe2939c4 (patch)
tree6652a20f47bb0113d9a70b392533a608664b12a4 /src/Socket.py
parentAttempt 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.py51
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))