diff --git a/pypresence/presence.py b/pypresence/presence.py index 8490ece..54ff57a 100644 --- a/pypresence/presence.py +++ b/pypresence/presence.py @@ -46,7 +46,6 @@ def connect(self): def close(self): self.send_data(2, {'v': 1, 'client_id': self.client_id}) self.loop.close() - self.sock_writer.close() if sys.platform == 'win32' or sys.platform == 'win64': self.sock_writer._call_connection_lost(None) @@ -85,6 +84,5 @@ async def connect(self): def close(self): self.send_data(2, {'v': 1, 'client_id': self.client_id}) self.loop.close() - self.sock_writer.close() if sys.platform == 'win32' or sys.platform == 'win64': self.sock_writer._call_connection_lost(None) diff --git a/pypresence/utils.py b/pypresence/utils.py index 83b6180..2b8f66a 100644 --- a/pypresence/utils.py +++ b/pypresence/utils.py @@ -5,6 +5,7 @@ import sys import tempfile import time +import socket from .exceptions import PyPresenceException @@ -23,8 +24,13 @@ def remove_none(d: dict): def test_ipc_path(path): '''Tests an IPC pipe to ensure that it actually works''' - with open(path): - return True + if sys.platform == 'win32' or sys.platform == 'win64': + with open(path): + return True + else: + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: + client.connect(path) + return True # Returns on first IPC pipe matching Discord's @@ -34,7 +40,7 @@ def get_ipc_path(pipe=None): ipc = f"{ipc}{pipe}" if sys.platform in ('linux', 'darwin'): - tempdir = (os.environ.get('XDG_RUNTIME_DIR') or tempfile.gettempdir()) + tempdir = os.environ.get('XDG_RUNTIME_DIR') or (f"/run/user/{os.getuid()}" if os.path.exists(f"/run/user/{os.getuid()}") else tempfile.gettempdir()) paths = ['.', 'snap.discord', 'app/com.discordapp.Discord', 'app/com.discordapp.DiscordCanary'] elif sys.platform == 'win32': tempdir = r'\\?\pipe' @@ -46,7 +52,7 @@ def get_ipc_path(pipe=None): full_path = os.path.abspath(os.path.join(tempdir, path)) if sys.platform == 'win32' or os.path.isdir(full_path): for entry in os.scandir(full_path): - if entry.name.startswith(ipc) and os.path.exists(entry) and test_ipc_path(entry): + if entry.name.startswith(ipc) and os.path.exists(entry) and test_ipc_path(entry.path): return entry.path