hh-bot/hh_bot/cli/interface.py

116 lines
4.7 KiB
Python
Raw Normal View History

2025-06-27 09:57:34 +02:00
"""
🖥 Интерфейс командной строки для HH.ru автоматизации
"""
from ..core.job_application_manager import JobApplicationManager
from ..config.settings import settings, ResumeFileManager, UIFormatter
class CLIInterface:
"""Интерфейс командной строки"""
@staticmethod
def print_welcome():
"""Приветственное сообщение"""
print("🚀 HH.ru АВТОМАТИЗАЦИЯ v2.0")
print(UIFormatter.create_separator())
print("🏗️ Архитектурно правильная версия")
print("🤖 С поддержкой Gemini AI")
print("📄 Загрузка резюме из файлов")
print(UIFormatter.create_separator())
@staticmethod
def print_settings_info():
"""Информация о настройках"""
print("\n⚙️ ТЕКУЩИЕ НАСТРОЙКИ:")
print(f"🔍 Ключевые слова: {settings.hh_search.keywords}")
print(f"📊 Максимум заявок: {settings.application.max_applications}")
print(
f"🤖 Gemini AI: "
f"{'✅ Доступен' if settings.enable_ai_matching() else '❌ Недоступен'}"
)
print(f"🌐 Режим браузера: " f"{'Фоновый' if settings.browser.headless else 'Видимый'}")
@staticmethod
def get_user_preferences():
"""Получение предпочтений пользователя"""
print("\n🎯 НАСТРОЙКА ПОИСКА:")
keywords = input(f"Ключевые слова [{settings.hh_search.keywords}]: ").strip()
if not keywords:
keywords = settings.hh_search.keywords
use_ai = True
if settings.enable_ai_matching():
ai_choice = input("Использовать AI фильтрацию? [y/n]: ").lower()
use_ai = ai_choice != "n"
else:
print("⚠️ AI фильтрация недоступна (нет GEMINI_API_KEY)")
use_ai = False
max_apps_input = input(
f"Максимум заявок [{settings.application.max_applications}]: "
).strip()
try:
max_apps = (
int(max_apps_input) if max_apps_input else settings.application.max_applications
)
except ValueError:
max_apps = settings.application.max_applications
return keywords, use_ai, max_apps
@staticmethod
def print_final_stats(stats):
"""Вывод итоговой статистики"""
UIFormatter.print_section_header("📊 ИТОГОВАЯ СТАТИСТИКА:", long=True)
if "error" in stats:
print(f"❌ Ошибка: {stats['error']}")
else:
print(f"📝 Всего заявок: {stats['total_applications']}")
print(f"✅ Успешных: {stats['successful']}")
print(f"❌ Неудачных: {stats['failed']}")
if stats["successful"] > 0:
print(f"\n🎉 Отлично! Отправлено {stats['successful']} заявок!")
else:
print("\n😕 Заявки не были отправлены")
print(UIFormatter.create_separator(long=True))
@staticmethod
def run_application():
"""Главная функция запуска приложения"""
try:
cli = CLIInterface()
cli.print_welcome()
ResumeFileManager.create_sample_files()
cli.print_settings_info()
keywords, use_ai, max_apps = cli.get_user_preferences()
settings.update_search_keywords(keywords)
settings.application.max_applications = max_apps
print("\n🎯 ЗАПУСК С ПАРАМЕТРАМИ:")
print(f"🔍 Поиск: {keywords}")
print(f"🤖 AI: {'Включен' if use_ai else 'Отключен'}")
print(f"📊 Максимум заявок: {max_apps}")
confirm = input("\nНачать автоматизацию? [y/n]: ").lower()
if confirm != "y":
print("❌ Отменено пользователем")
return
manager = JobApplicationManager()
stats = manager.run_automation(keywords=keywords, use_ai=use_ai)
cli.print_final_stats(stats)
except KeyboardInterrupt:
print("\n⏹️ Программа остановлена пользователем")
except Exception as e:
print(f"\n❌ Неожиданная ошибка: {e}")
finally:
print("\n👋 До свидания!")