1111from .constants import MAX_IPC_SOCKET_RANGE , SOCKET_SELECT_TIMEOUT , SOCKET_BUFFER_SIZE
1212
1313SOCKET_DISCONNECTED : int = - 1
14-
14+ SOCKET_BAD_BUFFER_SIZE : int = - 2
15+ SOCKET_SEND_TIMEOUT : int = 5
16+ SOCKET_CONNECT_TIMEOUT : int = 2
17+ SOCKET_RECEIVE_TIMEOUT : int = 5
1518
1619class UnixPipe :
1720 def __init__ (self ):
1821 self .socket : socket .socket = None
1922
2023 def connect (self ):
2124 if self .socket is None :
22- self .socket = socket .socket (socket .AF_UNIX )
23- self .socket .setblocking ( False )
25+ self .socket = socket .socket (socket .AF_UNIX , socket . SOCK_STREAM )
26+ self .socket .settimeout ( SOCKET_CONNECT_TIMEOUT )
2427 base_path = path = (
2528 os .environ .get ("XDG_RUNTIME_DIR" )
2629 or os .environ .get ("TMPDIR" )
@@ -44,6 +47,7 @@ def connect(self):
4447 pass
4548 else :
4649 raise DiscordNotOpened
50+ self .socket .setblocking (False )
4751
4852 def disconnect (self ):
4953 if self .socket is None :
@@ -60,17 +64,15 @@ def disconnect(self):
6064 self .socket = None # Reset so connect() creates a fresh socket
6165
6266 def send (self , payload , op ):
63- payload = json . dumps ( payload ). encode ( "UTF-8 " )
64- payload = struct . pack ( "<ii" , op , len ( payload )) + payload
65- size = 0
66- while size == 0 or size < len ( payload ):
67- res = self .socket .send ( payload [ size :] )
68- size += res
67+ log . debug ( f"Sending payload: { payload } with op: { op } " )
68+ payload_bytes = json . dumps ( payload ). encode ( "UTF-8" )
69+ header = struct . pack ( "<ii" , op , len ( payload_bytes ))
70+ message = header + payload_bytes
71+ self .socket .settimeout ( SOCKET_SEND_TIMEOUT )
72+ self . socket . sendall ( message )
6973
7074 def receive (self ) -> (int , str ):
71- ready = select .select ([self .socket ], [], [], SOCKET_SELECT_TIMEOUT )
72- if not ready [0 ]:
73- return 0 , {}
75+ self .socket .settimeout (SOCKET_RECEIVE_TIMEOUT )
7476 data = self .socket .recv (SOCKET_BUFFER_SIZE )
7577 if len (data ) == 0 :
7678 return SOCKET_DISCONNECTED , {}
@@ -80,7 +82,7 @@ def receive(self) -> (int, str):
8082 all_data = data [8 :]
8183 buffer_size = length - len (all_data )
8284 if buffer_size < 0 :
83- return 0 , {}
85+ return SOCKET_BAD_BUFFER_SIZE , {}
8486 data = self .socket .recv (length - len (all_data ))
8587 all_data += data
8688 return code , all_data .decode ("UTF-8" )
0 commit comments