From 231d74efa0402380a4c19ed40ddf0358b6ea521a Mon Sep 17 00:00:00 2001
From: Storm Dragon <stormdragon2976@gmail.com>
Date: Fri, 4 Apr 2025 14:32:03 -0400
Subject: [PATCH] Try to fix repeating welcome message.

---
 src/cthulhu/plugins/HelloCthulhu/plugin.py | 49 +++++++++++++++++-----
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/src/cthulhu/plugins/HelloCthulhu/plugin.py b/src/cthulhu/plugins/HelloCthulhu/plugin.py
index de54907..a790757 100644
--- a/src/cthulhu/plugins/HelloCthulhu/plugin.py
+++ b/src/cthulhu/plugins/HelloCthulhu/plugin.py
@@ -21,10 +21,15 @@
 """Hello Cthulhu plugin for Cthulhu."""
 
 import logging
+import weakref
 from cthulhu.plugin import Plugin, cthulhu_hookimpl
 
 logger = logging.getLogger(__name__)
 
+# Class-level variable to track if the greeting has been presented
+# This ensures the greeting is only shown once even if multiple instances exist
+_greeting_shown = False
+
 class HelloCthulhu(Plugin):
     """Plugin that speaks a welcome message when Cthulhu starts up."""
     
@@ -33,6 +38,7 @@ class HelloCthulhu(Plugin):
         super().__init__(*args, **kwargs)
         logger.info("HelloCthulhu plugin initialized")
         self._signal_handler_id = None
+        self._is_connected = False
         
     @cthulhu_hookimpl
     def activate(self, plugin=None):
@@ -43,13 +49,16 @@ class HelloCthulhu(Plugin):
             
         logger.info("Activating HelloCthulhu plugin")
         try:
-            # Connect to the start-application-completed signal
-            signal_manager = self.app.getSignalManager()
-            self._signal_handler_id = signal_manager.connectSignal(
-                "start-application-completed",
-                self.process,
-                "default"  # Add profile parameter
-            )
+            # Only connect the signal if we haven't already
+            if not self._is_connected:
+                signal_manager = self.app.getSignalManager()
+                self._signal_handler_id = signal_manager.connectSignal(
+                    "start-application-completed",
+                    self.process,
+                    "default"  # Add profile parameter
+                )
+                self._is_connected = True
+                logger.debug("Connected to start-application-completed signal")
         except Exception as e:
             logger.error(f"Error activating HelloCthulhu plugin: {e}")
             
@@ -62,23 +71,43 @@ class HelloCthulhu(Plugin):
             
         logger.info("Deactivating HelloCthulhu plugin")
         try:
-            # Disconnect signal if we have an ID
-            if self._signal_handler_id is not None:
+            # Only disconnect if we're connected
+            if self._is_connected and self._signal_handler_id is not None:
                 signal_manager = self.app.getSignalManager()
-                # Use disconnectSignalByFunction instead since disconnectSignal doesn't exist
                 signal_manager.disconnectSignalByFunction(
                     self.process
                 )
                 self._signal_handler_id = None
+                self._is_connected = False
+                logger.debug("Disconnected from start-application-completed signal")
         except Exception as e:
             logger.error(f"Error deactivating HelloCthulhu plugin: {e}")
             
     def process(self, app):
         """Process the start-application-completed signal."""
+        global _greeting_shown
+        
+        # Only present the message if it hasn't been shown yet
+        if _greeting_shown:
+            logger.debug("Greeting already shown, skipping")
+            return
+            
         try:
             messages = app.getDynamicApiManager().getAPI('Messages')
             state = app.getDynamicApiManager().getAPI('CthulhuState')
             if state.activeScript:
                 state.activeScript.presentMessage(messages.START_CTHULHU, resetStyles=False)
+                _greeting_shown = True
+                logger.info("Greeting message presented")
+                
+                # Disconnect the signal after presenting the message
+                if self._is_connected and self._signal_handler_id is not None:
+                    signal_manager = app.getSignalManager()
+                    signal_manager.disconnectSignalByFunction(
+                        self.process
+                    )
+                    self._signal_handler_id = None
+                    self._is_connected = False
+                    logger.debug("Disconnected signal after presenting greeting")
         except Exception as e:
             logger.error(f"Error in HelloCthulhu process: {e}")