Files
CLARA/core/discord_presence.py
2025-10-24 19:42:35 +02:00

98 lines
2.9 KiB
Python

import time
import threading
from discordrp import Presence
class DiscordPresence:
def __init__(self, client_id="1430908404095909960"):
self.client_id = client_id
self.presence = None
self.running = False
self.start_time = None
self._thread = None
self._stop_thread = threading.Event()
def start(self):
if self.running:
print("Presence is already running")
return
self.running = True
self._stop_thread.clear()
self._thread = threading.Thread(target=self._run_loop, daemon=True)
self._thread.start()
print("Discord presence manager started")
def _run_loop(self):
while not self._stop_thread.is_set():
try:
with Presence(self.client_id) as presence:
self.presence = presence
print("Successfully connected to Discord RPC.")
self.start_time = int(time.time())
self._set_initial_presence()
while not self._stop_thread.is_set():
time.sleep(15)
except Exception as e:
self.presence = None
print(f"Failed to connect to Discord RPC: {e}. Retrying in 30 seconds...")
for _ in range(30):
if self._stop_thread.is_set():
break
time.sleep(1)
self.presence = None
def _set_initial_presence(self):
if not self.presence:
return
try:
self.presence.set(
{
"assets": {
"large_image": "2ktanbig",
"large_text": "CLARA"
},
"buttons": [
{
"label": "Let CLARA help you!",
"url": "https://github.com/n0va-bot/CLARA"
}
]
}
)
except Exception as e:
print(f"Failed to set initial Discord presence: {e}")
def end(self):
if not self.running:
print("Presence is not running")
return
print("Stopping Discord presence...")
self._stop_thread.set()
if self._thread and self._thread.is_alive():
self._thread.join(timeout=1)
self.running = False
self.presence = None
print("Discord presence stopped")
def update(self, data):
if not self.running or not self.presence:
return
try:
self.presence.set(data)
except Exception as e:
print(f"Failed to update Discord presence: {e}")
def __del__(self):
if self.running:
self.end()
presence = DiscordPresence()