Implement pet nicknames system - database, IRC command, validation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
megaproxy 2025-07-14 16:57:41 +01:00
parent 4de0c1a124
commit 3098be7f36
3 changed files with 101 additions and 2 deletions

View file

@ -1316,4 +1316,46 @@ class Database:
"total_encounters": total_encounters,
"total_species": total_species,
"completion_percentage": round(completion_percentage, 1)
}
async def set_pet_nickname(self, player_id: int, pet_identifier: str, nickname: str) -> Dict:
"""Set a nickname for a pet. Returns result dict."""
# Validate nickname
if not nickname.strip():
return {"success": False, "error": "Nickname cannot be empty"}
nickname = nickname.strip()
if len(nickname) > 20:
return {"success": False, "error": "Nickname must be 20 characters or less"}
# Basic content validation
if any(char in nickname for char in ['<', '>', '&', '"', "'"]):
return {"success": False, "error": "Nickname contains invalid characters"}
async with aiosqlite.connect(self.db_path) as db:
db.row_factory = aiosqlite.Row
# Find pet by current nickname or species name
cursor = await db.execute("""
SELECT p.*, ps.name as species_name
FROM pets p
JOIN pet_species ps ON p.species_id = ps.id
WHERE p.player_id = ?
AND (p.nickname = ? OR ps.name = ?)
LIMIT 1
""", (player_id, pet_identifier, pet_identifier))
pet = await cursor.fetchone()
if not pet:
return {"success": False, "error": f"Pet '{pet_identifier}' not found"}
# Update nickname
await db.execute("UPDATE pets SET nickname = ? WHERE id = ?", (nickname, pet["id"]))
await db.commit()
return {
"success": True,
"pet": dict(pet),
"old_name": pet["nickname"] or pet["species_name"],
"new_nickname": nickname
}