package com.screenshot;
import com.screenshot.config.AppConfig;
import com.screenshot.scheduler.ScreenshotScheduler;
import com.screenshot.scheduler.UploadScheduler;
import com.screenshot.service.ScreenshotService;
import java.awt.*;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
public class ScreenshotApp {
private final AppConfig config;
private final ScreenshotService screenshotService;
private final ScreenshotScheduler screenshotScheduler;
private final UploadScheduler uploadScheduler;
public ScreenshotApp() throws AWTException {
this.config = new AppConfig();
this.screenshotService = new ScreenshotService();
this.screenshotScheduler = new ScreenshotScheduler(screenshotService, config);
this.uploadScheduler = new UploadScheduler(config);
}
public void run() {
printBanner();
screenshotScheduler.start();
uploadScheduler.start();
Scanner scanner = new Scanner(System.in);
boolean exit = false;
while (!exit) {
printMenu();
String input = scanner.nextLine().trim();
switch (input) {
case "1" -> showSettings();
case "2" -> changeSavePath(scanner);
case "3" -> changeTargetWindow(scanner);
case "4" -> changeInterval(scanner);
case "5" -> changeCron(scanner);
case "6" -> toggleScheduleMode();
case "7" -> listWindows();
case "8" -> takeScreenshotNow();
case "9" -> toggleScreenshotScheduler();
// Новые команды для отправки
case "10" -> showUploadSettings();
case "11" -> changeServerUrl(scanner);
case "12" -> changeUploadTime(scanner);
case "13" -> changeUploadSettings(scanner);
case "14" -> uploadNow();
case "15" -> toggleUploadScheduler();
case "0" -> exit = true;
default -> System.out.println("Неизвестная команда");
}
}
shutdown();
}
private void printBanner() {
System.out.println("""
╔═══════════════════════════════════════════════════╗
║ SCREENSHOT APP v2.0 (Java 21) + Upload Server ║
╚═══════════════════════════════════════════════════╝
""");
}
private void printMenu() {
System.out.println("""
═══════════════ СКРИНШОТЫ ════════════════
1. Показать настройки скриншотов
2. Изменить путь сохранения
3. Изменить целевое приложение
4. Изменить интервал (минуты)
5. Изменить cron-расписание
6. Переключить режим (cron/интервал)
7. Список доступных окон
8. Сделать скриншот сейчас
9. Запустить/Остановить скриншоты
═══════════════ ОТПРАВКА ═════════════════
10. Показать настройки отправки
11. Изменить URL сервера
12. Изменить время отправки
13. Изменить настройки (retry, размер)
14. Отправить сейчас
15. Вкл/Выкл автоотправку
0. Выход
══════════════════════════════════════════
Введите команду:\s""");
}
private void showSettings() {
System.out.println("\n=== НАСТРОЙКИ СКРИНШОТОВ ===");
System.out.println("Путь сохранения: " + config.getSavePath());
System.out.println("Целевое окно: " +
(config.getTargetWindow().isEmpty() ? "Весь экран" : config.getTargetWindow()));
System.out.println("Режим: " + (config.useCron() ? "Cron" : "Интервал"));
System.out.println("Интервал: " + config.getIntervalMinutes() + " мин.");
System.out.println("Cron: " + config.getCronExpression());
System.out.println("Статус: " + (screenshotScheduler.isRunning() ? "✓ Работает" : "✗ Остановлен"));
}
private void showUploadSettings() {
System.out.println("\n=== НАСТРОЙКИ ОТПРАВКИ ===");
System.out.println("URL сервера: " + config.getUploadServerUrl());
System.out.println("Время отправки: " + config.getUploadScheduleTime());
System.out.println("Макс. размер ZIP: " + (config.getMaxZipSizeBytes() / 1024 / 1024) + " MB");
System.out.println("Попыток при ошибке: " + config.getUploadRetryCount());
System.out.println("Задержка retry: " + config.getUploadRetryDelaySeconds() + " сек.");
System.out.println("Удалять после отправки: " + (config.isDeleteAfterUpload() ? "Да" : "Нет"));
System.out.println("Автоотправка: " + (config.isUploadEnabled() ? "✓ Включена" : "✗ Выключена"));
System.out.println("Статус: " + (uploadScheduler.isRunning() ? "✓ Работает" : "✗ Остановлен"));
}
private void changeSavePath(Scanner scanner) {
System.out.print("Введите новый путь сохранения: ");
String path = scanner.nextLine().trim();
if (!path.isEmpty()) {
config.setSavePath(path);
config.saveConfig();
System.out.println("Путь изменён на: " + path);
}
}
private void changeTargetWindow(Scanner scanner) {
System.out.print("Введите название окна (пусто = весь экран): ");
String window = scanner.nextLine().trim();
config.setTargetWindow(window);
config.saveConfig();
screenshotService.resetImageComparison();
System.out.println("Целевое окно: " + (window.isEmpty() ? "Весь экран" : window));
}
private void changeInterval(Scanner scanner) {
System.out.print("Введите интервал в минутах: ");
try {
int minutes = Integer.parseInt(scanner.nextLine().trim());
if (minutes > 0) {
config.setIntervalMinutes(minutes);
config.saveConfig();
screenshotScheduler.restart();
System.out.println("Интервал: " + minutes + " мин.");
}
} catch (NumberFormatException e) {
System.out.println("Неверный формат");
}
}
private void changeCron(Scanner scanner) {
System.out.println("Формат: секунды минуты часы день месяц день_недели");
System.out.print("Введите cron: ");
String cron = scanner.nextLine().trim();
if (!cron.isEmpty()) {
config.setCronExpression(cron);
config.saveConfig();
if (config.useCron()) screenshotScheduler.restart();
System.out.println("Cron: " + cron);
}
}
private void toggleScheduleMode() {
boolean newMode = !config.useCron();
config.setUseCron(newMode);
config.saveConfig();
screenshotScheduler.restart();
System.out.println("Режим: " + (newMode ? "Cron" : "Интервал"));
}
private void listWindows() {
System.out.println("\n=== ДОСТУПНЫЕ ОКНА ===");
var windows = screenshotService.getAvailableWindows();
int count = 0;
for (String window : windows) {
if (count++ < 20) System.out.println("• " + window);
}
if (windows.size() > 20) {
System.out.println("... и ещё " + (windows.size() - 20));
}
}
private void takeScreenshotNow() {
System.out.println("Делаем скриншот...");
screenshotService.captureAndSave(config.getSavePath(), config.getTargetWindow());
}
private void toggleScreenshotScheduler() {
if (screenshotScheduler.isRunning()) {
screenshotScheduler.stop();
} else {
screenshotScheduler.start();
}
}
// === Методы для отправки ===
private void changeServerUrl(Scanner scanner) {
System.out.print("Введите URL сервера: ");
String url = scanner.nextLine().trim();
if (!url.isEmpty()) {
config.setUploadServerUrl(url);
config.saveConfig();
System.out.println("URL: " + url);
}
}
private void changeUploadTime(Scanner scanner) {
System.out.print("Введите время отправки (HH:mm): ");
try {
LocalTime time = LocalTime.parse(scanner.nextLine().trim(),
DateTimeFormatter.ofPattern("HH:mm"));
config.setUploadScheduleTime(time);
config.saveConfig();
uploadScheduler.restart();
System.out.println("Время отправки: " + time);
} catch (Exception e) {
System.out.println("Неверный формат времени");
}
}
private void changeUploadSettings(Scanner scanner) {
System.out.print("Макс. размер ZIP (MB) [" +
(config.getMaxZipSizeBytes()/1024/1024) + "]: ");
String input = scanner.nextLine().trim();
if (!input.isEmpty()) {
config.setMaxZipSizeMb(Integer.parseInt(input));
}
System.out.print("Количество попыток [" + config.getUploadRetryCount() + "]: ");
input = scanner.nextLine().trim();
if (!input.isEmpty()) {
config.setUploadRetryCount(Integer.parseInt(input));
}
System.out.print("Задержка retry (сек) [" + config.getUploadRetryDelaySeconds() + "]: ");
input = scanner.nextLine().trim();
if (!input.isEmpty()) {
config.setUploadRetryDelaySeconds(Integer.parseInt(input));
}
System.out.print("Удалять после отправки (y/n) [" +
(config.isDeleteAfterUpload() ? "y" : "n") + "]: ");
input = scanner.nextLine().trim().toLowerCase();
if (input.equals("y") || input.equals("n")) {
config.setDeleteAfterUpload(input.equals("y"));
}
config.saveConfig();
System.out.println("Настройки сохранены");
}
private void uploadNow() {
System.out.println("Запуск отправки...");
new Thread(uploadScheduler::performUpload).start();
}
private void toggleUploadScheduler() {
if (uploadScheduler.isRunning()) {
uploadScheduler.stop();
config.setUploadEnabled(false);
} else {
config.setUploadEnabled(true);
uploadScheduler.start();
}
config.saveConfig();
}
private void shutdown() {
System.out.println("Завершение работы...");
config.saveConfig();
screenshotScheduler.shutdown();
uploadScheduler.shutdown();
}
public static void main(String[] args) {
try {
ScreenshotApp app = new ScreenshotApp();
app.run();
} catch (AWTException e) {
System.err.println("Ошибка: " + e.getMessage());
}
}
}