2021-04-13 07:55:08 +12:00
|
|
|
import platform
|
|
|
|
import time
|
2021-04-13 22:38:11 +12:00
|
|
|
from logging import getLogger
|
2024-05-21 01:03:47 +12:00
|
|
|
from typing import List
|
2021-04-13 07:55:08 +12:00
|
|
|
|
2024-05-21 01:03:47 +12:00
|
|
|
from PyQt5.QtCore import QObject, QSettings, pyqtSlot
|
|
|
|
from pypresence import Presence, exceptions
|
2021-04-13 07:55:08 +12:00
|
|
|
|
2023-09-20 10:39:15 +12:00
|
|
|
from rare.models.options import options
|
2024-05-21 01:03:47 +12:00
|
|
|
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
|
2021-04-13 07:55:08 +12:00
|
|
|
|
|
|
|
client_id = "830732538225360908"
|
2024-05-20 23:36:43 +12:00
|
|
|
logger = getLogger("DiscordRPC")
|
2021-04-13 07:55:08 +12:00
|
|
|
|
|
|
|
|
|
|
|
class DiscordRPC(QObject):
|
2021-10-15 10:05:00 +13:00
|
|
|
def __init__(self):
|
2021-04-13 07:55:08 +12:00
|
|
|
super(DiscordRPC, self).__init__()
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc = None
|
2021-04-13 07:55:08 +12:00
|
|
|
self.state = 1 # 0: game, 1: always active, 2: off
|
2022-02-26 06:43:27 +13:00
|
|
|
self.core = LegendaryCoreSingleton()
|
|
|
|
self.signals = GlobalSignalsSingleton()
|
2021-10-15 10:05:00 +13:00
|
|
|
|
2021-04-13 07:55:08 +12:00
|
|
|
self.settings = QSettings()
|
2024-05-20 23:36:43 +12:00
|
|
|
if self.settings.value(*options.discord_rpc_mode) == 1: # show always
|
2021-04-13 07:55:08 +12:00
|
|
|
self.state = 2
|
|
|
|
self.set_discord_rpc()
|
|
|
|
|
2024-05-21 01:03:47 +12:00
|
|
|
self.signals.discord_rpc.update_presence.connect(self.update_presence)
|
|
|
|
self.signals.discord_rpc.remove_presence.connect(self.remove_presence)
|
|
|
|
self.signals.discord_rpc.update_settings.connect(self.update_settings)
|
2021-10-15 10:05:00 +13:00
|
|
|
|
2024-05-21 01:03:47 +12:00
|
|
|
@pyqtSlot(str)
|
|
|
|
def update_presence(self, app_name: str):
|
2021-10-15 10:05:00 +13:00
|
|
|
self.set_discord_rpc(app_name)
|
|
|
|
|
2024-05-21 01:03:47 +12:00
|
|
|
@pyqtSlot(str)
|
|
|
|
def remove_presence(self, app_name: str):
|
|
|
|
self.set_discord_rpc(None)
|
|
|
|
|
|
|
|
@pyqtSlot()
|
|
|
|
@pyqtSlot(list)
|
|
|
|
def update_settings(self, game_running: List = None):
|
2024-05-20 23:36:43 +12:00
|
|
|
value = self.settings.value(*options.discord_rpc_mode)
|
2021-04-13 07:55:08 +12:00
|
|
|
if value == 2:
|
|
|
|
self.remove_rpc()
|
|
|
|
return
|
2021-04-13 22:38:11 +12:00
|
|
|
if not game_running and value == 0:
|
2021-04-13 07:55:08 +12:00
|
|
|
self.remove_rpc()
|
2021-04-13 22:38:11 +12:00
|
|
|
elif not game_running:
|
|
|
|
self.set_discord_rpc()
|
2021-04-13 07:55:08 +12:00
|
|
|
else:
|
|
|
|
self.set_discord_rpc(game_running[0])
|
|
|
|
|
|
|
|
def remove_rpc(self):
|
2024-05-20 23:36:43 +12:00
|
|
|
if self.settings.value(*options.discord_rpc_mode) != 1:
|
|
|
|
if not self.rpc:
|
2021-04-13 07:55:08 +12:00
|
|
|
return
|
2021-04-13 22:38:11 +12:00
|
|
|
try:
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc.close()
|
2021-04-13 22:38:11 +12:00
|
|
|
except Exception:
|
|
|
|
logger.warning("Already closed")
|
2024-05-20 23:36:43 +12:00
|
|
|
del self.rpc
|
|
|
|
self.rpc = None
|
2021-04-13 22:38:11 +12:00
|
|
|
logger.info("Remove RPC")
|
2021-04-13 07:55:08 +12:00
|
|
|
self.state = 2
|
|
|
|
else:
|
|
|
|
self.state = 1
|
|
|
|
self.set_discord_rpc()
|
|
|
|
|
|
|
|
def set_discord_rpc(self, app_name=None):
|
2024-05-20 23:36:43 +12:00
|
|
|
if not self.rpc:
|
2021-04-13 22:38:11 +12:00
|
|
|
try:
|
2024-05-21 01:03:47 +12:00
|
|
|
self.rpc = Presence(client_id) # Rare app: https://discord.com/developers/applications
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc.connect()
|
2021-04-13 22:38:11 +12:00
|
|
|
except ConnectionRefusedError as e:
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.warning(f"Discord is not active\n{e}")
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc = None
|
2021-04-13 22:38:11 +12:00
|
|
|
return
|
2021-04-16 09:02:48 +12:00
|
|
|
except FileNotFoundError as e:
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.warning(f"File not found error\n{e}")
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc = None
|
2021-04-16 09:02:48 +12:00
|
|
|
return
|
2024-05-21 01:03:47 +12:00
|
|
|
except exceptions.InvalidPipe as e:
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.error(f"Is Discord running? \n{e}")
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc = None
|
2021-05-01 21:24:38 +12:00
|
|
|
return
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(str(e))
|
2024-05-20 23:36:43 +12:00
|
|
|
self.rpc = None
|
2021-05-01 21:24:38 +12:00
|
|
|
return
|
2021-04-13 07:55:08 +12:00
|
|
|
self.update_rpc(app_name)
|
|
|
|
|
|
|
|
def update_rpc(self, app_name=None):
|
2024-05-20 23:36:43 +12:00
|
|
|
if self.settings.value(*options.discord_rpc_mode) == 2 or (
|
2024-05-21 01:03:47 +12:00
|
|
|
not app_name and self.settings.value(*options.discord_rpc_mode) == 0
|
2021-12-24 22:09:50 +13:00
|
|
|
):
|
2021-04-13 07:55:08 +12:00
|
|
|
self.remove_rpc()
|
|
|
|
return
|
|
|
|
title = None
|
|
|
|
if not app_name:
|
2024-05-21 01:03:47 +12:00
|
|
|
self.rpc.update(large_image="logo", details="https://github.com/RareDevs/Rare")
|
2021-04-13 07:55:08 +12:00
|
|
|
return
|
2024-05-20 23:36:43 +12:00
|
|
|
if self.settings.value(*options.discord_rpc_game):
|
2021-09-14 08:27:37 +12:00
|
|
|
try:
|
|
|
|
title = self.core.get_installed_game(app_name).title
|
|
|
|
except AttributeError:
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.error(f"Could not get title of game: {app_name}")
|
2021-09-14 08:27:37 +12:00
|
|
|
title = app_name
|
2021-04-13 07:55:08 +12:00
|
|
|
start = None
|
2024-05-20 23:36:43 +12:00
|
|
|
if self.settings.value(*options.discord_rpc_time):
|
2021-04-13 07:55:08 +12:00
|
|
|
start = str(time.time()).split(".")[0]
|
|
|
|
os = None
|
2024-05-20 23:36:43 +12:00
|
|
|
if self.settings.value(*options.discord_rpc_os):
|
2022-02-02 10:29:34 +13:00
|
|
|
os = f"via Rare on {platform.system()}"
|
2021-04-13 07:55:08 +12:00
|
|
|
|
2024-05-21 01:03:47 +12:00
|
|
|
self.rpc.update(large_image="logo", details=title, large_text=title, state=os, start=start)
|
2021-04-13 07:55:08 +12:00
|
|
|
self.state = 0
|