# -*- coding: utf-8 -*-
import json
import os
import re
from datetime import datetime
class InfoBot:
def __init__(self, nombre="InfoBot"):
self.nombre = nombre
self.base_conocimiento = {}
self.archivo_db = "bot_database.json"
self.cargar_base_conocimiento()
def cargar_base_conocimiento(self):
"""Carga la base de conocimiento desde un archivo si existe."""
if os.path.exists(self.archivo_db):
try:
with open(self.archivo_db, 'r', encoding='utf-8') as archivo:
self.base_conocimiento = json.load(archivo)
print(f"Base de conocimiento cargada. {len(self.base_conocimiento)} entradas
disponibles.")
except Exception as e:
print(f"Error al cargar la base de conocimiento: {e}")
else:
print("No se encontró base de conocimiento. Se creará una nueva.")
def guardar_base_conocimiento(self):
"""Guarda la base de conocimiento en un archivo."""
try:
with open(self.archivo_db, 'w', encoding='utf-8') as archivo:
json.dump(self.base_conocimiento, archivo, ensure_ascii=False, indent=2)
print("Base de conocimiento guardada correctamente.")
except Exception as e:
print(f"Error al guardar la base de conocimiento: {e}")
def agregar_informacion(self, categoria, clave, valor):
"""
Agrega información a la base de conocimiento.
Args:
categoria: La categoría bajo la cual almacenar la información
clave: La clave o identificador de la información
valor: El valor o información a almacenar
"""
if categoria not in self.base_conocimiento:
self.base_conocimiento[categoria] = {}
self.base_conocimiento[categoria][clave] = {
"valor": valor,
"fecha_agregado": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.guardar_base_conocimiento()
return f"Información agregada en {categoria}: {clave}"
def buscar_informacion(self, consulta):
"""
Busca información en la base de conocimiento.
Args:
consulta: Texto a buscar
Returns:
Lista de resultados que coinciden con la consulta
"""
resultados = []
consulta = consulta.lower()
for categoria, datos in self.base_conocimiento.items():
for clave, info in datos.items():
texto_busqueda = f"{categoria} {clave} {info['valor']}".lower()
if consulta in texto_busqueda:
resultados.append({
"categoria": categoria,
"clave": clave,
"valor": info['valor'],
"fecha": info.get('fecha_agregado', "Desconocida")
})
return resultados
def obtener_por_categoria(self, categoria):
"""Devuelve toda la información de una categoría específica."""
if categoria in self.base_conocimiento:
return self.base_conocimiento[categoria]
return {}
def eliminar_informacion(self, categoria, clave):
"""Elimina una entrada específica de la base de conocimiento."""
if categoria in self.base_conocimiento and clave in
self.base_conocimiento[categoria]:
del self.base_conocimiento[categoria][clave]
if not self.base_conocimiento[categoria]: # Si la categoría queda vacía
del self.base_conocimiento[categoria]
self.guardar_base_conocimiento()
return f"Información eliminada: {categoria} - {clave}"
return f"No se encontró la información: {categoria} - {clave}"
def listar_categorias(self):
"""Devuelve la lista de categorías disponibles."""
return list(self.base_conocimiento.keys())
def procesar_comando(self, comando):
"""
Procesa comandos de texto para interactuar con el bot.
Comandos:
- agregar [categoria] [clave]: [valor]
- buscar [consulta]
- listar categorias
- mostrar [categoria]
- eliminar [categoria] [clave]
- ayuda
"""
if comando.lower().startswith("agregar "):
# Formato: agregar categoria clave: valor
patron = r"agregar\s+(\w+)\s+([^:]+):\s*(.*)"
match = re.match(patron, comando, re.IGNORECASE)
if match:
categoria, clave, valor = match.groups()
return self.agregar_informacion(categoria.strip(), clave.strip(), valor.strip())
else:
return "Formato incorrecto. Usa: agregar categoria clave: valor"
elif comando.lower().startswith("buscar "):
consulta = comando[7:].strip()
resultados = self.buscar_informacion(consulta)
if resultados:
respuesta = f"Encontré {len(resultados)} resultados:\n"
for i, res in enumerate(resultados, 1):
respuesta += f"{i}. {res['categoria']} - {res['clave']}: {res['valor']}\n"
return respuesta
else:
return "No encontré información que coincida con tu búsqueda."
elif comando.lower() == "listar categorias":
categorias = self.listar_categorias()
if categorias:
return "Categorías disponibles:\n" + "\n".join(categorias)
else:
return "No hay categorías disponibles."
elif comando.lower().startswith("mostrar "):
categoria = comando[8:].strip()
datos = self.obtener_por_categoria(categoria)
if datos:
respuesta = f"Información en la categoría '{categoria}':\n"
for clave, info in datos.items():
respuesta += f"- {clave}: {info['valor']}\n"
return respuesta
else:
return f"No hay información en la categoría '{categoria}' o no existe."
elif comando.lower().startswith("eliminar "):
# Formato: eliminar categoria clave
partes = comando[9:].strip().split(maxsplit=1)
if len(partes) == 2:
categoria, clave = partes
return self.eliminar_informacion(categoria, clave)
else:
return "Formato incorrecto. Usa: eliminar categoria clave"
elif comando.lower() == "ayuda":
return """
Comandos disponibles:
- agregar [categoria] [clave]: [valor] - Agrega nueva información
- buscar [consulta] - Busca información en todas las categorías
- listar categorias - Muestra todas las categorías disponibles
- mostrar [categoria] - Muestra toda la información de una categoría
- eliminar [categoria] [clave] - Elimina una entrada específica
- ayuda - Muestra esta ayuda
"""
else:
return "Comando no reconocido. Escribe 'ayuda' para ver los comandos
disponibles."
def iniciar_bot():
print("=" * 50)
print("Iniciando InfoBot - Tu asistente de información personal")
print("=" * 50)
nombre_bot = input("¿Cómo quieres llamar a tu bot? (Enter para usar 'InfoBot'): ")
if not nombre_bot:
nombre_bot = "InfoBot"
bot = InfoBot(nombre_bot)
print(f"\n¡{nombre_bot} está listo para ayudarte!")
print("Escribe 'ayuda' para ver los comandos disponibles o 'salir' para terminar.")
while True:
comando = input(f"\n{nombre_bot}> ")
if comando.lower() == "salir":
print(f"¡Hasta pronto! {nombre_bot} ha guardado tu información.")
break
respuesta = bot.procesar_comando(comando)
print(respuesta)
if __name__ == "__main__":
iniciar_bot()