import discord import asyncio import threading from dotenv import load_dotenv import os from model.trainer import train_on_message from model.brain import generate_response, daydream from model.cleanup import full_cleanup from model.dream_replay import replay_dreams from model.rehearsal import simulate_conversation from model.scheduler import set_next_action from model.reweaver import memory_reweaver_loop from reader.reader import read_books_forever from dashboard.dashboard import run_dashboard load_dotenv() TOKEN = os.getenv("DISCORD_TOKEN") intents = discord.Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) empty_response_counter = 0 @client.event async def on_ready(): print(f"Ruby is online as {client.user}.") @client.event async def on_message(message): global empty_response_counter if message.author == client.user: return if not message.content.strip(): return train_on_message(message.content, source="user") response = generate_response() if not response.strip(): empty_response_counter += 1 if empty_response_counter % 10 == 0: # only every 10 failures print(f"[Brain] Skipped {empty_response_counter} empty replies so far.") return empty_response_counter = 0 # reset counter when Ruby replies await message.channel.send(response) async def background_cleanup_loop(): while True: full_cleanup() set_next_action(300, "Cleaning up") await asyncio.sleep(300) # 5 minutes async def dream_replay_loop(): while True: replay_dreams() set_next_action(90, "Dreaming new dreams") await asyncio.sleep(90) # Replay every 15 minutes daydream() async def rehearsal_loop(): while True: simulate_conversation() set_next_action(120, "Practicing Conversations") await asyncio.sleep(120) # Every 20 minutes # Start Ruby's Brain Loops in a separate thread def start_brain_loops(): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.create_task(read_books_forever()) loop.create_task(dream_replay_loop()) loop.create_task(background_cleanup_loop()) loop.create_task(rehearsal_loop()) loop.create_task(memory_reweaver_loop()) loop.run_forever() threading.Thread(target=run_dashboard, daemon=True).start() threading.Thread(target=start_brain_loops, daemon=True).start() # Launch Discord bot (blocking) client.run(TOKEN)