From 5450f0e92f0657f589991c0fab03f824548cbe18 Mon Sep 17 00:00:00 2001 From: Radek Davidek Date: Thu, 4 Dec 2025 16:18:59 +0100 Subject: [PATCH] initial commit --- .gitignore | 50 ++ pgo-automat-settings.properties | 12 + pgo.png | Bin 0 -> 7695 bytes pom.xml | 74 ++ src/main/java/com/pokemongo/GlobalHotkey.java | 64 ++ .../com/pokemongo/PokemonGoAutomation.java | 651 ++++++++++++++ src/main/java/com/pokemongo/PokemonGoGUI.java | 830 ++++++++++++++++++ .../java/com/pokemongo/PositionPicker.java | 95 ++ src/main/resources/include.png | Bin 0 -> 15334 bytes src/main/resources/pok1.png | Bin 0 -> 1677 bytes src/main/resources/ps-end/ps-end.png | Bin 0 -> 9862 bytes src/main/resources/ps-end/ps-end2.png | Bin 0 -> 9582 bytes src/main/resources/ps-end/ps-end3.png | Bin 0 -> 20205 bytes .../ps/Screenshot 2025-10-03 164033.png | Bin 0 -> 4203 bytes .../ps/Screenshot 2025-10-03 164048.png | Bin 0 -> 3227 bytes .../ps/Screenshot 2025-10-03 164057.png | Bin 0 -> 3218 bytes .../ps/Screenshot 2025-10-03 164107.png | Bin 0 -> 3310 bytes .../ps/Screenshot 2025-10-03 164119.png | Bin 0 -> 2897 bytes .../ps/Screenshot 2025-10-03 164207.png | Bin 0 -> 2589 bytes .../ps/Screenshot 2025-10-03 164638.png | Bin 0 -> 2545 bytes .../ps/Screenshot 2025-10-03 164654.png | Bin 0 -> 2138 bytes src/main/resources/t1.png | Bin 0 -> 16585 bytes src/main/resources/t2.png | Bin 0 -> 17118 bytes 23 files changed, 1776 insertions(+) create mode 100755 .gitignore create mode 100644 pgo-automat-settings.properties create mode 100644 pgo.png create mode 100644 pom.xml create mode 100644 src/main/java/com/pokemongo/GlobalHotkey.java create mode 100644 src/main/java/com/pokemongo/PokemonGoAutomation.java create mode 100644 src/main/java/com/pokemongo/PokemonGoGUI.java create mode 100644 src/main/java/com/pokemongo/PositionPicker.java create mode 100644 src/main/resources/include.png create mode 100644 src/main/resources/pok1.png create mode 100644 src/main/resources/ps-end/ps-end.png create mode 100644 src/main/resources/ps-end/ps-end2.png create mode 100644 src/main/resources/ps-end/ps-end3.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164033.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164048.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164057.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164107.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164119.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164207.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164638.png create mode 100755 src/main/resources/ps/Screenshot 2025-10-03 164654.png create mode 100644 src/main/resources/t1.png create mode 100644 src/main/resources/t2.png diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..7b12add --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +### Eclipse +.classpath +.project +.settings/ + +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.mvn +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +mvnw +mvnw.cmd + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ + +### Log4j2 ### +logs +*.log + +# Ignore Mac DS_Store files +.DS_Store + +dependency-reduced-pom.xml + +cert.pem \ No newline at end of file diff --git a/pgo-automat-settings.properties b/pgo-automat-settings.properties new file mode 100644 index 0000000..a2f9984 --- /dev/null +++ b/pgo-automat-settings.properties @@ -0,0 +1,12 @@ +#Pokmon GO Automatizace - Nastaven +#Thu Dec 04 16:03:55 CET 2025 +autoklik.count=500 +window.width=807 +transfer.delay=0 +window.height=743 +autoklik.x=2380 +autoklik.y=1124 +transfer.count=30 +window.x=930 +autoklik.interval=100 +window.y=22 diff --git a/pgo.png b/pgo.png new file mode 100644 index 0000000000000000000000000000000000000000..f2801e6636969eb06bb1c0494a63c1742f2dab50 GIT binary patch literal 7695 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 JPDHLkV1i?N^t=E7 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5807d9d --- /dev/null +++ b/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + com.pokemongo + pgo-automat + 1.0.0 + + + 11 + 11 + UTF-8 + + + + + + net.java.dev.jna + jna + 5.13.0 + + + net.java.dev.jna + jna-platform + 5.13.0 + + + + + org.openpnp + opencv + 4.7.0-0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.4.1 + + + package + + shade + + + + + com.pokemongo.PokemonGoGUI + + + pgo-automat-gui + + + + + + + diff --git a/src/main/java/com/pokemongo/GlobalHotkey.java b/src/main/java/com/pokemongo/GlobalHotkey.java new file mode 100644 index 0000000..c367840 --- /dev/null +++ b/src/main/java/com/pokemongo/GlobalHotkey.java @@ -0,0 +1,64 @@ +package com.pokemongo; + +import java.awt.event.KeyEvent; +import java.awt.KeyboardFocusManager; +import java.util.HashSet; +import java.util.Set; +import javax.swing.JLabel; + +/** + * Globální hotkey listener pro detekci CTRL+ALT+Z kombinace + * Funguje i když není okno fokusované + */ +public class GlobalHotkey extends JLabel { + private static GlobalHotkey instance; + private GlobalKeyListener globalKeyListener; + + public GlobalHotkey(Runnable onHotkey) { + this.globalKeyListener = new GlobalKeyListener(onHotkey); + + // Registrace globálního key listeneru + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addKeyEventDispatcher(globalKeyListener); + } + + public static GlobalHotkey create(Runnable onHotkey) { + if (instance == null) { + instance = new GlobalHotkey(onHotkey); + } + return instance; + } + + /** + * Interní třída pro globální naslouchání na klávesnici + */ + private static class GlobalKeyListener implements java.awt.KeyEventDispatcher { + private Runnable callback; + private Set pressedKeys = new HashSet<>(); + + public GlobalKeyListener(Runnable callback) { + this.callback = callback; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent e) { + if (e.getID() == KeyEvent.KEY_PRESSED) { + pressedKeys.add(e.getKeyCode()); + + // Detekce CTRL+ALT+X + if (e.getKeyCode() == KeyEvent.VK_X && + e.isControlDown() && e.isAltDown()) { + System.out.println("🔌 Globální hotkey detekován: CTRL+ALT+X"); + if (callback != null) { + callback.run(); + } + return true; // Konzumovat event + } + } else if (e.getID() == KeyEvent.KEY_RELEASED) { + pressedKeys.remove(e.getKeyCode()); + } + + return false; // Nepropagovat ostatní eventy + } + } +} diff --git a/src/main/java/com/pokemongo/PokemonGoAutomation.java b/src/main/java/com/pokemongo/PokemonGoAutomation.java new file mode 100644 index 0000000..ac71572 --- /dev/null +++ b/src/main/java/com/pokemongo/PokemonGoAutomation.java @@ -0,0 +1,651 @@ +package com.pokemongo; + +import java.awt.AWTException; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.imageio.ImageIO; + +/** + * Automatizační nástroj pro Pokémon GO. + * Najde běžící aplikaci, označí všechny Pokémony a stiskne tlačítko Transfer. + */ +public class PokemonGoAutomation { + + private Robot robot; + private Rectangle windowBounds; + private BufferedImage t1Template; // TRANSFER button template + private BufferedImage t2Template; // Confirmation button template + private BufferedImage pok1Template; // Pokemon detection template + private BufferedImage includeTemplate; // Include button template + private static final int DELAY_BETWEEN_CLICKS = 200; // ms + private static final int DELAY_AFTER_ACTION = 500; // ms + private int transferredPokemonCount = 0; // Počet transfernutých pokémonů + + public PokemonGoAutomation() throws AWTException { + this.robot = new Robot(); + this.robot.setAutoDelay(50); + this.robot.setAutoWaitForIdle(true); + loadButtonTemplates(); + } + + /** + * Vrátí počet dosud transfernutých pokémonů + */ + public int getTransferredCount() { + return transferredPokemonCount; + } + + /** + * Resetuje počítadlo transfernutých pokémonů + */ + public void resetTransferredCount() { + transferredPokemonCount = 0; + } + + /** + * Pořídí screenshot oblasti okna + */ + private BufferedImage captureScreen(Rectangle area) { + return robot.createScreenCapture(area); + } + + /** + * Načte templaty pro tlačítka TRANSFER (t1.png) a confirmation (t2.png) + */ + private void loadButtonTemplates() { + try { + String t1Paths = "/t1.png"; + + t1Template = ImageIO.read(getClass().getResourceAsStream(t1Paths)); + System.out.println("✅ Template TRANSFER načten z: " + t1Paths); + + String t2Paths = "/t2.png"; + + t2Template = ImageIO.read(getClass().getResourceAsStream(t2Paths)); + System.out.println("✅ Template Potvrzení načten z: " + t2Paths); + + String pok1Paths = "/pok1.png"; + + pok1Template = ImageIO.read(getClass().getResourceAsStream(pok1Paths)); + System.out.println("✅ Template Pokémon načten z: " + pok1Paths); + + String includePaths = "/include.png"; + + includeTemplate = ImageIO.read(getClass().getResourceAsStream(includePaths)); + System.out.println("✅ Template INCLUDE načten z: " + includePaths); + + if (t1Template == null) { + System.out.println("⚠️ Template t1.png nebyl nalezen"); + } + if (t2Template == null) { + System.out.println("⚠️ Template t2.png nebyl nalezen"); + } + if (pok1Template == null) { + System.out.println("⚠️ Template pok1.png nebyl nalezen"); + } + if (includeTemplate == null) { + System.out.println("⚠️ Template include.png nebyl nalezen"); + } + } catch (IOException e) { + System.err.println("⚠️ Chyba při načítání templates: " + e.getMessage()); + } + } + + /** + * Porovnává template s oblastí v obrázku - jednoduché pixelové porovnání s + * optimalizací + */ + private double templateMatch(BufferedImage screenshot, int startX, int startY, BufferedImage template, int tolerance) { + if (template == null) + return 0.0; + + int tWidth = template.getWidth(); + int tHeight = template.getHeight(); + + // Kontrola hranic + if (startX + tWidth > screenshot.getWidth() || startY + tHeight > screenshot.getHeight()) { + return 0.0; + } + if (startX < 0 || startY < 0) { + return 0.0; + } + + int matchingPixels = 0; + int totalPixels = tWidth * tHeight; + int requiredMatch = (int) (totalPixels * 0.75); // 75% shody + + for (int y = 0; y < tHeight; y++) { + for (int x = 0; x < tWidth; x++) { + int templateRGB = template.getRGB(x, y); + int screenRGB = screenshot.getRGB(startX + x, startY + y); + + // Rozdělit RGB hodnoty + int tR = (templateRGB >> 16) & 0xFF; + int tG = (templateRGB >> 8) & 0xFF; + int tB = templateRGB & 0xFF; + + int sR = (screenRGB >> 16) & 0xFF; + int sG = (screenRGB >> 8) & 0xFF; + int sB = screenRGB & 0xFF; + + // Porovnat barvy - zvýšená tolerance pro lepší detekci + int rDiff = Math.abs(tR - sR); + int gDiff = Math.abs(tG - sG); + int bDiff = Math.abs(tB - sB); + + if (rDiff < tolerance && gDiff < tolerance && bDiff < tolerance) { + matchingPixels++; + + // Early exit - pokud jsme nedosáhli minima, skončit + if (matchingPixels < requiredMatch / 2 && (y * tWidth + x) > (totalPixels / 2)) { + return 0.0; + } + } + } + } + + // Vrátit procentuální shodu (0.0-1.0) + return (double) matchingPixels / totalPixels; + } + + /** + * Detekuje pozice Pokémonů pomocí template matchingu s pok1.png + * Hledá v oblasti od vrchu obrazovky do 75% výšky + * Může najít až 9 Pokémonů + */ + private List detectPokemonsByTemplateMatching() { + List positions = new ArrayList<>(); + + System.out.println("\n=== Detekce Pokémonů pomocí template matchingu (pok1.png) ==="); + + if (pok1Template == null) { + System.out.println("⚠️ Template pok1.png není dostupný"); + return positions; + } + + BufferedImage screenshot = captureScreen(windowBounds); + + int tWidth = pok1Template.getWidth(); + int tHeight = pok1Template.getHeight(); + System.out.println("Template velikost: " + tWidth + "x" + tHeight); + + // Grid parametry - 3x3 (9 Pokémonů) - pevné pozice podle layoutu aplikace + int gridStartY = (int) (windowBounds.height * 0.15); + int gridEndY = (int) (windowBounds.height * 0.75); + int gridHeight = gridEndY - gridStartY; + + int gridMargin = (int) (windowBounds.width * 0.05); + int gridStartX = gridMargin; + int gridWidth = windowBounds.width - (2 * gridMargin); + + int columns = 3; + int rows = 3; // 3x3 grid = 9 Pokémonů + + int columnWidth = gridWidth / columns; + int rowHeight = gridHeight / rows; + + System.out.println("Hledám Pokémony v gridu 3x3 (9 pozic)"); + + // Pro každou buňku v gridu hledat template + for (int row = 0; row < rows; row++) { + for (int col = 0; col < columns; col++) { + int cellX = gridStartX + (col * columnWidth); + int cellY = gridStartY + (row * rowHeight); + + double bestScore = 0.0; + int bestX = cellX + columnWidth / 2; + int bestY = cellY + rowHeight / 2; + + // Skenovat buňku s jemností + for (int sy = cellY; sy < cellY + rowHeight - tHeight; sy += 3) { + for (int sx = cellX; sx < cellX + columnWidth - tWidth; sx += 3) { + double score = templateMatch(screenshot, sx, sy, pok1Template, 115); // Zvýšená tolerance + if (score > bestScore) { + bestScore = score; + bestX = sx + tWidth / 2; + bestY = sy + tHeight / 2; + } + } + } + + // Pokud jsme našli match (skóre > 75%), považovat za Pokémona + if (bestScore > 0.98) { + int x = windowBounds.x + bestX; + int y = windowBounds.y + bestY; + positions.add(new Point(x, y)); + System.out.println(" Detekován Pokémon na [" + row + "," + col + "] -> (" + x + ", " + y + + ") skóre=" + String.format("%.1f", bestScore * 100) + "%"); + } + } + } + + System.out.println("Celkem detekováno: " + positions.size() + " Pokémonů"); + System.out.println("=================================\n"); + + return positions; + } + + + /** + * Najde a vrátí pozici transferu tlačítka bez kliknutí + */ + private Point findTransferButtonPosition() { + System.out.println("Hledám tlačítko TRANSFER pomocí template matchingu (t1.png)..."); + + BufferedImage screenshot = captureScreen(windowBounds); + + int tWidth = t1Template.getWidth(); + int tHeight = t1Template.getHeight(); + + // Template je celý řádek - zkusíme matchovat od 75% do 95% (kde by měl být + // TRANSFER řádek) + int searchStartY = (int) (windowBounds.height * 0.75); + int searchEndY = (int) (windowBounds.height * 0.95); + + double bestScore = 0.0; + int bestX = 0; + int bestY = 0; + + // Skenovat Y-ové pozice s větším krokem - 15px místo 5px pro zrychlení + for (int y = searchStartY; y <= searchEndY - tHeight; y += 15) { + // Skenovat také X pozice pro nalezení středu shody + for (int x = 0; x <= windowBounds.width - tWidth; x += 30) { + double score = templateMatch(screenshot, x, y, t1Template, 90); + + if (score > bestScore) { + bestScore = score; + bestX = x; + bestY = y; + } + } + } + + if (bestScore > 0.92) { + Point bestMatch = new Point( + windowBounds.x + bestX + (tWidth / 2), + windowBounds.y + bestY + (tHeight / 2)); + System.out.println("✅ Nalezeno TRANSFER tlačítko (template match) na: " + bestMatch + " (shoda: " + + String.format("%.1f", bestScore * 100) + "%)"); + return bestMatch; + } + + System.out.println("Template nenalezen"); + return null; + } + + /** + * Najde a vrátí pozici potvrzovacího tlačítka bez kliknutí + */ + private Point findConfirmTransferButtonPosition() { + System.out.println("Hledám potvrzovací TRANSFER tlačítko pomocí template matchingu (t2.png)..."); + + BufferedImage screenshot = captureScreen(windowBounds); + + int tWidth = t2Template.getWidth(); + int tHeight = t2Template.getHeight(); + + // Dialog je obvykle v horní polovině po TRANSFER kliknutí + int searchStartY = (int) (windowBounds.height * 0.40); + int searchEndY = (int) (windowBounds.height * 0.75); + + double bestScore = 0.0; + int bestX = 0; + int bestY = 0; + + // Skenovat Y-ové pozice s větším krokem - 15px místo 5px pro zrychlení + for (int y = searchStartY; y <= searchEndY - tHeight; y += 15) { + // Skenovat také X pozice pro nalezení středu shody + for (int x = 0; x <= windowBounds.width - tWidth; x += 30) { + double score = templateMatch(screenshot, x, y, t2Template, 90); + + if (score > bestScore) { + bestScore = score; + bestX = x; + bestY = y; + } + } + } + + if (bestScore > 0.85) { + Point bestMatch = new Point( + windowBounds.x + bestX + (tWidth / 2), + windowBounds.y + bestY + (tHeight / 2)); + System.out.println("✅ Nalezeno potvrzovací tlačítko (template match) na: " + bestMatch + " (shoda: " + + String.format("%.1f", bestScore * 100) + "%)"); + return bestMatch; + } + + System.out.println("Template nenalezen"); + return null; + } + + private Point findIncludeButtonPosition() { + System.out.println("Hledám tlačítko INCLUDE pomocí template matchingu (include.png)..."); + + BufferedImage screenshot = captureScreen(windowBounds); + + int tWidth = includeTemplate.getWidth(); + int tHeight = includeTemplate.getHeight(); + + // Dialog je obvykle v horní polovině po TRANSFER kliknutí + int searchStartY = (int) (windowBounds.height * 0.40); + int searchEndY = (int) (windowBounds.height * 0.75); + + double bestScore = 0.0; + int bestX = 0; + int bestY = 0; + + // Skenovat Y-ové pozice s větším krokem - 15px místo 5px pro zrychlení + for (int y = searchStartY; y <= searchEndY - tHeight; y += 15) { + // Skenovat také X pozice pro nalezení středu shody + for (int x = 0; x <= windowBounds.width - tWidth; x += 30) { + double score = templateMatch(screenshot, x, y, includeTemplate, 90); + + if (score > bestScore) { + bestScore = score; + bestX = x; + bestY = y; + } + } + } + + if (bestScore > 0.92) { + Point bestMatch = new Point( + windowBounds.x + bestX + (tWidth / 2), + windowBounds.y + bestY + (tHeight / 2)); + System.out.println("✅ Nalezeno tlačítko INCLUDE (template match) na: " + bestMatch + " (shoda: " + + String.format("%.1f", bestScore * 100) + "%)"); + return bestMatch; + } + + System.out.println("Template nenalezen"); + return null; + } + + /** + * Najde okno s názvem obsahujícím "Pokémon" nebo "Pokemon" + */ + public boolean findPokemonGoWindow() { + try { + // Pro Linux - hledání okna pomocí xdotool + // Nejdříve najít ID okna, pak získat jeho geometrii + Process searchProcess = Runtime.getRuntime().exec( + new String[] { "bash", "-c", "xdotool search --name \"Lenovo|L78032\" | head -1" }); + + java.io.BufferedReader searchReader = new java.io.BufferedReader( + new java.io.InputStreamReader(searchProcess.getInputStream())); + + String windowId = searchReader.readLine(); + searchProcess.waitFor(); + + if (windowId != null && !windowId.trim().isEmpty()) { + System.out.println("Nalezeno okno s ID: " + windowId); + + // Získat geometrii okna + Process geomProcess = Runtime.getRuntime().exec( + new String[] { "bash", "-c", "xdotool getwindowgeometry " + windowId.trim() }); + + java.io.BufferedReader geomReader = new java.io.BufferedReader( + new java.io.InputStreamReader(geomProcess.getInputStream())); + + String line; + int x = 0, y = 0, width = 0, height = 0; + + while ((line = geomReader.readLine()) != null) { + System.out.println("xdotool výstup: " + line); + if (line.contains("Position:")) { + String[] parts = line.split("Position: ")[1].split(","); + x = Integer.parseInt(parts[0].trim()); + y = Integer.parseInt(parts[1].trim().split(" ")[0]); + } else if (line.contains("Geometry:")) { + String[] parts = line.split("Geometry: ")[1].split("x"); + width = Integer.parseInt(parts[0].trim()); + height = Integer.parseInt(parts[1].trim()); + } + } + + geomProcess.waitFor(); + + if (width > 0 && height > 0) { + windowBounds = new Rectangle(x, y, width, height); + System.out.println("Nalezeno okno: " + windowBounds); + return true; + } + } + + // Fallback - použití celé obrazovky + System.out.println("Okno nenalezeno, použiji celou obrazovku"); + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + windowBounds = gd.getDefaultConfiguration().getBounds(); + return true; + + } catch (Exception e) { + System.err.println("Chyba při hledání okna: " + e.getMessage()); + e.printStackTrace(); + // Použití celé obrazovky jako záložní varianta + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + windowBounds = gd.getDefaultConfiguration().getBounds(); + return true; + } + } + + /** + * Aktivuje okno aplikace + */ + public void activateWindow() { + try { + // Kliknutí na horní panel okna (title bar) pro aktivaci + // Title bar je obvykle 30-40px vysoký v horní části okna + int centerX = windowBounds.x + windowBounds.width / 2; + int titleBarY = windowBounds.y + 15; // 15px od vrcholu okna = horní panel + + System.out.println("Aktivuji okno kliknutím na title bar: (" + centerX + ", " + titleBarY + ")"); + + robot.mouseMove(centerX, titleBarY); + robot.delay(200); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(DELAY_AFTER_ACTION); + + System.out.println("Okno aktivováno"); + } catch (Exception e) { + System.err.println("Chyba při aktivaci okna: " + e.getMessage()); + } + } + + /** + * Stiskne tlačítko Transfer na spodní části obrazovky + */ + public void clickTransferButton() { + // Použít detekci tlačítka + Point buttonPos = findTransferButtonPosition(); + + if (buttonPos == null) { + System.err.println("Tlačítko TRANSFER nebylo nalezeno!"); + return; + } + + robot.mouseMove(buttonPos.x, buttonPos.y); + robot.delay(DELAY_AFTER_ACTION); + + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + + System.out.println("Tlačítko TRANSFER stisknuto!"); + robot.delay(DELAY_AFTER_ACTION); + } + + /** + * Potvrdí transfer (pokud je potřeba potvrzovací dialog) + */ + public void clickConfirmTransferButton() { + System.out.println("Potvrzuji transfer - hledám t2.png (confirmation button)..."); + + robot.delay(100); // Počkat na zobrazení dialogu + + // Najít zelené TRANSFER tlačítko v potvrzovacím dialogu + Point buttonPos = findConfirmTransferButtonPosition(); + if (buttonPos == null) { + System.out.println("Potvrzovací tlačítko nebylo nalezeno, přeskočím potvrzení."); + return; + } + + robot.mouseMove(buttonPos.x, buttonPos.y); + robot.delay(DELAY_BETWEEN_CLICKS); + + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + + System.out.println("Transfer finálně potvrzen!"); + robot.delay(DELAY_AFTER_ACTION); + } + + public void clickIncludeButton() { + System.out.println("Potvrzuji transfer - hledám include.png (confirmation button)..."); + + robot.delay(100); // Počkat na zobrazení dialogu + + // Najít zelené INCLUDE tlačítko v potvrzovacím dialogu + Point buttonPos = findIncludeButtonPosition(); + if (buttonPos == null) { + System.out.println("INCLUDE tlačítko nebylo nalezeno, přeskočím potvrzení."); + return; + } + + robot.mouseMove(buttonPos.x, buttonPos.y); + robot.delay(DELAY_BETWEEN_CLICKS); + + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + + System.out.println("Transfer finálně potvrzen!"); + robot.delay(DELAY_AFTER_ACTION); + } + + /** + * Spustí Transfer automatizaci s konkrétním počtem pokémonů + * + * @param totalPokemonCount Celkový počet pokémonů k transferu + * @param delaySeconds Čekání mezi iteracemi (v sekundách) + */ + public void runWithCount(int totalPokemonCount, int delaySeconds) { + System.out.println("Spouštím Transfer automatizaci - Počet pokémonů: " + totalPokemonCount + ", Čekání: " + + delaySeconds + "s"); + + if (!findPokemonGoWindow()) { + System.err.println("Nepodařilo se najít okno Pokémon GO!"); + return; + } + + activateWindow(); + + System.out.println("Čekám 1 sekundu před začátkem..."); + robot.delay(1000); + + int transferredCount = 0; + + // Transferovat dokud nedosáhneme požadovaného počtu + while (transferredCount < totalPokemonCount) { + // Kontrola přerušení + if (Thread.currentThread().isInterrupted()) { + System.out.println("\n⚠️ Automatizace byla přerušena!"); + return; + } + + int pokemonThisRound = Math.min(9, totalPokemonCount - transferredCount); + + System.out.println("\n=== Iterace " + (transferredCount / 9 + 1) + " - Transferuji maximálně " + pokemonThisRound + + " pokémonů ==="); + + // Vybrat pokémony a získat skutečný počet vybraných + int actualTransferredCount = selectAllPokemonCount(pokemonThisRound); + + System.out.println("Čekám na TRANSFER..."); + clickTransferButton(); + + System.out.println("Čekám na INCLUDE dialog..."); + robot.delay(100); + clickIncludeButton(); + + System.out.println("Čekám na potvrzovací dialog..."); + robot.delay(100); + clickConfirmTransferButton(); + + transferredCount += actualTransferredCount; + transferredPokemonCount += actualTransferredCount; + + System.out.println("Transferováno v této iteraci: " + actualTransferredCount + " pokémonů (celkem: " + transferredCount + ")"); + + // Pokud ještě zbývá co transferovat, počkat + if (transferredCount < totalPokemonCount) { + System.out.println("Přestávka: " + delaySeconds + " sekund..."); + // Čekat s kontrolou přerušení + long endTime = System.currentTimeMillis() + (delaySeconds * 1000L); + while (System.currentTimeMillis() < endTime) { + if (Thread.currentThread().isInterrupted()) { + System.out.println("\n⚠️ Automatizace byla přerušena během přestávky!"); + return; + } + robot.delay(100); + } + } + } + + System.out.println("\n✅ Transfer automatizace dokončena! Transferováno: " + transferredCount + " pokémonů"); + } + + /** + * Označí konkrétní počet pokémonů + * @return Skutečný počet vybraných pokémonů + */ + private int selectAllPokemonCount(int count) { + System.out.println("Začínám označovat " + count + " pokémonů (pouze template matching)..."); + + List positions = detectPokemonsByTemplateMatching(); + + int maxPokemon = Math.min(count, positions.size()); + System.out.println("Budu označovat " + maxPokemon + " pokémonů..."); + + for (int i = 0; i < maxPokemon; i++) { + Point pos = positions.get(i); + System.out.println("Klikám na Pokémona " + (i + 1) + "/" + maxPokemon + " na pozici: " + pos); + + robot.mouseMove(pos.x, pos.y); + + if (i == 0) { + robot.delay(500); + System.out.println(" -> Dlouhé podržení (aktivace multi-select)"); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(800); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.delay(DELAY_AFTER_ACTION); + } else { + System.out.println(" -> Normální klik"); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + } + + robot.delay(DELAY_BETWEEN_CLICKS); + } + + System.out.println("Označeno " + maxPokemon + " pokémonů!"); + System.out.println("Čekám před kliknutím na TRANSFER..."); + robot.delay(800); + + return maxPokemon; + } + + public static void main(String[] args) { + System.out.println("=== Pokémon GO Automatizační Nástroj ==="); + System.out.println("Ujistěte se, že je aplikace Pokémon GO spuštěná..."); + } +} diff --git a/src/main/java/com/pokemongo/PokemonGoGUI.java b/src/main/java/com/pokemongo/PokemonGoGUI.java new file mode 100644 index 0000000..f4e92e7 --- /dev/null +++ b/src/main/java/com/pokemongo/PokemonGoGUI.java @@ -0,0 +1,830 @@ +package com.pokemongo; + +import javax.swing.*; +import javax.swing.KeyStroke; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.WindowEvent; +import java.io.*; +import java.util.Properties; + +/** + * Jednoduchá GUI aplikace pro Pokémon GO automatizaci + * S kartami pro jednotlivé automatizace + */ +public class PokemonGoGUI extends JFrame { + + private JButton stopButton; + private JTextArea logArea; + private JLabel statusLabel; + private volatile boolean isRunning = false; + private volatile boolean shouldStop = false; + private PokemonGoAutomation automation; + private Thread automationThread; + private int totalTransferredCount = 0; // Celkový počet transfernutých pokémonů + + private volatile boolean autoClickRunning = false; + private GlobalHotkey globalHotkey; + + private static final String CONFIG_FILE = "pgo-automat-settings.properties"; + private static final String VERSION = "1.0.2"; + private Properties settings; + private JSpinner countSpinner; + private JSpinner delaySpinner; + + private static final Font TITLE_FONT = new Font("Segoe UI", Font.BOLD, 18); + private static final Font HEADER_FONT = new Font("Segoe UI", Font.BOLD, 12); + private static final Font BODY_FONT = new Font("Segoe UI", Font.PLAIN, 11); + private static final Font SMALL_FONT = new Font("Segoe UI", Font.PLAIN, 10); + private static final Color PANEL_BACKGROUND = new Color(248, 248, 252); + private static final Color CARD_BACKGROUND = Color.WHITE; + private static final Color CARD_BORDER_COLOR = new Color(210, 210, 210); + private static final Color PRIMARY_GREEN = new Color(76, 175, 80); + private static final Color PRIMARY_RED = new Color(244, 67, 54); + private static final Color ACCENT_BLUE = new Color(33, 150, 243); + private static final Color LOG_BORDER_COLOR = new Color(200, 200, 200); + private static final Color STATUS_DEFAULT = new Color(33, 150, 243); + private static final int CARD_MAX_WIDTH = 760; + + public PokemonGoGUI() { + setTitle("Pokémon GO Automatizace v" + VERSION); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + // Načtení uložených nastavení + loadSettings(); + + // Obnovení velikosti a pozice okna + int width = Integer.parseInt(settings.getProperty("window.width", "900")); + int height = Integer.parseInt(settings.getProperty("window.height", "680")); + int x = Integer.parseInt(settings.getProperty("window.x", "-1")); + int y = Integer.parseInt(settings.getProperty("window.y", "-1")); + + setSize(width, height); + + if (x >= 0 && y >= 0) { + setLocation(x, y); + } else { + setLocationRelativeTo(null); + } + + setResizable(true); + setBackground(PANEL_BACKGROUND); + + // Uložení nastavení při zavření okna + addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + saveSettings(); + } + }); + + // Hlavní panel + JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); + mainPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + mainPanel.setBackground(PANEL_BACKGROUND); + + // Horní panel se stavem + JLabel stateLabel = new JLabel("Stav:"); + stateLabel.setFont(HEADER_FONT); + stateLabel.setForeground(new Color(70, 70, 70)); + statusLabel = new JLabel("Připraven k spuštění"); + statusLabel.setFont(BODY_FONT); + statusLabel.setForeground(STATUS_DEFAULT); + JLabel versionLabel = new JLabel("verze " + VERSION); + versionLabel.setFont(SMALL_FONT); + versionLabel.setForeground(new Color(120, 120, 120)); + + stopButton = new JButton("⏹ ZASTAVIT (CTRL+ALT+X)"); + stopButton.setPreferredSize(new Dimension(150, 30)); + styleButton(stopButton, PRIMARY_RED, Color.WHITE, SMALL_FONT); + stopButton.setEnabled(false); + stopButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + stopAutomation(); + } + }); + + JPanel stopPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + stopPanel.setOpaque(false); + stopPanel.add(stopButton); + + JLabel titleLabel = new JLabel("Pokémon GO Automatizace"); + titleLabel.setFont(TITLE_FONT); + titleLabel.setForeground(new Color(30, 30, 30)); + + JPanel titleRow = new JPanel(new BorderLayout()); + titleRow.setBackground(PANEL_BACKGROUND); + titleRow.add(titleLabel, BorderLayout.WEST); + titleRow.add(stopPanel, BorderLayout.EAST); + + JPanel statusRow = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0)); + statusRow.setBackground(PANEL_BACKGROUND); + statusRow.add(stateLabel); + statusRow.add(statusLabel); + statusRow.add(versionLabel); + + JPanel headerPanel = new JPanel(); + headerPanel.setLayout(new BoxLayout(headerPanel, BoxLayout.Y_AXIS)); + headerPanel.setBackground(PANEL_BACKGROUND); + headerPanel.add(titleRow); + headerPanel.add(Box.createVerticalStrut(6)); + headerPanel.add(statusRow); + + // Panel s kartami automatizací + JPanel cardsContainer = new JPanel(new GridBagLayout()); + cardsContainer.setBackground(PANEL_BACKGROUND); + cardsContainer.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.weightx = 1.0; + gbc.anchor = GridBagConstraints.NORTH; + gbc.insets = new Insets(0, 0, 12, 0); + + // Karta 1: Transfer automatizace + JPanel transferCard = createAutomationCard( + "🔄 TRANSFER AUTOMATIZACE", + "Hledá Pokémony, označí je a stiskne Transfer", + null + ); + + // Najít START tlačítko - je v EAST pozici BorderLayoutu + JButton startBtnTransfer = findStartButton(transferCard); + + if (startBtnTransfer != null) { + startBtnTransfer.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + startTransferAutomation(transferCard); + } + }); + } + + gbc.gridy = 0; + cardsContainer.add(transferCard, gbc); + gbc.gridy++; + gbc.insets = new Insets(0, 0, 12, 0); + + // Karta 2: Autoklik + JPanel autoClickCard = createAutomationCard( + "🖱️ AUTOKLIK", + "Automaticky klikuje na zadanou pozici", + null + ); + + // Najít START tlačítko + JButton startBtnAutoClick = findStartButton(autoClickCard); + + if (startBtnAutoClick != null) { + startBtnAutoClick.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + startAutoClick(autoClickCard); + } + }); + } + + gbc.gridy++; + gbc.insets = new Insets(0, 0, 0, 0); + cardsContainer.add(autoClickCard, gbc); + gbc.gridy++; + gbc.weighty = 1.0; + JPanel spacer = new JPanel(); + spacer.setOpaque(false); + cardsContainer.add(spacer, gbc); + + JPanel automationPanel = new JPanel(new BorderLayout()); + automationPanel.setBackground(PANEL_BACKGROUND); + automationPanel.add(cardsContainer, BorderLayout.NORTH); + + JScrollPane automationScrollPane = new JScrollPane(automationPanel); + automationScrollPane.setBorder(null); + automationScrollPane.setBackground(PANEL_BACKGROUND); + automationScrollPane.getViewport().setBackground(PANEL_BACKGROUND); + + // Log area + logArea = new JTextArea(); + logArea.setEditable(false); + logArea.setFont(new Font("Consolas", Font.PLAIN, 11)); + logArea.setBackground(new Color(248, 248, 248)); + logArea.setForeground(new Color(45, 45, 45)); + logArea.setLineWrap(true); + logArea.setWrapStyleWord(true); + logArea.setMargin(new Insets(5, 5, 5, 5)); + + JScrollPane logScrollPane = new JScrollPane(logArea); + logScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + logScrollPane.setBorder(BorderFactory.createTitledBorder( + BorderFactory.createLineBorder(LOG_BORDER_COLOR), + "Log", + 0, + 0, + HEADER_FONT, + new Color(85, 85, 85) + )); + logScrollPane.getViewport().setBackground(new Color(247, 247, 247)); + + JButton clearLogButton = new JButton("🗑 Vyčistit log"); + clearLogButton.setPreferredSize(new Dimension(140, 28)); + styleButton(clearLogButton, ACCENT_BLUE, Color.WHITE, SMALL_FONT); + clearLogButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + logArea.setText(""); + } + }); + + JPanel logButtonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); + logButtonPanel.setBackground(PANEL_BACKGROUND); + logButtonPanel.add(clearLogButton); + + JPanel logPanel = new JPanel(new BorderLayout(5, 5)); + logPanel.setBackground(new Color(247, 247, 247)); + logPanel.add(logScrollPane, BorderLayout.CENTER); + logPanel.add(logButtonPanel, BorderLayout.SOUTH); + + // Splitter mezi kartami a logem + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, automationScrollPane, logPanel); + splitPane.setDividerSize(6); + splitPane.setResizeWeight(0.6); + splitPane.setContinuousLayout(true); + splitPane.setBorder(null); + splitPane.setBackground(PANEL_BACKGROUND); + + // Přidání do hlavního panelu + mainPanel.add(headerPanel, BorderLayout.NORTH); + mainPanel.add(splitPane, BorderLayout.CENTER); + + add(mainPanel); + + // Klávesová zkratka: Ctrl+Alt+Z pro zastavení + KeyStroke hotkey = KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); + getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(hotkey, "stopAutomationAction"); + getRootPane().getActionMap().put("stopAutomationAction", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (isRunning) { + stopAutomation(); + } + } + }); + + // Globální hotkey pro ESC (bonus, když okno není fokusované) + globalHotkey = new GlobalHotkey(new Runnable() { + @Override + public void run() { + if (isRunning) { + stopAutomation(); + } + } + }); + mainPanel.add(globalHotkey, BorderLayout.SOUTH); + + // Přesměrování System.out a System.err do GUI + redirectSystemStreams(); + + logArea.append("=== Pokémon GO Automatizace ===\n\n"); + logArea.append("Vyberte jednu z automatizací a klikněte na tlačítko START.\n"); + logArea.append("Ujistěte se, že je aplikace Pokémon GO spuštěná.\n"); + logArea.append("Pro zastavení stiskněte Ctrl+Alt+X nebo klikněte ZASTAVIT.\n\n"); + } + + /** + * Vytvoří kartu automatizace s nastavením + */ + private JPanel createAutomationCard(String title, String description, ActionListener startAction) { + JPanel card = new JPanel(new BorderLayout(12, 12)); + card.setBackground(CARD_BACKGROUND); + card.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(CARD_BORDER_COLOR, 1), + BorderFactory.createEmptyBorder(8, 8, 8, 8) + )); + card.setMaximumSize(new Dimension(CARD_MAX_WIDTH, 160)); + card.setPreferredSize(new Dimension(CARD_MAX_WIDTH, 160)); + card.setAlignmentX(Component.CENTER_ALIGNMENT); + JPanel infoPanel = new JPanel(); + infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.Y_AXIS)); + infoPanel.setBackground(CARD_BACKGROUND); + infoPanel.setOpaque(true); + infoPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + + JLabel titleLabel = new JLabel(title); + titleLabel.setFont(HEADER_FONT); + titleLabel.setForeground(new Color(28, 28, 28)); + + JLabel descLabel = new JLabel("" + description + ""); + descLabel.setFont(SMALL_FONT); + descLabel.setForeground(new Color(115, 115, 115)); + + infoPanel.add(titleLabel); + infoPanel.add(Box.createVerticalStrut(3)); + infoPanel.add(descLabel); + infoPanel.add(Box.createVerticalGlue()); + + JPanel centerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 12, 6)); + centerPanel.setBackground(CARD_BACKGROUND); + centerPanel.setOpaque(true); + + if (title.contains("TRANSFER")) { + countSpinner = new JSpinner(new SpinnerNumberModel( + Integer.parseInt(settings.getProperty("transfer.count", "9")), + 1, 999, 1 + )); + countSpinner.setPreferredSize(new Dimension(64, 26)); + delaySpinner = new JSpinner(new SpinnerNumberModel( + Integer.parseInt(settings.getProperty("transfer.delay", "2")), + 0, 60, 1 + )); + delaySpinner.setPreferredSize(new Dimension(64, 26)); + + card.putClientProperty("countSpinner", countSpinner); + card.putClientProperty("delaySpinner", delaySpinner); + + centerPanel.add(createFieldPanel("Počet:", countSpinner)); + centerPanel.add(createFieldPanel("Čekání (s):", delaySpinner)); + } else if (title.contains("AUTOKLIK")) { + JSpinner xSpinner = new JSpinner(new SpinnerNumberModel( + Integer.parseInt(settings.getProperty("autoklik.x", "960")), + 0, 9999, 1 + )); + xSpinner.setPreferredSize(new Dimension(70, 26)); + card.putClientProperty("xSpinner", xSpinner); + + JSpinner ySpinner = new JSpinner(new SpinnerNumberModel( + Integer.parseInt(settings.getProperty("autoklik.y", "540")), + 0, 9999, 1 + )); + ySpinner.setPreferredSize(new Dimension(70, 26)); + card.putClientProperty("ySpinner", ySpinner); + + JSpinner intervalSpinner = new JSpinner(new SpinnerNumberModel( + Integer.parseInt(settings.getProperty("autoklik.interval", "100")), + 10, 10000, 10 + )); + intervalSpinner.setPreferredSize(new Dimension(70, 26)); + card.putClientProperty("intervalSpinner", intervalSpinner); + + JSpinner clickCountSpinner = new JSpinner(new SpinnerNumberModel( + Integer.parseInt(settings.getProperty("autoklik.count", "10")), + 1, 10000, 1 + )); + clickCountSpinner.setPreferredSize(new Dimension(70, 26)); + card.putClientProperty("clickCountSpinner", clickCountSpinner); + + centerPanel.add(createFieldPanel("X:", xSpinner)); + centerPanel.add(createFieldPanel("Y:", ySpinner)); + centerPanel.add(createFieldPanel("Interval (ms):", intervalSpinner)); + centerPanel.add(createFieldPanel("Počet kliknutí:", clickCountSpinner)); + + JButton pickPositionBtn = new JButton("Nastavit"); + pickPositionBtn.setPreferredSize(new Dimension(80, 26)); + styleButton(pickPositionBtn, ACCENT_BLUE, Color.WHITE, SMALL_FONT); + pickPositionBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + PositionPicker picker = new PositionPicker(null); + + new Thread(new Runnable() { + @Override + public void run() { + picker.setVisible(true); + + while (picker.isVisible()) { + try { + Thread.sleep(50); + } catch (InterruptedException ex) { + break; + } + } + + if (picker.isPositionSelected()) { + Point pos = picker.getSelectedPosition(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + xSpinner.setValue(pos.x); + ySpinner.setValue(pos.y); + logArea.append("✅ (" + pos.x + ", " + pos.y + ")\n"); + } + }); + } + } + }).start(); + } + }); + centerPanel.add(createFieldPanel("Pozice:", pickPositionBtn)); + } + + // Pravý panel - START tlačítko + JPanel rightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 0)); + rightPanel.setBackground(CARD_BACKGROUND); + rightPanel.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); + + JButton startBtn = new JButton("▶ START"); + startBtn.setPreferredSize(new Dimension(90, 32)); + styleButton(startBtn, PRIMARY_GREEN, Color.WHITE, SMALL_FONT); + startBtn.addActionListener(startAction); + + rightPanel.add(startBtn); + + // Komponování karty: info nahoře, nastavení uprostřed, tlačítko dole + card.add(infoPanel, BorderLayout.NORTH); + card.add(centerPanel, BorderLayout.CENTER); + card.add(rightPanel, BorderLayout.SOUTH); + + return card; + } + + private JPanel createFieldPanel(String labelText, JComponent field) { + JLabel label = new JLabel(labelText); + label.setFont(BODY_FONT); + label.setForeground(new Color(96, 96, 96)); + field.setFont(BODY_FONT); + if (field instanceof JSpinner) { + ((JSpinner) field).setBorder(BorderFactory.createLineBorder(CARD_BORDER_COLOR)); + field.setBackground(new Color(252, 252, 252)); + } + JPanel wrapper = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 2)); + wrapper.setBackground(CARD_BACKGROUND); + wrapper.add(label); + wrapper.add(field); + return wrapper; + } + + private void styleButton(JButton button, Color background, Color foreground, Font font) { + button.setFont(font); + button.setBackground(background); + button.setForeground(foreground); + button.setFocusPainted(false); + button.setBorder(BorderFactory.createEmptyBorder(4, 10, 4, 10)); + } + + private JButton findStartButton(Container container) { + for (Component comp : container.getComponents()) { + if (comp instanceof JButton) { + JButton button = (JButton) comp; + if ("▶ START".equals(button.getText())) { + return button; + } + } + if (comp instanceof Container) { + JButton nested = findStartButton((Container) comp); + if (nested != null) { + return nested; + } + } + } + return null; + } + + /** + * Přesměruje System.out a System.err do log area + */ + private void redirectSystemStreams() { + System.setOut(new java.io.PrintStream(System.out) { + @Override + public void println(String x) { + super.println(x); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + logArea.append(x + "\n"); + logArea.setCaretPosition(logArea.getDocument().getLength()); + } + }); + } + }); + + System.setErr(new java.io.PrintStream(System.err) { + @Override + public void println(String x) { + super.println(x); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + logArea.append("[CHYBA] " + x + "\n"); + logArea.setCaretPosition(logArea.getDocument().getLength()); + } + }); + } + }); + } + + /** + * Spustí Transfer automatizaci + */ + private void startTransferAutomation(JPanel transferCard) { + if (isRunning) { + JOptionPane.showMessageDialog(this, "Automatizace již běží!", "Upozornění", JOptionPane.WARNING_MESSAGE); + return; + } + + // Získat počet pokémonů a čekání z GUI + JSpinner countSpinner = (JSpinner) transferCard.getClientProperty("countSpinner"); + JSpinner delaySpinner = (JSpinner) transferCard.getClientProperty("delaySpinner"); + + int pokemonCount = (Integer) countSpinner.getValue(); + int delaySeconds = (Integer) delaySpinner.getValue(); + + stopButton.setEnabled(true); + statusLabel.setText("Transfer automatizace běží..."); + statusLabel.setForeground(new Color(255, 152, 0)); + isRunning = true; + + logArea.append("\n========================================\n"); + logArea.append("SPOUŠTĚNÍ TRANSFER AUTOMATIZACE\n"); + logArea.append("Počet pokémonů: " + pokemonCount + ", Čekání: " + delaySeconds + "s\n"); + logArea.append("========================================\n\n"); + + shouldStop = false; + automationThread = new Thread(new Runnable() { + @Override + public void run() { + try { + automation = new PokemonGoAutomation(); + automation.resetTransferredCount(); + + // Spustit vlákno pro aktualizaci statusu + Thread statusUpdateThread = new Thread(new Runnable() { + @Override + public void run() { + while (isRunning && !shouldStop && !Thread.currentThread().isInterrupted()) { + try { + Thread.sleep(500); // Aktualizovat každých 500ms + final int transferred = automation.getTransferredCount(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (isRunning) { + statusLabel.setText("Transfer běží... Transferováno: " + transferred + "/" + pokemonCount); + } + } + }); + } catch (InterruptedException e) { + break; + } + } + } + }); + statusUpdateThread.setDaemon(true); + statusUpdateThread.start(); + + if (!shouldStop) { + automation.runWithCount(pokemonCount, delaySeconds); + totalTransferredCount += automation.getTransferredCount(); + } + + if (!shouldStop) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + statusLabel.setText("Automatizace dokončena! Celkem transferováno: " + totalTransferredCount); + statusLabel.setForeground(new Color(76, 175, 80)); + logArea.append("\n✅ Transfer automatizace úspěšně dokončena! Transferováno: " + automation.getTransferredCount() + " pokémonů\n"); + } + }); + } + } catch (Exception e) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + statusLabel.setText("Chyba!"); + statusLabel.setForeground(new Color(244, 67, 54)); + logArea.append("\n❌ Chyba: " + e.getMessage() + "\n"); + e.printStackTrace(); + } + }); + } finally { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + isRunning = false; + stopButton.setEnabled(false); + } + }); + } + } + }); + + automationThread.start(); + } + + /** + * Spustí autoklik + */ + private void startAutoClick(JPanel autoClickCard) { + if (isRunning) { + JOptionPane.showMessageDialog(this, "Automatizace již běží!", "Upozornění", JOptionPane.WARNING_MESSAGE); + return; + } + + // Načtení nastavení + JSpinner xSpinner = (JSpinner) autoClickCard.getClientProperty("xSpinner"); + JSpinner ySpinner = (JSpinner) autoClickCard.getClientProperty("ySpinner"); + JSpinner intervalSpinner = (JSpinner) autoClickCard.getClientProperty("intervalSpinner"); + JSpinner clickCountSpinner = (JSpinner) autoClickCard.getClientProperty("clickCountSpinner"); + + int x = (Integer) xSpinner.getValue(); + int y = (Integer) ySpinner.getValue(); + int interval = (Integer) intervalSpinner.getValue(); + int clickCount = (Integer) clickCountSpinner.getValue(); + + // Uložení nastavení + settings.setProperty("autoklik.x", String.valueOf(x)); + settings.setProperty("autoklik.y", String.valueOf(y)); + settings.setProperty("autoklik.interval", String.valueOf(interval)); + settings.setProperty("autoklik.count", String.valueOf(clickCount)); + saveSettings(); + + stopButton.setEnabled(true); + statusLabel.setText("Autoklik běží... (" + x + ", " + y + ")"); + statusLabel.setForeground(new Color(255, 152, 0)); + isRunning = true; + autoClickRunning = true; + shouldStop = false; + + logArea.append("\n========================================\n"); + logArea.append("SPOUŠTĚNÍ AUTOKLIKERU\n"); + logArea.append("Pozice: (" + x + ", " + y + ")\n"); + logArea.append("Interval: " + interval + "ms, Počet kliknutí: " + clickCount + "\n"); + logArea.append("========================================\n\n"); + + automationThread = new Thread(new Runnable() { + @Override + public void run() { + try { + java.awt.Robot robot = new java.awt.Robot(); + + logArea.append("Spouštím autoklik...\n"); + + for (int i = 0; i < clickCount && autoClickRunning && !shouldStop; i++) { + // Přesunutí kurzoru na pozici + robot.mouseMove(x, y); + Thread.sleep(10); + + // Klik + robot.mousePress(java.awt.event.InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_DOWN_MASK); + + // Čekání mezi kliknutími + if (i < clickCount - 1 && !shouldStop) { + Thread.sleep(interval); + } + + // Update progress každých 10 kliknutí + if ((i + 1) % 10 == 0 && !shouldStop) { + int progress = i + 1; + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + logArea.append(" Kliknutí: " + progress + "/" + clickCount + "\n"); + } + }); + } + } + + if (!shouldStop) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + statusLabel.setText("Autoklik úspěšně dokončen!"); + statusLabel.setForeground(new Color(76, 175, 80)); + logArea.append("\n✅ Autoklik úspěšně dokončen! Celkem kliknutí: " + clickCount + "\n"); + } + }); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (Exception e) { + if (!shouldStop) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + statusLabel.setText("Chyba!"); + statusLabel.setForeground(new Color(244, 67, 54)); + logArea.append("\n❌ Chyba: " + e.getMessage() + "\n"); + e.printStackTrace(); + } + }); + } + } finally { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + isRunning = false; + autoClickRunning = false; + stopButton.setEnabled(false); + } + }); + } + } + }); + + automationThread.start(); + } + + /** + * Zastaví automatizaci + */ + private void stopAutomation() { + shouldStop = true; + autoClickRunning = false; + isRunning = false; + stopButton.setEnabled(false); + + if (automationThread != null && automationThread.isAlive()) { + automationThread.interrupt(); + // Čekej max 2 sekundy na ukončení + try { + automationThread.join(2000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + logArea.append("\n⚠️ Automatizace byla přerušena uživatelem\n"); + statusLabel.setText("Přerušeno"); + statusLabel.setForeground(new Color(244, 67, 54)); + } + }); + } + + /** + * Načte uložená nastavení ze souboru + */ + private void loadSettings() { + settings = new Properties(); + File configFile = new File(CONFIG_FILE); + + if (configFile.exists()) { + try (java.io.FileInputStream fis = new java.io.FileInputStream(configFile)) { + settings.load(fis); + } catch (IOException e) { + System.err.println("Chyba při načítání nastavení: " + e.getMessage()); + } + } + + // Výchozí hodnoty, pokud nastavení neexistují + if (!settings.containsKey("transfer.count")) { + settings.setProperty("transfer.count", "9"); + } + if (!settings.containsKey("transfer.delay")) { + settings.setProperty("transfer.delay", "2"); + } + if (!settings.containsKey("window.width")) { + settings.setProperty("window.width", "700"); + } + if (!settings.containsKey("window.height")) { + settings.setProperty("window.height", "600"); + } + if (!settings.containsKey("window.x")) { + settings.setProperty("window.x", "-1"); + } + if (!settings.containsKey("window.y")) { + settings.setProperty("window.y", "-1"); + } + } + + /** + * Uloží aktuální nastavení do souboru + */ + private void saveSettings() { + // Uložení hodnot z spinnerů + if (countSpinner != null) { + settings.setProperty("transfer.count", countSpinner.getValue().toString()); + } + if (delaySpinner != null) { + settings.setProperty("transfer.delay", delaySpinner.getValue().toString()); + } + + // Uložení velikosti a pozice okna + settings.setProperty("window.width", String.valueOf(getWidth())); + settings.setProperty("window.height", String.valueOf(getHeight())); + settings.setProperty("window.x", String.valueOf(getX())); + settings.setProperty("window.y", String.valueOf(getY())); + + try (java.io.FileOutputStream fos = new java.io.FileOutputStream(CONFIG_FILE)) { + settings.store(fos, "Pokémon GO Automatizace - Nastavení"); + } catch (IOException e) { + System.err.println("Chyba při ukládání nastavení: " + e.getMessage()); + } + } + + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + PokemonGoGUI frame = new PokemonGoGUI(); + frame.setVisible(true); + } + }); + } +} diff --git a/src/main/java/com/pokemongo/PositionPicker.java b/src/main/java/com/pokemongo/PositionPicker.java new file mode 100644 index 0000000..c92cb3c --- /dev/null +++ b/src/main/java/com/pokemongo/PositionPicker.java @@ -0,0 +1,95 @@ +package com.pokemongo; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +public class PositionPicker extends JWindow { + private Point selectedPosition = null; + private boolean positionSelected = false; + private PositionPickerListener listener = null; + + public interface PositionPickerListener { + void onPositionSelected(Point position); + void onCancelled(); + } + + public PositionPicker(PositionPickerListener listener) { + this.listener = listener; + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + Rectangle bounds = gd.getDefaultConfiguration().getBounds(); + setBounds(bounds); + + System.out.println("PositionPicker vytvořen: " + bounds); + + setFocusable(true); + setBackground(new Color(0, 0, 0, 0)); + + // Přidáme panel pro vykreslování + JPanel panel = new JPanel() { + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Lehké šedé pozadí + g2d.setColor(new Color(100, 100, 100, 10)); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + // Instrukce + g2d.setColor(new Color(0, 0, 0, 200)); + g2d.fillRect(10, 10, 400, 60); + + g2d.setColor(new Color(255, 255, 0, 255)); + g2d.setFont(new Font("Monospaced", Font.BOLD, 12)); + g2d.drawString("VYBERTE POZICI - Klikněte na místo kde chcete klikat", 20, 30); + g2d.drawString("ESC: Zrušit", 20, 50); + } + }; + panel.setOpaque(false); + panel.setBackground(new Color(0, 0, 0, 0)); + setContentPane(panel); + + panel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + selectedPosition = new Point(e.getX(), e.getY()); + positionSelected = true; + System.out.println("✅ Pozice vybrána: " + selectedPosition); + if (listener != null) { + listener.onPositionSelected(selectedPosition); + } + dispose(); + } + }); + + panel.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + System.out.println("ESC - Výběr zrušen"); + positionSelected = false; + if (listener != null) { + listener.onCancelled(); + } + dispose(); + } + } + }); + + panel.setFocusable(true); + panel.requestFocus(); + } + + public Point getSelectedPosition() { + return selectedPosition; + } + + public boolean isPositionSelected() { + return positionSelected; + } +} diff --git a/src/main/resources/include.png b/src/main/resources/include.png new file mode 100644 index 0000000000000000000000000000000000000000..c86caa486ff0914ff0110d233ce6d5873f7cdc08 GIT binary patch literal 15334 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 Ef~;-t6#xJL literal 0 HcmV?d00001 diff --git a/src/main/resources/pok1.png b/src/main/resources/pok1.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a27c1d1755225918e7569b9e3c4828253f835d GIT binary patch literal 1677 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 *H^b!V|m7;=Rbe0 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 Y3y{v^wgCXGg#Z8m07*qoM6N<$f;LO0`~Uy| literal 0 HcmV?d00001 diff --git a/src/main/resources/ps-end/ps-end3.png b/src/main/resources/ps-end/ps-end3.png new file mode 100644 index 0000000000000000000000000000000000000000..2e727755c1d6e54143da85b82fb8f6a70aa43f1d GIT binary patch literal 20205 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/ps/Screenshot 2025-10-03 164033.png b/src/main/resources/ps/Screenshot 2025-10-03 164033.png new file mode 100755 index 0000000000000000000000000000000000000000..ba36887194e2424eecddde2eea3576a1211833fb GIT binary patch literal 4203 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 N002ovPDHLkV1mz5{nG#d literal 0 HcmV?d00001 diff --git a/src/main/resources/ps/Screenshot 2025-10-03 164057.png b/src/main/resources/ps/Screenshot 2025-10-03 164057.png new file mode 100755 index 0000000000000000000000000000000000000000..d69ed70a2e72a671d35a9024b273a0f134e11560 GIT binary patch literal 3218 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 Ef;a2ze*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/ps/Screenshot 2025-10-03 164107.png b/src/main/resources/ps/Screenshot 2025-10-03 164107.png new file mode 100755 index 0000000000000000000000000000000000000000..fce42f18dadf680497c8ff7cc17fb3c93c0d5a2a GIT binary patch literal 3310 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D41-BTK~z{rHJ4Y9 zrB_-;*WUY!C+AbSs>>a!ZFg`O8*GEq02gR32sTIqLI??2LYf=6;0AOMKY(9?khnxb zgM>z7jK`i1w!7Qi6}sZ7lhb#;xHlJV{=uW?eO@gs(faJ)jb*o3-*G6kBQi0?E(;pl zZBkvr^YTDK8pZT4Pmu&9X+j!=^bQ44ZXBLBR&2fUE9Q~nI7lhfH;EDp+j6j#jqO>quhdX} zf@i~Go)Qf&2#1%XW5e)%j@hJwyX|xHy=@*n*vDMhR6i`zTFDdi?i2OS@Q8UW7;r7@ z(>EH^75u}oKo#Hlv(C=m1g$RUo;jR9s4#!xksalkKgk$>zhrS5lME%7`!gDa4Lqkn zu~sG#kdRQQOFTEBcNsAp+x*6F-Jl!vS$>&e+7`v;b;NRrPG^|7%VgH)`TsuV_e7EF zOHi#3{<2eRO*lWwGdQiI(gsr7Xf3dmg<~8DY-X1+vtGpE_ZLJ{L#w%p^Gv_%#uf`P?%_YX0)OSxUeDOHhqA1^N`S}A%Q^YGym z*V{lBB**vmsc)+kP!F&vPhh?WUbfRqV{7%4++dyeG< zXaclJ5z0XzQQBZ(p_iJ`kSw?cw=lUcS|2^TsOYgA0~HfTJ>$6|l2wap#sps}g!5Jg3TRFhs`!frAhV zqv7oAgi^JPQ!epUbB&MUb2h*IlI~@RZ?X*UMw@%Te2nk5xoqW8Z+`Yh#}Z#NJ-^N1 zY>YW{$(0LK_sUdu%jDN32S>kVFi80PvEb36;_+}owN+sIC7))a#^`KH8VWEr3L7`_ zNDdTJ-^N{6JYK&^RY~l{h{02vY}Vw;wJY5J{64v28MXb#pL9evWii|%$;xDA$m}%a z_}fcbI~#nnKVZ}?GdeA!m)D589^P=q`Qua0=MMGj6;`$z9G{$##RAJXNRyG8Df!DH zMlP8*d>&T{?1&}qEahSfYd6-BzD0gmMQ!}iKX-iZkVWtf!R#7BIgI0wD1yu52~Z}{ zdBRDC3?ot*p#mR5!K{}M&OKJPi!|D+Ts*%->WoYo<}yPE3Vj(Mn?8=?a&wmQ$?%x+ zpW6h9~NgvPc&W+?`P&^GzlV({RQ zU;WnsNgj4Tyw1W}Ad?s`l_(Pu1u@CN0u`0{a&3$As>Mf@jJxM2WT#Wwzw-*J{)hkA z@hU!UdO|SCBXkLs*+`>EO^Wg)!c0*hiv(j3{2BeT&j|n=o3UCku=*7$Gnc1O_cK zEF*|#DWNemH(Nx#IUJ&y^b~ z(#|k4LWvkxKsKF|_rTvQV?2Xxzd)Nd85x??$}qyh)ecF2hC_ik?~@@(g^N-SZswuR z1g0Nz8K*32C46VdtEE2bt-t%1PBxzss}xaRVcqYuoRkQr3ygk&@L;xJHk+|^YYVqg zB<(NJvA`hFfQ3M6(8iEz$u!c$#WHrkPimDABE(4z2#CpWi!Rs!+V7IKmZgHBf1Ruu;O=s#Do1qWlHI(kSI) zC6cfH;}O&2IqlnJZh!PLeo>&}1eGe3@KD0XHa1KLTqz7_uPsnI!AT|3*a$#sO*T)6 zCl%uP9z+VY_ulV!Mtw!|ovV!QU68p;N~^E3wiT0&43m+I(F&iGNY9vEXsq>+;;x02 z6F5SVL=jo0$ufhjG#l&i@~wm@8L~|FAPPaaXpy3YCQK4+$0iX)Y-bzw_Fuf)>7Fkb zo#iMMJx-pE$rUVA&7-v<(ZP`6#RA8xV=@P8DVg*&(I{kVXPuq94br@zwb7(qg`9fA z?c17A^~tJ=m)>qstyVZV=%chj3qvXl!nd%5pk+(cn}7b>oqS=*WEf*qliE$6Z@)O8 z-fUtwJ&G-taNc7yoDhf-#^i`+0ps%l<3XRRd#lv16sTTt$!#hs*Gi~%9$l&N>_T() z)KK1SQ(3EUc5#e}GgM|_jDzKr$Xhwotv`9cV>vP5JYzE0WbO4b4jzsGw^@c<#?7q) zE!X1WL?g7u5e8or&_TlSlQVj!J@WY+Drd1Y7SpNZ=y9Ke|4A8N0K=5sSK6$+v_hgI zCZjP~D)4h93i%N6(|`RZBZMFcs~qg_v7Z)r{lm98J3B;Fps`z{tu)s}fnWaT6TZ7Q zL8dKq;-IV$Z9-BaGGDW_Ba9^=%CIxAmrazmv1Q7@?y+-wojZ50^8EXA#=V$azJ_D( zqwfCc`yGWsp=p#nnCI9(>~m#ri~jhO`8=Um-(XHev7Ql3hs?(kow~#_!8Q`5ZFJ(G zLkAN%h}g!`9>y5l?8S>a(&PN3N0MaJn`Pd7t4*Pp5{KugyPtf}5eS49Y_;3m+$l1? z40v|jW$Wq=S(I?}{DQ*z8j&X{l>}BYXEsP!3XRkj#!@6kBZNXANwW;wQ3$P3)(?Ei z6pr*5_okd3b(xH&96$e>I3A^IU=Svwp7&@JbCmNF&Q2_jjzV63;}ya%a(0W?C;Omym|$l3I6-vzNS|5N$W*k-+`OO5f{@jN?W9% zMkxD*Ch-5_B)}*HFSJ2u1(`yUQmZM}H#DjK2KC0LA9Vy0g+)1E#&P7*H>TAOxuvOoJs@3XMU^7jd*v2wcc)JkL;S z1hlq#NbeyE3-#KkA9p}vjH2Qf$vH(9!IWhhW0cEEqeRuN^Z0&@@ryLJJPz+oQI?I^ z++bPWL0Us<{!@y6k3um=Fip^z1p>lMqa{R26X`jPwx-_dBE2IJ0%=^-YoGqO!w=4x z_X?D3i)9=zi>72UrdpM}_u4MO*_i!DF*<^cw{py;@aXGvnrj|ewS-r#QnDioe!~5e zb8dh1F>9}tXkN8xtY&O9&sneSQ!boh`3q8+@WQn9ixB3A5xL5t>gNdKn8`9k3veW? zmp#^2Z0w5Q;MtUASm)KZ*LZYz!u?--&-D3%D|@%mYnvq1O&&ZP@ciMF?)Rs3pNtt@ sjJS4vo0J25ua7O3NUf1lpk>Pc0q$TgLEp2GzW@LL07*qoM6N<$g3>NG&;S4c literal 0 HcmV?d00001 diff --git a/src/main/resources/ps/Screenshot 2025-10-03 164119.png b/src/main/resources/ps/Screenshot 2025-10-03 164119.png new file mode 100755 index 0000000000000000000000000000000000000000..216c22b4ad1edd650a60f98bb95554f5668fe10e GIT binary patch literal 2897 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 vB$zSijX3P|mX1^@s6veP%{00001b5ch_0Itp) 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/ps/Screenshot 2025-10-03 164638.png b/src/main/resources/ps/Screenshot 2025-10-03 164638.png new file mode 100755 index 0000000000000000000000000000000000000000..3c25c1140c2f11ef4cefac902d527f18ca2e0615 GIT binary patch literal 2545 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D35H2TK~zXfHI~b6 zWY=|uzqQXk=hUft6Mu#apvktPAUQE_?5l0qyky3v1!S_y6*fU;L*|IN&)&Br2h4g?po%UTcDh=G40_>cbHeW2kJC;3A4?$>$$Gqgn-|iZHH$xE2y( z)GKi&NOFk)YCJ#si$`S1EmxPPTwSJ|zG&dwhVQ+XBk%nD3%wrqSl@UaK0e^p{F?dc zlEiiB)eQ&tp3!Pu;%iX$hiGTSrii(@n$eOzUw!;7(ZXV@E(A*mAjBXB#ABlf?<<0O zP>|S=rhzP3us@p9Y~{Q>t8;a_L%;8k_CG(r{_ToZm63WO6-)32CB}t-ilP!w1Y;}&Mc+ zHOJ?lZm5}eFm^8NZSS(2Z9^7*O-tW=0pi0|J(>>;Hi;FLFCLgU>eY&QT zw=k}T3pEy6V;RL1CL)*wA`3h?HVQ|DIASmT#pXIC%uAo{ksd9_F_Aj|^ ziVfA(oR+D0^hD@3zNJj+T-hBqaf8J?;_}-W%!O8H5P5?dkM}9Y8xpZpu~NATYYb`v zK^;Z|phOyBGyyyaCZxEm;(J{4gdHNpg_NkSIY@u4CSVgIm0++32z3+kpo+=d8)swGenP=a~_ zjv#`U2C@O-ALAm=@yH#g4IVZM< zm_ZuzXcXApnvz#DUd|ef*N2S95zEsJ%~e9f#aIxp|QumAZTM?Z`iz1_y{ zM*Q~cGk*WgB_WL&JjfUw=RA6SLu^lpG(rF$1h0ZuMUCK%p#mxuBr?c*|8$~9N3U>t z&C7X{my3H8vc>IqPNNbMFF1uD1}^~;Xbl=1zTQUbj_;m-gP$jOZ*j9gD3p3%*cv+a z`%B{Tf-gVake46eBPGsK*1^%=Y4hM=gL(qD<2Aqe_*ZnZ_mCg|+wU}MJmb~eaenhU z>+%4%E|99C76eqN)Iwy?NEwX!GzNz2#Wm-rr_?tYb>BrXcOU~!0wGbhhck}%pCZMG zFJ5%n84daV2W{3BR27JV=7G;Y`jVTAIsNu)$Y1}*FSRJwym-08boC~AUQlxhHaJj& z(Lfm#lUnNCCbedb%9UJQUXX~zR0fCkstr;=X!qDVZ69c?qfn3Q428^kE+2C2sol7g0x2A1y=;D z4@d|g0WX50SPcl_?sSB~{stHQn(@V-u=iN07Q)$gF|lo7Ou!Oor4jdDTT$zN!g4Jb zzuKXk?Zdi`sd6kUP>;vsy~9XFM1@ovbhCjnfCftAP^l1A67^X11W_;sZ!Ecqxms9e z>mktQ?8`Re^DXLT7i%ga6$mN4!Gx^+8I|)~-B`@JD9Nh|@j~p{#J)*{y~`gIkp}&q zk}tTK|vKHg{@H+ zQ%|V8p$Z;rgvdAy0nvyk+R)!xQme07`;7BRhq8PPb3L6>;3y+cE(K%}$8YWN_`L(( z{Gh|=jaM|c#|(x!#>}Y2F@izVAXuzetQay9j5^x;8R=m{XgdfMi5C)$u)!cyXfT8j z)7vU(_O2;p!PPutvOIubG5g1LlJ1((n=O9ulOgZ_Xuvx^FnsU(F~P04I9(&gFdTWZ z`jV>L5F3ZJ6~^W`$#LQ+sTZorTuM1ATy#*gwOe;)bc>nzs5$7ysJ)S;K5Yr}Lur>uT z*m}zTy91Iw+%9vTeRam_yNX8HL41S(5Qh@e$Q)a{3+mg?C_=$(e#m^XN41DZ;}m)G zAOBn1TW@i4c}ZS6LXm;%5#7Zy5soKs1|B{MyqdfO?P5)b_1bfAcnmRYA{etFUpv0~ znmBB&1@g0HgK~)>WJu zRD``FC25Tb#-IqQF{dXR%({bU4S+}$qjzEiP#kHNvooyN8lIBJhGl-h?7#H?`eczU_PFPilB`mC2F^GicB?s0gq zq}l$2*m&fpzxa18t2OP`5l_EKn2twmRu&P95-?&B0YnLK=V)~(0WlsU1|v$nu_9}) z8SGW~XiU;h$Oa?U(GE|)ctw5^(HS%`(SY&SPl;+myHm2$8`G#?kk~be5#%pF{7_M- z@+~gUJ3M*vgr`qmaD62R2}UwRAOykt2oo8M^>@JQg3(cpT62L(W+dr~_D%Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2k%KlK~zXfEtW}- zWLFV|zqt1eIaO9>RaRzA-BsP~ZnxbQY8hl9OIS!)AYf_!3J6vR@eA0qXNOp@LkOXU z4YD!dHpcF$da5bs;k|s*y}_cqifzP+h;u&K{q00YuO@6%mTqmuojV~L^%Ig>3)|kq zw+5_zlTZKgl=*2&J#Wz{H&GOi0*Z)$IE*S*3;fZ$XSF{lp_aRjtz)-O4}dBJ#?ar){QXH(?(*Dv+PVaDe6my~8r!9J(; zJDjgll39*C^K9e|0*z5`K`a#(RR`7}>b};-Un!%2Dk>HcOQj`(peh*25d(7UTUqU0>L^YyRPbrR4Dv*L8%&=yG1PiwJ zExWq`fh1TwMie6%-WLd9RWWKYDj3ZOh*4)SSky;Y36PKe_&`_Xl8d}S!foccW%_zT zJ+Z{DjZgzEQ7u6NJQiCwy#38C?dzWNVZ!)P!Oq5-Ry@SJl;yI{>8m<8N7NHorN0yM);o2s-}Qt$8B4q3>C+Ke5>rV*2Q|9L5Po1@(eRj^OF{19lG=gtg}+ zdBVl4&TJx#Uze1b5C##U^#oyongTUSx{mno|59d|&^?5_9P!}K|KV?cddRbfW1f7r zB$?ESf(D&!PoZbX;Fqt}`w(9^tO%$>B*g22t#+N`n<)}~fsulf@gA$@x2SYMnJLB# zm21(9FX^|xq7htTHDES5;OV1nY+PefJtblbqg|}l08cH>dE-`tC|nbSYrgpEpBP^S zXazW zzKLIWqztGLV|_#`jOn&s5Slq90h7{_(8QZIl?Fu8z$&NZ1J#^$dX8vGW<6PCFs&6w-A|B6NoohI>^+ucpCoY@Z?J%qn8MU>rU{{;(LTl6 zA+xDxzN}L@FuuaP`(cmoe$?UpA8k>^V`lj!Pfmu6CLt;fAVAbom}G-R2zm}fVbuQzcj*m{J#|A$jW zL*|o`;rRmR6qkD5xxdBUQNrcLC&VcK{!2=Fc8l)uZK^vh8ru=qk8`A!^Lhan&(~Bh z6f+e}8D0&5Vlc#^|hYd-U#sX*j0KF^?WhNiR$4+Q7O9^ol<$N*op(9+YhM z9+TNMqx?3L#Wss`Pp96YEOYWzj`V+es%ipIk4TA#!}x&GIBLC;!SyCLZ*_<*gs#Tx zmoplB9X@}4!g!jJuM47K2U8hTJPw1Am;fONQ}*{)w0q}BoHHr+n5>Q%o)t7TB2YuJ zO4z6?GWgk8JpdKPR9964oC*>^5o9=7fg~7PUO|pVsB0o+jCf1zBUA+y@PL?#W;3Nf z$Z2&ZQcbE#9CNG*}I1Y&7BMXoU=ZK2oO+F(sk~RSRG5R*d4s zW!ip&#}^KBQPJPppln7Y(6TDPc&?^?BHP8m$ z2dH`sifDz!U?swuH87#uOBftK!}dPL?97qD8%&}%Ie9o@@Tzv+#;JO^NXvM7BcJ;M7ogy~-nUlsQp2pb>Q0+W$MP zc1|N+6KzD$-)Af>P99ZcF9#Hr5_e&CHltqD*s8()?kTnQ6O3IDN`O`PKTha2sZ;Bg QCjbBd07*qoM6N<$f&xF_HUIzs literal 0 HcmV?d00001 diff --git a/src/main/resources/t1.png b/src/main/resources/t1.png new file mode 100644 index 0000000000000000000000000000000000000000..c34f2ec81376aae6e70c87aa0763acecd5ee3aae GIT binary patch literal 16585 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�igfR1waCSs}dIGfUc?+xU911Q~KP06TZfJzo@t**umU%tbk{@HX;MC zSw}(RRY~OTll{+weGqAdO^>M%Sz-UaW1$+mm;JvjkB?mhG>^g4)z4*}Q$iB}(9sbd literal 0 HcmV?d00001 diff --git a/src/main/resources/t2.png b/src/main/resources/t2.png new file mode 100644 index 0000000000000000000000000000000000000000..72041a14908b0e729beee95652ff79ebeae3c09e GIT binary patch literal 17118 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