diff --git a/src/duckhuntbot.py b/src/duckhuntbot.py index d28922a..6867459 100644 --- a/src/duckhuntbot.py +++ b/src/duckhuntbot.py @@ -572,7 +572,12 @@ class DuckHuntBot: """Handle bot commands with enhanced error handling and input validation""" try: # Validate input parameters - if not isinstance(message, str) or not message.startswith('!'): + if not isinstance(message, str): + return + + # Some clients/users may prefix commands with whitespace (e.g. " !bang"). + message = message.lstrip() + if not message.startswith('!'): return if not isinstance(user, str) or not isinstance(channel, str): @@ -580,7 +585,7 @@ class DuckHuntBot: return # Sanitize inputs - safe_message = sanitize_user_input(message, max_length=500) + safe_message = sanitize_user_input(message, max_length=500).lstrip() safe_user = sanitize_user_input(user, max_length=200) safe_channel = sanitize_user_input(channel, max_length=100) diff --git a/src/game.py b/src/game.py index c902055..0dce28a 100644 --- a/src/game.py +++ b/src/game.py @@ -160,7 +160,8 @@ class DuckGame: # All duck types use the same spawn message - type is hidden! message = self.bot.messages.get('duck_spawn') - self.bot.send_message(channel, message) + if not self.bot.send_message(channel, message): + self.logger.warning(f"Failed to send duck spawn message to {channel}") async def force_spawn_duck(self, channel, duck_type): """Force spawn a specific duck type in a channel (admin/items), even if ducks already exist.""" @@ -184,7 +185,8 @@ class DuckGame: except Exception: pass - self.bot.send_message(channel, self.bot.messages.get('duck_spawn')) + if not self.bot.send_message(channel, self.bot.messages.get('duck_spawn')): + self.logger.warning(f"Failed to send forced duck spawn message to {channel}") def _choose_duck_type(self): """Choose a duck type using duck_types.*.chance (with legacy fallbacks)."""