diff --git a/bot/bot.py b/bot/bot.py index 462f569..871fbdb 100644 --- a/bot/bot.py +++ b/bot/bot.py @@ -38,6 +38,8 @@ CACHE_FILE = "/app/user_cache.pkl" intents = discord.Intents.default() intents.message_content = True +intents.presences = True +intents.members = True client = discord.Client(intents=intents) @@ -582,14 +584,21 @@ async def beforeBackgroundLoop(): async def update_presence_tracking(): """Track Discord presence for users with presence tracking enabled.""" + print(f"[DEBUG] update_presence_tracking() called", flush=True) try: import core.adaptive_meds as adaptive_meds import core.postgres as postgres + print(f"[DEBUG] Running presence tracking. Guilds: {len(client.guilds)}", flush=True) + for guild in client.guilds: + print(f"[DEBUG] Guild: {guild.name} ({guild.id}) - Members: {guild.member_count}") + # Get all users with presence tracking enabled settings = postgres.select( "adaptive_med_settings", {"presence_tracking_enabled": True} ) + + print(f"[DEBUG] Found {len(settings)} users with presence tracking enabled") for setting in settings: user_uuid = setting.get("user_uuid") @@ -600,21 +609,35 @@ async def update_presence_tracking(): continue discord_user_id = notif_settings[0].get("discord_user_id") + print(f"[DEBUG] Looking for Discord user: {discord_user_id}", flush=True) if not discord_user_id: + print(f"[DEBUG] No Discord ID for user {user_uuid}", flush=True) continue - # Get the user from Discord + # Get the member from a shared guild (needed for presence data) try: - discord_user = await client.fetch_user(int(discord_user_id)) - if not discord_user: + member = None + target_id = int(discord_user_id) + + # Search through all guilds the bot is in + for guild in client.guilds: + member = guild.get_member(target_id) + print(f"[DEBUG] Checked guild {guild.name}, member: {member}", flush=True) + if member: + break + + if not member: + print(f"[DEBUG] User {discord_user_id} not found in any shared guild", flush=True) continue # Check if user is online - is_online = discord_user.status != discord.Status.offline + is_online = member.status != discord.Status.offline + print(f"[DEBUG] User status: {member.status}, is_online: {is_online}", flush=True) # Get current presence from DB presence = adaptive_meds.get_user_presence(user_uuid) was_online = presence.get("is_currently_online") if presence else False + print(f"[DEBUG] Previous state: {was_online}, Current: {is_online}", flush=True) # Update presence if changed if is_online != was_online: @@ -644,7 +667,12 @@ async def update_presence_tracking(): @tasks.loop(seconds=30) async def presenceTrackingLoop(): """Track Discord presence every 30 seconds.""" - await update_presence_tracking() + try: + await update_presence_tracking() + except Exception as e: + print(f"[ERROR] presenceTrackingLoop failed: {e}", flush=True) + import traceback + traceback.print_exc() @presenceTrackingLoop.before_loop @@ -711,10 +739,12 @@ async def beforeSnitchCheckLoop(): @client.event async def on_ready(): - print(f"Bot logged in as {client.user}") + print(f"Bot logged in as {client.user}", flush=True) + print(f"Connected to {len(client.guilds)} guilds", flush=True) loadCache() backgroundLoop.start() presenceTrackingLoop.start() + print(f"[DEBUG] Presence tracking loop started", flush=True) snitchCheckLoop.start() diff --git a/config/.env b/config/.env index eaf254d..f356b5e 100644 --- a/config/.env +++ b/config/.env @@ -1,4 +1,4 @@ -DISCORD_BOT_TOKEN=MTQ2NzYwMTc2ODM0NjE2MTE3Mw.G7BKQ-.kivCRj7mOl6aS5VyX4RW9hirqzm7qJ8nJOVMpE +DISCORD_BOT_TOKEN=MTQ3MDY0MjgyMDI1MDQ3MjYyMQ.Gczvus.1WuWxd72NDoLFC7BCjAixnMo5eS8wenqTIZ54I API_URL=http://app:5000 DB_HOST=db DB_PORT=5432 @@ -6,7 +6,7 @@ DB_NAME=app DB_USER=app DB_PASS=y8Khu7pJQZq6ywFDIJiqpx4zYmclHGHw JWT_SECRET=bf773b4562221bef4d304ae5752a68931382ea3e98fe38394a098f73e0c776e1 -OPENROUTER_API_KEY=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 +OPENROUTER_API_KEY=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 OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 AI_CONFIG_PATH=/app/ai/ai_config.json diff --git a/core/__pycache__/postgres.cpython-312.pyc b/core/__pycache__/postgres.cpython-312.pyc index afa7498..62bfd84 100644 Binary files a/core/__pycache__/postgres.cpython-312.pyc and b/core/__pycache__/postgres.cpython-312.pyc differ diff --git a/scheduler/__pycache__/daemon.cpython-312.pyc b/scheduler/__pycache__/daemon.cpython-312.pyc index e44803e..56b152f 100644 Binary files a/scheduler/__pycache__/daemon.cpython-312.pyc and b/scheduler/__pycache__/daemon.cpython-312.pyc differ diff --git a/synculous-client/src/app/dashboard/settings/page.tsx b/synculous-client/src/app/dashboard/settings/page.tsx index 338afad..5ce5010 100644 --- a/synculous-client/src/app/dashboard/settings/page.tsx +++ b/synculous-client/src/app/dashboard/settings/page.tsx @@ -127,6 +127,17 @@ export default function SettingsPage() { .finally(() => setIsLoading(false)); }, []); + // Poll for presence updates every 10 seconds + useEffect(() => { + if (!notif.discord_enabled || !adaptiveMeds.presence_tracking_enabled) return; + + const interval = setInterval(() => { + api.adaptiveMeds.getPresence().then((data: PresenceStatus) => setPresence(data)); + }, 10000); + + return () => clearInterval(interval); + }, [notif.discord_enabled, adaptiveMeds.presence_tracking_enabled]); + const flashSaved = () => { setSaved(true); setTimeout(() => setSaved(false), 1500);