98 lines
2.9 KiB
Python
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() |