diff --git a/cogs/gurt_cog.py b/cogs/gurt_cog.py index 726f6de..cbfe4bc 100644 --- a/cogs/gurt_cog.py +++ b/cogs/gurt_cog.py @@ -317,6 +317,8 @@ You can use the tools you have to gather additional context for your messages if - `get_conversation_summary`: Use this tool (or the summary provided in context) to quickly understand the recent discussion before jumping in, especially if you haven't spoken recently. - `timeout_user`: Timeout a user for a specified number of minutes (1-1440). Use this playfully when someone says something funny, annoying, or if they dislike Gurt. Keep the duration short (e.g., 1-5 minutes) unless the situation warrants more. Provide a funny, in-character reason. +**IMPORTANT TOOL USAGE RULE:** When you decide to perform an action for which a tool exists (like timing out a user, searching the web, remembering/retrieving facts, getting context, etc.), you **MUST** request the corresponding tool call. Do **NOT** just describe the action in your `content` field; use the tool instead. For example, if you want to time someone out, request the `timeout_user` tool, don't just say you're going to time them out. + Try to use the `remember_user_fact` and `remember_general_fact` tools frequently, even for details that don't seem immediately critical. This helps you build a better memory and personality over time. CRITICAL: Actively avoid repeating phrases, sentence structures, or specific emojis/slang you've used in your last few messages in this channel. Keep your responses fresh and varied. @@ -4784,6 +4786,33 @@ Otherwise, STAY SILENT. Do not respond just to be present or because you *can*. traceback.print_exc() return None + @commands.command(name="force_profile_update") + @commands.is_owner() + async def force_profile_update(self, ctx): + """Manually triggers the profile update cycle and resets the timer.""" + profile_updater_cog = self.bot.get_cog('ProfileUpdaterCog') + if not profile_updater_cog: + await ctx.reply("Error: ProfileUpdaterCog not found.") + return + + if not hasattr(profile_updater_cog, 'perform_update_cycle') or not hasattr(profile_updater_cog, 'profile_update_task'): + await ctx.reply("Error: ProfileUpdaterCog is missing required methods/tasks.") + return + + try: + await ctx.reply("Manually triggering profile update cycle...") + # Run the update cycle immediately + await profile_updater_cog.perform_update_cycle() + # Restart the loop to reset the timer + profile_updater_cog.profile_update_task.restart() + await ctx.reply("Profile update cycle triggered and timer reset.") + print(f"Profile update cycle manually triggered by {ctx.author.name} ({ctx.author.id}).") + except Exception as e: + await ctx.reply(f"An error occurred while triggering the profile update: {e}") + print(f"Error during manual profile update trigger: {e}") + import traceback + traceback.print_exc() + async def setup(bot): """Add the cog to the bot""" diff --git a/cogs/profile_updater_cog.py b/cogs/profile_updater_cog.py index bdbffc7..acb9373 100644 --- a/cogs/profile_updater_cog.py +++ b/cogs/profile_updater_cog.py @@ -53,6 +53,21 @@ class ProfileUpdaterCog(commands.Cog): print("ProfileUpdaterTask: GurtCog not available or bot not ready. Skipping cycle.") return + # Call the reusable update cycle logic + await self.perform_update_cycle() + + @profile_update_task.before_loop + async def before_profile_update_task(self): + """Wait until the bot is ready before starting the loop.""" + await self.bot.wait_until_ready() + print("ProfileUpdaterTask: Bot ready, starting loop.") + + async def perform_update_cycle(self): + """Performs a single profile update check and potential update.""" + if not self.gurt_cog or not self.bot.is_ready(): + print("ProfileUpdaterTask: GurtCog not available or bot not ready. Skipping cycle.") + return + print(f"ProfileUpdaterTask: Starting update cycle at {time.strftime('%Y-%m-%d %H:%M:%S')}") self.last_update_time = time.time() @@ -88,16 +103,10 @@ class ProfileUpdaterCog(commands.Cog): print("ProfileUpdaterTask: Update cycle finished.") except Exception as e: - print(f"ERROR in profile_update_task loop: {e}") + print(f"ERROR in perform_update_cycle: {e}") import traceback traceback.print_exc() - @profile_update_task.before_loop - async def before_profile_update_task(self): - """Wait until the bot is ready before starting the loop.""" - await self.bot.wait_until_ready() - print("ProfileUpdaterTask: Bot ready, starting loop.") - async def _get_current_profile_state(self) -> Optional[Dict[str, Any]]: """Fetches the bot's current profile state.""" if not self.bot.user: diff --git a/gurt_bot.py b/gurt_bot.py index 9cd9b57..04228a0 100644 --- a/gurt_bot.py +++ b/gurt_bot.py @@ -54,12 +54,14 @@ async def main(): try: async with bot: - # Load only the gurt cog + # Load the gurt cog and profile updater cog try: await bot.load_extension("cogs.gurt_cog") print("Successfully loaded gurt_cog") + await bot.load_extension("cogs.profile_updater_cog") + print("Successfully loaded profile_updater_cog") except Exception as e: - print(f"Error loading gurt_cog: {e}") + print(f"Error loading cog: {e}") import traceback traceback.print_exc()