1616from discord .ext import commands
1717from loguru import logger
1818
19- from tux .core .interfaces import IBotService , IConfigService , ILoggerService
19+ from tux .core .interfaces import IBotService , ILoggerService
20+ from tux .database .controllers import DatabaseCoordinator
2021from tux .database .service import DatabaseService
22+ from tux .shared .config import CONFIG
2123from tux .shared .functions import generate_usage as _generate_usage_shared
2224
2325if TYPE_CHECKING :
@@ -51,9 +53,9 @@ def __init__(self, bot: Tux) -> None:
5153 # Initialize service properties first
5254 self .db_service : DatabaseService | None = None
5355 self .bot_service : IBotService | None = None
54- self . config_service : IConfigService | None = None
56+
5557 self .logger_service : ILoggerService | None = None
56- self ._db_controller = None # legacy attribute removed; kept for type stability only
58+ self ._db_coordinator : DatabaseCoordinator | None = None # Database coordinator for accessing controllers
5759
5860 # Get the bot instance
5961 self .bot = bot
@@ -79,24 +81,25 @@ def _inject_services(self) -> None:
7981 # Inject services in order of dependency
8082 self ._inject_database_service ()
8183 self ._inject_bot_service ()
82- self . _inject_config_service ()
84+
8385 self ._inject_logger_service ()
8486
8587 # Single summary log for this cog's injection results
8688 logger .debug (
8789 f"[BaseCog] Injected services for { self .__class__ .__name__ } "
8890 f"(db={ self .db_service is not None } , "
8991 f"bot={ self .bot_service is not None } , "
90- f"config={ self .config_service is not None } , "
9192 f"logger={ self .logger_service is not None } )" ,
9293 )
9394
9495 def _inject_database_service (self ) -> None :
95- """Inject the database service."""
96+ """Inject the database service and create database coordinator ."""
9697 try :
9798 self .db_service = self ._container .get_optional (DatabaseService )
9899 if self .db_service :
99- logger .trace (f"Injected database service into { self .__class__ .__name__ } " )
100+ # Create the database coordinator for accessing controllers
101+ self ._db_coordinator = DatabaseCoordinator (self .db_service )
102+ logger .trace (f"Injected database service and coordinator into { self .__class__ .__name__ } " )
100103 else :
101104 logger .warning (f"Database service not available for { self .__class__ .__name__ } " )
102105 except Exception as e :
@@ -113,17 +116,6 @@ def _inject_bot_service(self) -> None:
113116 except Exception as e :
114117 logger .error (f"[BaseCog] Bot service injection failed for { self .__class__ .__name__ } : { e } " , exc_info = True )
115118
116- def _inject_config_service (self ) -> None :
117- """Inject the config service."""
118- try :
119- self .config_service = self ._container .get_optional (IConfigService )
120- if self .config_service :
121- logger .trace (f"Injected config service into { self .__class__ .__name__ } " )
122- else :
123- logger .warning (f"Config service not available for { self .__class__ .__name__ } " )
124- except Exception as e :
125- logger .error (f"Config service injection failed for { self .__class__ .__name__ } : { e } " )
126-
127119 def _inject_logger_service (self ) -> None :
128120 """Inject the logger service (optional)."""
129121 try :
@@ -190,36 +182,46 @@ def _generate_usage(self, command: commands.Command[Any, ..., Any]) -> str:
190182 # (Embed helpers and error handling intentionally omitted as requested.)
191183
192184 @property
193- def db (self ):
194- """Get the database controller from the injected database service .
185+ def db (self ) -> DatabaseCoordinator :
186+ """Get the database coordinator for accessing database controllers .
195187
196188 Returns:
197- The database controller instance
189+ The database coordinator instance
198190
199191 Raises:
200- RuntimeError: If the database service is not available
192+ RuntimeError: If the database coordinator is not available
201193 """
202- if self .db_service is None :
203- error_msg = "Database service not injected . DI is required."
194+ if self ._db_coordinator is None :
195+ error_msg = "Database coordinator not available . DI is required."
204196 raise RuntimeError (error_msg )
205- return self .db_service
197+ return self ._db_coordinator
206198
207199 def get_config (self , key : str , default : Any = None ) -> Any :
208- """Get a configuration value with service injection support .
200+ """Get a configuration value directly from CONFIG .
209201
210202 Args:
211203 key: The configuration key to retrieve
212204 default: Default value if key is not found
213205
214206 Returns:
215207 The configuration value or default
216-
217- This method uses the injected config service only.
218208 """
219- if self .config_service is None :
220- error_msg = "Config service not injected. DI is required."
221- raise RuntimeError (error_msg )
222- return self .config_service .get (key , default )
209+
210+ try :
211+ # Handle nested keys like "BOT_INFO.BOT_NAME"
212+ keys = key .split ("." )
213+ value = CONFIG
214+
215+ for k in keys :
216+ if hasattr (value , k ):
217+ value = getattr (value , k )
218+ else :
219+ return default
220+ except Exception as e :
221+ logger .error (f"Failed to get config value { key } : { e } " )
222+ return default
223+ else :
224+ return value
223225
224226 def get_bot_latency (self ) -> float :
225227 """Get the bot's latency with service injection support.
0 commit comments