#!/usr/bin/env python3 """Pet management commands module for PetBot""" from .base_module import BaseModule class PetManagement(BaseModule): """Handles team, pets, and future pet management commands""" def get_commands(self): return ["team", "pets", "activate", "deactivate", "nickname"] async def handle_command(self, channel, nickname, command, args): if command == "team": await self.cmd_team(channel, nickname) elif command == "pets": await self.cmd_pets(channel, nickname) elif command == "activate": await self.cmd_activate(channel, nickname, args) elif command == "deactivate": await self.cmd_deactivate(channel, nickname, args) elif command == "nickname": await self.cmd_nickname(channel, nickname, args) async def cmd_team(self, channel, nickname): """Show active pets (channel display)""" player = await self.require_player(channel, nickname) if not player: return pets = await self.database.get_player_pets(player["id"], active_only=False) if not pets: self.send_message(channel, f"{nickname}: You don't have any pets! Use !catch to find some.") return # Show active pets first, then others active_pets = [pet for pet in pets if pet.get("is_active")] inactive_pets = [pet for pet in pets if not pet.get("is_active")] team_info = [] # Active pets with star and team position for pet in active_pets: name = pet["nickname"] or pet["species_name"] # Calculate EXP progress current_exp = pet.get("experience", 0) next_level_exp = self.database.calculate_exp_for_level(pet["level"] + 1) current_level_exp = self.database.calculate_exp_for_level(pet["level"]) exp_needed = next_level_exp - current_exp if pet["level"] >= 100: exp_display = "MAX" else: exp_display = f"{exp_needed} to next" # Show team position position = pet.get("team_order", "?") team_info.append(f"[{position}]⭐{name} (Lv.{pet['level']}) - {pet['hp']}/{pet['max_hp']} HP | EXP: {exp_display}") # Inactive pets for pet in inactive_pets[:5]: # Show max 5 inactive name = pet["nickname"] or pet["species_name"] team_info.append(f"{name} (Lv.{pet['level']}) - {pet['hp']}/{pet['max_hp']} HP") if len(inactive_pets) > 5: team_info.append(f"... and {len(inactive_pets) - 5} more in storage") self.send_message(channel, f"🐾 {nickname}'s team: " + " | ".join(team_info)) self.send_message(channel, f"🌐 View detailed pet collection at: http://petz.rdx4.com/player/{nickname}#pets") async def cmd_pets(self, channel, nickname): """Show link to pet collection web page""" player = await self.require_player(channel, nickname) if not player: return # Send URL to player's profile page instead of PM spam self.send_message(channel, f"{nickname}: View your complete pet collection at: http://petz.rdx4.com/player/{nickname}#pets") async def cmd_activate(self, channel, nickname, args): """Activate a pet for battle (PM only)""" # Redirect to PM for privacy if not args: self.send_pm(nickname, "Usage: !activate ") self.send_message(channel, f"{nickname}: Pet activation instructions sent via PM!") return player = await self.require_player(channel, nickname) if not player: return pet_name = " ".join(self.normalize_input(args)) result = await self.database.activate_pet(player["id"], pet_name) if result["success"]: pet = result["pet"] display_name = pet["nickname"] or pet["species_name"] position = result.get("team_position", "?") self.send_pm(nickname, f"✅ {display_name} is now active for battle! Team position: {position}") self.send_message(channel, f"{nickname}: Pet activated successfully!") else: self.send_pm(nickname, f"❌ {result['error']}") self.send_message(channel, f"{nickname}: Pet activation failed - check PM for details!") async def cmd_deactivate(self, channel, nickname, args): """Deactivate a pet to storage (PM only)""" # Redirect to PM for privacy if not args: self.send_pm(nickname, "Usage: !deactivate ") self.send_message(channel, f"{nickname}: Pet deactivation instructions sent via PM!") return player = await self.require_player(channel, nickname) if not player: return pet_name = " ".join(self.normalize_input(args)) result = await self.database.deactivate_pet(player["id"], pet_name) if result["success"]: pet = result["pet"] display_name = pet["nickname"] or pet["species_name"] self.send_pm(nickname, f"📦 {display_name} moved to storage!") self.send_message(channel, f"{nickname}: Pet deactivated successfully!") else: self.send_pm(nickname, f"❌ {result['error']}") self.send_message(channel, f"{nickname}: Pet deactivation failed - check PM for details!") async def cmd_nickname(self, channel, nickname, args): """Set a nickname for a pet""" if len(args) < 2: self.send_message(channel, f"{nickname}: Usage: !nickname ") self.send_message(channel, f"Example: !nickname Charmander Flamey") return player = await self.require_player(channel, nickname) if not player: return # Split args into pet identifier and new nickname pet_identifier = self.normalize_input(args[0]) new_nickname = " ".join(args[1:]) result = await self.database.set_pet_nickname(player["id"], pet_identifier, new_nickname) if result["success"]: old_name = result["old_name"] new_name = result["new_nickname"] self.send_message(channel, f"✨ {nickname}: {old_name} is now nicknamed '{new_name}'!") else: self.send_message(channel, f"❌ {nickname}: {result['error']}")