Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion discordrpc/asyncdiscord.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from loguru import logger as log

from .sockets import UnixPipe, SOCKET_BAD_BUFFER_SIZE, SOCKET_DISCONNECTED
from socket import timeout
from .commands import *
from .exceptions import *
from .constants import MAX_SOCKET_RETRY_ATTEMPTS
Expand Down Expand Up @@ -82,10 +83,11 @@ def poll_callback(self, callback: callable):
while self.polling:
try:
val = self.rpc.receive()
except timeout:
continue
except Exception as ex:
log.error(f"error receiving data from socket. {ex}")
self.disconnect()
return
if val[0] == SOCKET_BAD_BUFFER_SIZE:
log.debug("bad buffer size when receiving data from socket")
if val[0] == SOCKET_DISCONNECTED:
Expand Down
3 changes: 2 additions & 1 deletion discordrpc/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
10 # Number of IPC sockets to try (discord-ipc-0 through discord-ipc-9)
)
SOCKET_SELECT_TIMEOUT = 0.1 # Socket select timeout in seconds (reduced from 1.0s for 90% latency improvement)
SOCKET_BUFFER_SIZE = 1024 # Socket receive buffer size in bytes
#SOCKET_BUFFER_SIZE = 1024 # Socket receive buffer size in bytes
SOCKET_BUFFER_SIZE = 8
14 changes: 6 additions & 8 deletions discordrpc/sockets.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
SOCKET_BAD_BUFFER_SIZE: int = -2
SOCKET_SEND_TIMEOUT: int = 5
SOCKET_CONNECT_TIMEOUT: int = 2
SOCKET_RECEIVE_TIMEOUT: int = 5
SOCKET_RECEIVE_TIMEOUT: int = 10

class UnixPipe:
def __init__(self):
Expand Down Expand Up @@ -64,25 +64,23 @@ def disconnect(self):
self.socket = None # Reset so connect() creates a fresh socket

def send(self, payload, op):
log.debug(f"Sending payload: {payload} with op: {op}")
payload_bytes = json.dumps(payload).encode("UTF-8")
header = struct.pack("<ii", op, len(payload_bytes))
message = header + payload_bytes
self.socket.settimeout(SOCKET_SEND_TIMEOUT)
self.socket.sendall(message)

def receive(self) -> (int, str):
self.socket.settimeout(SOCKET_RECEIVE_TIMEOUT)
data = self.socket.recv(SOCKET_BUFFER_SIZE)
if len(data) == 0:
return SOCKET_DISCONNECTED, {}
header = data[:8]
code = int.from_bytes(header[:4], "little")
length = int.from_bytes(header[4:], "little")
all_data = data[8:]
buffer_size = length - len(all_data)
if buffer_size < 0:
all_data = b""
if length < 0:
return SOCKET_BAD_BUFFER_SIZE, {}
data = self.socket.recv(length - len(all_data))
all_data += data
if length > 0:
data = self.socket.recv(length)
all_data += data
return code, all_data.decode("UTF-8")
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "1.9.1",
"version": "1.9.2",
"thumbnail": "store/thumbnail.png",
"id": "com_imdevinc_StreamControllerDiscordPlugin",
"name": "Discord - Debug",
Expand Down