From e2fb2d8cf73d4298b47077fac9a79e86d01e5aaa Mon Sep 17 00:00:00 2001 From: agessaman Date: Sat, 8 Nov 2025 08:23:11 -0800 Subject: [PATCH] fixed situation where 0 free prefixes was being interpreted as an error instead of data --- modules/commands/prefix_command.py | 43 +++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/modules/commands/prefix_command.py b/modules/commands/prefix_command.py index 98822e9..b2f8b53 100644 --- a/modules/commands/prefix_command.py +++ b/modules/commands/prefix_command.py @@ -92,11 +92,11 @@ class PrefixCommand(BaseCommand): # Handle free/available command if command == "FREE" or command == "AVAILABLE": - free_prefixes, total_free = await self.get_free_prefixes() - if free_prefixes: - response = self.format_free_prefixes_response(free_prefixes, total_free) - else: + free_prefixes, total_free, has_data = await self.get_free_prefixes() + if not has_data: response = "❌ Unable to determine free prefixes. Try 'prefix refresh' first." + else: + response = self.format_free_prefixes_response(free_prefixes, total_free) return await self.send_response(message, response) # Check for "all" modifier @@ -404,11 +404,19 @@ class PrefixCommand(BaseCommand): self.logger.error(f"Error querying database for prefix '{prefix}': {e}") return None - async def get_free_prefixes(self) -> Tuple[List[str], int]: - """Get list of available (unused) prefixes and total count""" + async def get_free_prefixes(self) -> Tuple[List[str], int, bool]: + """Get list of available (unused) prefixes and total count + + Returns: + Tuple of (selected_prefixes, total_free, has_data) + - selected_prefixes: List of up to 10 randomly selected free prefixes + - total_free: Total number of free prefixes + - has_data: True if we have valid data (from cache or database), False otherwise + """ try: # Get all used prefixes from both API cache and database used_prefixes = set() + has_data = False # Always try to refresh cache if it's empty or stale current_time = time.time() @@ -417,12 +425,14 @@ class PrefixCommand(BaseCommand): await self.refresh_cache() # Add prefixes from API cache - for prefix in self.cache_data.keys(): - used_prefixes.add(prefix.upper()) - - self.logger.info(f"Found {len(used_prefixes)} used prefixes from API cache") + if self.cache_data: + for prefix in self.cache_data.keys(): + used_prefixes.add(prefix.upper()) + has_data = True + self.logger.info(f"Found {len(used_prefixes)} used prefixes from API cache") # Add prefixes from database (filtered by prefix_free_days) + db_prefixes_found = False try: query = f''' SELECT DISTINCT SUBSTR(public_key, 1, 2) as prefix @@ -436,9 +446,18 @@ class PrefixCommand(BaseCommand): prefix = row['prefix'].upper() if len(prefix) == 2: used_prefixes.add(prefix) + db_prefixes_found = True + if db_prefixes_found: + has_data = True + self.logger.info(f"Found additional prefixes from database") except Exception as e: self.logger.warning(f"Error getting prefixes from database: {e}") + # If we don't have any data from either source, return early + if not has_data: + self.logger.warning("No data available for free prefixes lookup (empty cache and database)") + return [], 0, False + # Generate all valid hex prefixes (01-FE, excluding 00 and FF) all_prefixes = [] for i in range(1, 255): # 1 to 254 (exclude 0 and 255) @@ -460,11 +479,11 @@ class PrefixCommand(BaseCommand): else: selected_prefixes = random.sample(free_prefixes, 10) - return selected_prefixes, total_free + return selected_prefixes, total_free, True except Exception as e: self.logger.error(f"Error getting free prefixes: {e}") - return [], 0 + return [], 0, False def format_free_prefixes_response(self, free_prefixes: List[str], total_free: int) -> str: """Format the free prefixes response"""