Newer
Older
screenshot-app / src / main / java / com / screenshot / ScreenshotApp.java
@malexple malexple on 16 Dec 12 KB change app
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());
        }
    }
}