From 3a37456337e49b210c9b09cd096cc8f0a4e2f97f Mon Sep 17 00:00:00 2001 From: Thastertyn <60262101+Thastertyn@users.noreply.github.com> Date: Tue, 28 Feb 2023 21:08:53 +0100 Subject: [PATCH] Tabs, rozvrh + znamky tabs --- .vscode/launch.json | 21 +++ src/main/java/xyz/thastertyn/App.java | 43 ----- src/main/java/xyz/thastertyn/Connection.java | 15 -- src/main/java/xyz/thastertyn/Download.java | 5 - .../java/xyz/thastertyn/Jecna/Dochazka.java | 7 +- .../java/xyz/thastertyn/Jecna/Jidelna.java | 5 + src/main/java/xyz/thastertyn/Jecna/Login.java | 74 ++++++-- .../java/xyz/thastertyn/Jecna/Znamky.java | 70 +++++--- src/main/java/xyz/thastertyn/Predmet.java | 8 - .../java/xyz/thastertyn/RozvrhDownload.java | 5 - .../Window/Content/JecnaContent.java | 29 ++++ .../thastertyn/Window/Content/Jidelna.java | 5 + .../xyz/thastertyn/Window/Content/Rozvrh.java | 70 ++++++++ .../xyz/thastertyn/Window/Content/Znamky.java | 127 ++++++++++++++ .../java/xyz/thastertyn/Window/Login.java | 162 ++++++++++++++++-- .../xyz/thastertyn/Window/LoginDialog.java | 112 ------------ .../xyz/thastertyn/Window/MainWindow.java | 62 +++---- .../java/xyz/thastertyn/Window/Rozvrh.java | 62 ------- .../Window/WindowSwitchListener.java | 123 +++++++++++++ target/classes/xyz/thastertyn/App.class | Bin 678 -> 678 bytes .../classes/xyz/thastertyn/Connection.class | Bin 808 -> 0 bytes target/classes/xyz/thastertyn/Download.class | Bin 279 -> 0 bytes .../xyz/thastertyn/Jecna/Dochazka.class | Bin 1255 -> 1287 bytes .../xyz/thastertyn/Jecna/Jidelna.class | Bin 0 -> 288 bytes .../classes/xyz/thastertyn/Jecna/Login.class | Bin 3378 -> 4699 bytes .../classes/xyz/thastertyn/Jecna/Znamky.class | Bin 5108 -> 5947 bytes target/classes/xyz/thastertyn/Predmet.class | Bin 276 -> 0 bytes .../xyz/thastertyn/RozvrhDownload.class | Bin 297 -> 0 bytes .../Window/Content/JecnaContent.class | Bin 0 -> 734 bytes .../thastertyn/Window/Content/Jidelna.class | Bin 0 -> 306 bytes .../thastertyn/Window/Content/Rozvrh.class | Bin 0 -> 2652 bytes .../thastertyn/Window/Content/Znamky.class | Bin 0 -> 4964 bytes .../classes/xyz/thastertyn/Window/Login.class | Bin 1367 -> 6428 bytes .../xyz/thastertyn/Window/LoginDialog.class | Bin 5126 -> 0 bytes .../xyz/thastertyn/Window/MainWindow.class | Bin 3753 -> 4008 bytes .../xyz/thastertyn/Window/Rozvrh.class | Bin 2346 -> 0 bytes .../Window/WindowSwitchListener.class | Bin 0 -> 5762 bytes 37 files changed, 660 insertions(+), 345 deletions(-) create mode 100644 .vscode/launch.json delete mode 100644 src/main/java/xyz/thastertyn/Connection.java delete mode 100644 src/main/java/xyz/thastertyn/Download.java create mode 100644 src/main/java/xyz/thastertyn/Jecna/Jidelna.java delete mode 100644 src/main/java/xyz/thastertyn/Predmet.java delete mode 100644 src/main/java/xyz/thastertyn/RozvrhDownload.java create mode 100644 src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java create mode 100644 src/main/java/xyz/thastertyn/Window/Content/Jidelna.java create mode 100644 src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java create mode 100644 src/main/java/xyz/thastertyn/Window/Content/Znamky.java delete mode 100644 src/main/java/xyz/thastertyn/Window/LoginDialog.java delete mode 100644 src/main/java/xyz/thastertyn/Window/Rozvrh.java create mode 100644 src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java delete mode 100644 target/classes/xyz/thastertyn/Connection.class delete mode 100644 target/classes/xyz/thastertyn/Download.class create mode 100644 target/classes/xyz/thastertyn/Jecna/Jidelna.class delete mode 100644 target/classes/xyz/thastertyn/Predmet.class delete mode 100644 target/classes/xyz/thastertyn/RozvrhDownload.class create mode 100644 target/classes/xyz/thastertyn/Window/Content/JecnaContent.class create mode 100644 target/classes/xyz/thastertyn/Window/Content/Jidelna.class create mode 100644 target/classes/xyz/thastertyn/Window/Content/Rozvrh.class create mode 100644 target/classes/xyz/thastertyn/Window/Content/Znamky.class delete mode 100644 target/classes/xyz/thastertyn/Window/LoginDialog.class delete mode 100644 target/classes/xyz/thastertyn/Window/Rozvrh.class create mode 100644 target/classes/xyz/thastertyn/Window/WindowSwitchListener.class diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..79763db --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Current File", + "request": "launch", + "mainClass": "${file}" + }, + { + "type": "java", + "name": "Launch App", + "request": "launch", + "mainClass": "xyz.thastertyn.App", + "projectName": "jecnak-tui" + } + ] +} \ No newline at end of file diff --git a/src/main/java/xyz/thastertyn/App.java b/src/main/java/xyz/thastertyn/App.java index dcdb9b4..29eec7c 100644 --- a/src/main/java/xyz/thastertyn/App.java +++ b/src/main/java/xyz/thastertyn/App.java @@ -1,6 +1,5 @@ package xyz.thastertyn; -import xyz.thastertyn.Jecna.*; import xyz.thastertyn.Window.MainWindow; /** @@ -20,49 +19,7 @@ public class App { - //#region Jidelna - //#region JSESSIONID - Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/") - .header("Connection", "keep-alive") - .method(Method.HEAD) - .execute(); - - String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID"); - String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN"); - //#endregion - - //#region CSRF - String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp") - .header("Connection", "keep-alive") - .cookie("XSRF-TOKEN", XSRF_TOKEN) - .cookie("JSESSIONID", jidelnaJSESSIONID) - .get() - .select("input[name=_csrf]") - .attr("value"); - - - if(!XSRF_TOKEN.equals(csrf)) - { - throw new SecurityException("CSRF tokens do not match, something is up"); - } - //#endregion - - //#region Login - Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check") - .header("Connection", "keep-alive") - .header("Content-Type", "application/x-www-form-urlencoded") - .cookie("XSRF-TOKEN", XSRF_TOKEN) - .cookie("JSESSIONID", jidelnaJSESSIONID) - .data("j_username", Credentials.user) - .data("j_password", Credentials.pass) - .data("terminal", "false") - .data("type", "web") - .data("_csrf", XSRF_TOKEN) - .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false") - .method(Method.POST) - .execute(); - //#endregion Document obedy = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/secured/month.jsp?terminal=false&keyboard=&printer=") .header("Connection", "keep-alive") diff --git a/src/main/java/xyz/thastertyn/Connection.java b/src/main/java/xyz/thastertyn/Connection.java deleted file mode 100644 index 1d5dbbf..0000000 --- a/src/main/java/xyz/thastertyn/Connection.java +++ /dev/null @@ -1,15 +0,0 @@ -package xyz.thastertyn; - -import org.jsoup.Jsoup; - -public class Connection { - - private static final org.jsoup.Connection CONNECTION = Jsoup.connect("") - .header("Connection", "keep-alive") - .cookie("role", "student"); - - public static org.jsoup.Connection getConnection() - { - return CONNECTION; - } -} diff --git a/src/main/java/xyz/thastertyn/Download.java b/src/main/java/xyz/thastertyn/Download.java deleted file mode 100644 index be16dd4..0000000 --- a/src/main/java/xyz/thastertyn/Download.java +++ /dev/null @@ -1,5 +0,0 @@ -package xyz.thastertyn; - -public class Download { - -} diff --git a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java index 900d7e7..ab34da4 100644 --- a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java +++ b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java @@ -3,9 +3,9 @@ package xyz.thastertyn.Jecna; import java.io.IOException; import java.util.HashMap; +import org.jsoup.Jsoup; import org.jsoup.nodes.Document; -import xyz.thastertyn.Connection; import xyz.thastertyn.Tuple.Pair; public class Dochazka { @@ -18,9 +18,10 @@ public class Dochazka { try { // absence-list - absenceDoc = Connection.getConnection() + absenceDoc = Jsoup.connect("https://www.spsejecna.cz" + "/absence/passing-student") .cookie("JSESSIOND", JSESSIOND) - .url("https://www.spsejecna.cz" + "/absence/passing-student") + .cookie("role", "student") + .header("Connection", "keep-alive") .get(); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/xyz/thastertyn/Jecna/Jidelna.java b/src/main/java/xyz/thastertyn/Jecna/Jidelna.java new file mode 100644 index 0000000..48b4871 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Jecna/Jidelna.java @@ -0,0 +1,5 @@ +package xyz.thastertyn.Jecna; + +public class Jidelna { + +} diff --git a/src/main/java/xyz/thastertyn/Jecna/Login.java b/src/main/java/xyz/thastertyn/Jecna/Login.java index 8cc25be..385301e 100644 --- a/src/main/java/xyz/thastertyn/Jecna/Login.java +++ b/src/main/java/xyz/thastertyn/Jecna/Login.java @@ -4,9 +4,12 @@ import java.io.File; import java.io.IOException; import java.net.UnknownHostException; +import javax.security.auth.login.CredentialException; + import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.Connection.Method; +import org.jsoup.nodes.Document; public class Login { @@ -23,7 +26,7 @@ public class Login { *
  • {@code false} neexistuje, nebo jsou prazdne
  • * */ - public boolean getCredentials() + public boolean checkForCredentials() { File credentials = null; @@ -67,9 +70,8 @@ public class Login { return Jsessionid; } - public byte login(String user, String pass) + public void loginJecna(String user, String pass) throws UnknownHostException, IOException, CredentialException { - try { //#region JSESSIONID Connection.Response response = Jsoup.connect("https://www.spsejecna.cz") .header("Connection", "keep-alive") @@ -89,7 +91,7 @@ public class Login { //#endregion //#region Login - Connection.Response login = Jsoup.connect("https://www.spsejecna.cz/user/login") + Jsoup.connect("https://www.spsejecna.cz/user/login") .method(Connection.Method.POST) .header("Content-Type", "application/x-www-form-urlencoded") //.header("Content-Length", "71") Adds 10 seconds to total request time @@ -105,17 +107,63 @@ public class Login { .execute(); //#endregion + Document test = Jsoup.connect("https://www.spsejecna.cz/score/student") + .header("Connection", "keep-alive") + .cookie("JSESSIONID", Jsessionid) + .cookie("role", "student") + .get(); + + if(test.toString().contains("Pro pokračování se přihlaste do systému")) + { + throw new CredentialException("Incorrect username or password"); + } + start = System.currentTimeMillis() / 1000L; lastCheck = start; + } - return 0; - } catch(UnknownHostException e) - { - // Not connected to internet - return 127; - } catch(IOException e) - { - return 126; - } + public void loginJidelna() throws UnknownHostException, IOException + { + //#region JSESSIONID + Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/") + .header("Connection", "keep-alive") + .method(Method.HEAD) + .execute(); + + String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID"); + String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN"); + //#endregion + + //#region CSRF + String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp") + .header("Connection", "keep-alive") + .cookie("XSRF-TOKEN", XSRF_TOKEN) + .cookie("JSESSIONID", jidelnaJSESSIONID) + .get() + .select("input[name=_csrf]") + .attr("value"); + + + if(!XSRF_TOKEN.equals(csrf)) + { + throw new SecurityException("CSRF tokens do not match, something is up"); + } + //#endregion + + //#region Login + Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check") + .header("Connection", "keep-alive") + .header("Content-Type", "application/x-www-form-urlencoded") + .cookie("XSRF-TOKEN", XSRF_TOKEN) + .cookie("JSESSIONID", jidelnaJSESSIONID) + .data("j_username", Credentials.user) + .data("j_password", Credentials.pass) + .data("terminal", "false") + .data("type", "web") + .data("_csrf", XSRF_TOKEN) + .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false") + .method(Method.POST) + .execute(); + //#endregion } } diff --git a/src/main/java/xyz/thastertyn/Jecna/Znamky.java b/src/main/java/xyz/thastertyn/Jecna/Znamky.java index 82fa990..6996cf1 100644 --- a/src/main/java/xyz/thastertyn/Jecna/Znamky.java +++ b/src/main/java/xyz/thastertyn/Jecna/Znamky.java @@ -1,9 +1,10 @@ package xyz.thastertyn.Jecna; import java.io.IOException; +import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -15,17 +16,20 @@ public class Znamky { private boolean wasDownloaded; - // key (String) reprezentuje predmet, value (arraylist) znamky a pair znamku s jeji vahou - private HashMap>> grades = new HashMap<>(); + private ArrayList>,Double>>> grades = new ArrayList<>(); - public void addGrade(String subject, int grade, double weight) + public void addGrade(int index, String subject, int grade, double weight) { - grades.get(subject).add(new Pair(grade, weight)); + Pair znamka = new Pair<>(grade, weight); + + grades.get(index).getValue1().getValue0().add(znamka); } public void addSubject(String subject) { - grades.put(subject, new ArrayList>()); + Pair>, Double> p = new Pair<>(new ArrayList>(), 0.0); + + grades.add(new Pair<>(subject, p)); } private double getAverage(ArrayList> a) @@ -39,7 +43,8 @@ public class Znamky { divisor += p.getValue1(); } - return (double) divident / divisor; + double prumer = (double) divident / divisor; + return (double) Math.round(prumer * 100) / 100; }catch(ArithmeticException e) { @@ -47,17 +52,10 @@ public class Znamky { } } - public byte downloadZnamky(final String Jsessionid) + public void downloadZnamky(final String Jsessionid) throws UnknownHostException, IOException { wasDownloaded = true; - Document znamkyDoc = null; - - try { - znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get(); - } catch (IOException e) { - e.printStackTrace(); - return 127; - } + Document znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get(); Elements rows = znamkyDoc.select("table.score").select("tr"); @@ -68,25 +66,43 @@ public class Znamky { rows_split[i] = rows.get(i).children(); } + int subj = 0; + for(int i = 1; i < rows_split.length; i++) { - String predmet = rows_split[i].get(0).text(); + String predmetFull = rows_split[i].get(0).text(); + + Matcher matcher = Pattern.compile("\\((.*)\\)").matcher(predmetFull); + + String predmet = matcher.find() ? matcher.group(1) : predmetFull; addSubject(predmet); - for(Element e : rows_split[i].get(1).select("a.score")) + for(Element znamkaElement : rows_split[i].get(1).select("a.score")) { - int znamka = Integer.parseInt(e.select("span.value").text()); + if(znamkaElement == null) + { + break; + } + + int znamka = Integer.parseInt(znamkaElement.select("span.value").text()); // Mala znamka se bude pocitat jako polovicni vaha - if(e.hasClass("scoreSmall")) + if(znamkaElement.hasClass("scoreSmall")) { - addGrade(predmet, znamka, 0.5); + addGrade(subj, predmet, znamka, 0.5); }else{ - addGrade(predmet, znamka, 1); + addGrade(subj, predmet, znamka, 1); } } + + grades.get(subj).getValue1().setValue1(getAverage(grades.get(subj).getValue1().getValue0())); + subj++; } - return 0; + } + + public ArrayList>,Double>>> getGrades() + { + return grades; } @Override @@ -96,11 +112,9 @@ public class Znamky { { String s = ""; - for(Map.Entry>> entry : grades.entrySet()) + for(Pair>,Double>> p : grades) { - double prumer = getAverage(entry.getValue()); - double p = (double) Math.round(prumer * 100) / 100; - s += entry.getKey() + " | " + entry.getValue().toString() + " { " + p + " }\n"; + s += p.getValue0() + " | " + p.getValue1().getValue0().toString() + " { " + p.getValue1().getValue1() + " } "; } return s; }else{ diff --git a/src/main/java/xyz/thastertyn/Predmet.java b/src/main/java/xyz/thastertyn/Predmet.java deleted file mode 100644 index 3e8f98a..0000000 --- a/src/main/java/xyz/thastertyn/Predmet.java +++ /dev/null @@ -1,8 +0,0 @@ -package xyz.thastertyn; - -import java.util.ArrayList; - -public class Predmet { - - -} diff --git a/src/main/java/xyz/thastertyn/RozvrhDownload.java b/src/main/java/xyz/thastertyn/RozvrhDownload.java deleted file mode 100644 index 0267187..0000000 --- a/src/main/java/xyz/thastertyn/RozvrhDownload.java +++ /dev/null @@ -1,5 +0,0 @@ -package xyz.thastertyn; - -public class RozvrhDownload { - -} diff --git a/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java b/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java new file mode 100644 index 0000000..2967d90 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java @@ -0,0 +1,29 @@ +package xyz.thastertyn.Window.Content; + +import com.googlecode.lanterna.gui2.Panel; + +/** + * Wrapper to include all classes that deal with content in some way + */ +public class JecnaContent { + + public Panel getPanel() + { + return null; + } + + public void download(String s) + { + + } + + public boolean hasStarted() + { + return false; + } + + public String getLabel() + { + return ""; + } +} diff --git a/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java b/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java new file mode 100644 index 0000000..62fb593 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java @@ -0,0 +1,5 @@ +package xyz.thastertyn.Window.Content; + +public class Jidelna { + +} diff --git a/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java new file mode 100644 index 0000000..b8aeb0f --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java @@ -0,0 +1,70 @@ +package xyz.thastertyn.Window.Content; + +import java.io.IOException; +import java.net.UnknownHostException; + +import com.googlecode.lanterna.gui2.Label; +import com.googlecode.lanterna.gui2.Panel; +import com.googlecode.lanterna.gui2.table.Table; + +public class Rozvrh extends JecnaContent { + + private Panel rozvrhPanel = new Panel(); + + private boolean hasStarted = false; + + private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh(); + + //private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"}; + private String[] labels = {"Den", "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10."}; + + String[] days = {"PO", "UT", "ST", "CT", "PA"}; + + Table t = new Table<>(labels); + + @Override + public void download(String Jsessionid) + { + try{ + rozvrh.downloadRozvrh(Jsessionid); + + String[][] r = rozvrh.getRozvrh(); + + String[] s = new String[labels.length]; + + for(int i = 0; i < r.length; i++) + { + s[0] = days[i]; + for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; } + + t.getTableModel().addRow(s); + } + rozvrhPanel.addComponent(t); + hasStarted = true; + }catch(UnknownHostException e) + { + rozvrhPanel.addComponent(new Label("A connection error occurred")); + }catch(IOException e) + { + rozvrhPanel.addComponent(new Label("An error occurred")); + } + } + + @Override + public boolean hasStarted() + { + return hasStarted; + } + + @Override + public Panel getPanel() + { + return rozvrhPanel; + } + + @Override + public String getLabel() + { + return "Rozvrh"; + } +} diff --git a/src/main/java/xyz/thastertyn/Window/Content/Znamky.java b/src/main/java/xyz/thastertyn/Window/Content/Znamky.java new file mode 100644 index 0000000..acac87f --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/Content/Znamky.java @@ -0,0 +1,127 @@ +package xyz.thastertyn.Window.Content; + +import java.io.IOException; +import java.util.ArrayList; + +import com.googlecode.lanterna.TextColor; +import com.googlecode.lanterna.graphics.SimpleTheme; +import com.googlecode.lanterna.gui2.Direction; +import com.googlecode.lanterna.gui2.Label; +import com.googlecode.lanterna.gui2.LinearLayout; +import com.googlecode.lanterna.gui2.Panel; +import xyz.thastertyn.Tuple.Pair; + +public class Znamky extends JecnaContent { + + private Panel znamkyPanel = new Panel().setLayoutManager(new LinearLayout(Direction.HORIZONTAL)); + + private xyz.thastertyn.Jecna.Znamky znamky = new xyz.thastertyn.Jecna.Znamky(); + + private boolean hasStarted = false; + + @Override + public void download(String JsessionId) + { + try{ + znamky.downloadZnamky(JsessionId); + + Panel predmetyPanel = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL)); + Panel znamkyP = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL)); + Panel vyslPanel = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL)); + + ArrayList>,Double>>> grades = znamky.getGrades(); + + for(Pair>,Double>> predmet : grades) + { + predmetyPanel.addComponent(new Label(predmet.getValue0())); + + Panel znamkyZPredmetu = new Panel().setLayoutManager(new LinearLayout(Direction.HORIZONTAL)); + + if(predmet.getValue1().getValue0().isEmpty()) + { + znamkyZPredmetu.addComponent(new Label("")); + } + + for(Pair znamka : predmet.getValue1().getValue0()) + { + // TODO pridat predmet.getValue0() ktery premeni znamky na jmeno predmetu jako funkci (not a bug, its a feature) + Label znamkaLabel = new Label(znamka.getValue0() + ""); + switch(znamka.getValue0()) + { + case 1: + znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.GREEN)); + break; + case 2: + znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.BLUE)); + break; + case 3: + znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.YELLOW)); + break; + case 4: + znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.MAGENTA)); + break; + case 5: + znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.RED)); + break; + } + + znamkyZPredmetu.addComponent(znamkaLabel); + } + + znamkyP.addComponent(znamkyZPredmetu); + + double prumer = predmet.getValue1().getValue1(); + + Label vysl = new Label("" + prumer); + + if(prumer >= 1 && prumer < 1.5) + { + vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.GREEN)); + }else if(prumer >= 1.5 && prumer < 2.5) + { + vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.BLUE)); + + }else if(prumer >= 2.5 && prumer < 3.5) + { + vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.YELLOW)); + + }else if(prumer >= 3.5 && prumer < 4.5) + { + vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.MAGENTA)); + }else if(prumer >= 4.5) + { + vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.RED)); + } + + vyslPanel.addComponent(vysl); + } + + znamkyPanel.addComponent(predmetyPanel); + znamkyPanel.addComponent(znamkyP); + znamkyPanel.addComponent(vyslPanel); + + hasStarted = true; + }catch(IOException e) + { + znamkyPanel.addComponent(new Label("An error has occured")); + } + } + + @Override + public Panel getPanel() + { + return znamkyPanel; + } + + @Override + public boolean hasStarted() + { + return hasStarted; + } + + @Override + public String getLabel() + { + return "Znamky"; + } +} diff --git a/src/main/java/xyz/thastertyn/Window/Login.java b/src/main/java/xyz/thastertyn/Window/Login.java index 1253417..ed3dd78 100644 --- a/src/main/java/xyz/thastertyn/Window/Login.java +++ b/src/main/java/xyz/thastertyn/Window/Login.java @@ -1,36 +1,164 @@ package xyz.thastertyn.Window; +import java.io.IOException; +import java.net.UnknownHostException; +import java.util.Arrays; + +import javax.security.auth.login.CredentialException; + +import com.googlecode.lanterna.TerminalSize; +import com.googlecode.lanterna.gui2.Button; +import com.googlecode.lanterna.gui2.EmptySpace; +import com.googlecode.lanterna.gui2.GridLayout; +import com.googlecode.lanterna.gui2.Label; +import com.googlecode.lanterna.gui2.LocalizedString; +import com.googlecode.lanterna.gui2.Panel; +import com.googlecode.lanterna.gui2.TextBox; +import com.googlecode.lanterna.gui2.Window; import com.googlecode.lanterna.gui2.WindowBasedTextGUI; +import com.googlecode.lanterna.gui2.GridLayout.Alignment; +import com.googlecode.lanterna.gui2.dialogs.DialogWindow; +import com.googlecode.lanterna.gui2.dialogs.MessageDialog; +import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton; -public class Login { - - String user = ""; - String pass = ""; +public class Login extends DialogWindow { - xyz.thastertyn.Jecna.Login login = new xyz.thastertyn.Jecna.Login(); + private TextBox username; + private TextBox password; + private String user; + private String pass; - LoginDialog dialog = new LoginDialog("Login", "Enter your username and password"); + private xyz.thastertyn.Jecna.Login login = new xyz.thastertyn.Jecna.Login(); - public void showDialog(WindowBasedTextGUI textGUI) + Login() { - String[] input = dialog.showDialog(textGUI); + super("Login"); + this.user = null; + this.pass = null; + this.username = new TextBox(); + this.password = new TextBox().setMask('*'); - user = input[0]; - pass = input[1]; + Panel buttonPanel = new Panel(); + buttonPanel + .setLayoutManager( + new GridLayout(2).setHorizontalSpacing(1)) + .addComponent( + new Button(LocalizedString.OK.toString(), this::onOK) + .setLayoutData(GridLayout.createLayoutData( + GridLayout.Alignment.CENTER, + GridLayout.Alignment.CENTER, + true, + false))) + .addComponent( + new Button(LocalizedString.Cancel.toString(), this::onCancel)); - login(); + Panel mainPanel = new Panel() + .setLayoutManager(new GridLayout(1) + .setLeftMarginSize(1) + .setRightMarginSize(1)); + + mainPanel.addComponent(new Label("Enter your username and password")); + + mainPanel.addComponent(new EmptySpace(TerminalSize.ONE)); + + Panel userPanel = new Panel() + .setLayoutManager(new GridLayout(3)) + .setLayoutData( + GridLayout.createLayoutData( + GridLayout.Alignment.FILL, + Alignment.CENTER, + true, + false)); + + this.username.setLayoutData( + GridLayout.createLayoutData( + GridLayout.Alignment.FILL, + GridLayout.Alignment.CENTER, + true, + false)); + + userPanel.addComponent(new Label("Username: ")) + .addComponent(username) + .addTo(mainPanel); + + this.password + .setLayoutData( + GridLayout.createLayoutData(GridLayout.Alignment.FILL, + GridLayout.Alignment.CENTER, + true, + false)) + .addTo(mainPanel); + + Panel passPanel = new Panel() + .setLayoutManager(new GridLayout(3)) + .setLayoutData(GridLayout.createLayoutData( + GridLayout.Alignment.FILL, + Alignment.CENTER, + true, + false)); + + passPanel.addComponent(new Label("Password: ")) + .addComponent(password) + .addTo(mainPanel); + + mainPanel.addComponent(new EmptySpace(TerminalSize.ONE)); + + buttonPanel.setLayoutData( + GridLayout.createLayoutData( + Alignment.END, + Alignment.CENTER, + false, false)) + .addTo(mainPanel); + + setHints(Arrays.asList(Window.Hint.CENTERED)); + setComponent(mainPanel); } - private void login() + public void onOK() { - login.login(user, pass); + this.user = username.getText(); + this.pass = password.getText(); - user = null; - pass = null; + if (user.isEmpty() || pass.isEmpty()) + { + MessageDialog.showMessageDialog(getTextGUI(), getTitle(), "Username and password cannot be blank", + MessageDialogButton.OK); + return; + } + + try + { + login.loginJecna(user, pass); + } catch (UnknownHostException e) { + MessageDialog.showMessageDialog(getTextGUI(), "No Internet connection", + "There seems to be no internet connection, reverting to cached data", MessageDialogButton.OK); + return; + } catch (CredentialException e) + { + MessageDialog.showMessageDialog(getTextGUI(), "Incorrect username or password", + "The username or password you entered is incorrect", MessageDialogButton.OK); + return; + } catch (IOException e) + { + MessageDialog.showMessageDialog(getTextGUI(), "There was an error", "Maybe try again and it will go away", + MessageDialogButton.OK); + return; + } + + close(); } - public String getJsessionId() - { + public String getJessionId() { return login.getJSESSIONID(); } + + public void onCancel() { + close(); + } + + @Override + public String[] showDialog(WindowBasedTextGUI textGUI) { + super.showDialog(textGUI); + return new String[] { user, pass }; + } } diff --git a/src/main/java/xyz/thastertyn/Window/LoginDialog.java b/src/main/java/xyz/thastertyn/Window/LoginDialog.java deleted file mode 100644 index f7296f4..0000000 --- a/src/main/java/xyz/thastertyn/Window/LoginDialog.java +++ /dev/null @@ -1,112 +0,0 @@ -package xyz.thastertyn.Window; - -import com.googlecode.lanterna.TerminalSize; -import com.googlecode.lanterna.gui2.Button; -import com.googlecode.lanterna.gui2.EmptySpace; -import com.googlecode.lanterna.gui2.GridLayout; -import com.googlecode.lanterna.gui2.Label; -import com.googlecode.lanterna.gui2.LocalizedString; -import com.googlecode.lanterna.gui2.Panel; -import com.googlecode.lanterna.gui2.TextBox; -import com.googlecode.lanterna.gui2.WindowBasedTextGUI; -import com.googlecode.lanterna.gui2.GridLayout.Alignment; -import com.googlecode.lanterna.gui2.dialogs.DialogWindow; -import com.googlecode.lanterna.gui2.dialogs.MessageDialog; -import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton; - -public class LoginDialog extends DialogWindow { - - private TextBox username; - private TextBox password; - private String user; - private String pass; - - LoginDialog( - String title, - String description - ) - { - super(title); - this.user = null; - this.pass = null; - this.username = new TextBox(); - this.password = new TextBox().setMask('*'); - - Panel buttonPanel = new Panel(); - buttonPanel.setLayoutManager((new GridLayout(2).setHorizontalSpacing(1))); - buttonPanel - .addComponent((new Button(LocalizedString.OK.toString(), this::onOK) - .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.CENTER, GridLayout.Alignment.CENTER, true, false)))); - buttonPanel.addComponent(new Button(LocalizedString.Cancel.toString(), this::onCancel)); - - Panel mainPanel = new Panel(); - mainPanel.setLayoutManager(new GridLayout(1).setLeftMarginSize(1).setRightMarginSize(1)); - - if(description != null) - { - mainPanel.addComponent(new Label(description)); - } - - mainPanel.addComponent(new EmptySpace(TerminalSize.ONE)); - - Panel userPanel = new Panel() - .setLayoutManager(new GridLayout(3)) - .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, Alignment.CENTER, true, false)); - - this.username.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false)); - - userPanel.addComponent(new Label("Username: ")) - .addComponent(username) - .addTo(mainPanel); - - this.password.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false)) - .addTo(mainPanel); - - Panel passPanel = new Panel() - .setLayoutManager(new GridLayout(3)) - .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, Alignment.CENTER, true, false)); - - passPanel.addComponent(new Label("Password: ")) - .addComponent(password) - .addTo(mainPanel); - - mainPanel.addComponent(new EmptySpace(TerminalSize.ONE)); - - buttonPanel.setLayoutData( - GridLayout.createLayoutData( - Alignment.END, - Alignment.CENTER, - false, false)) - .addTo(mainPanel); - - setComponent(mainPanel); - } - - public void onOK() - { - if(username.getText().isEmpty() || password.getText().isEmpty()) - { - MessageDialog.showMessageDialog(getTextGUI(), getTitle(), "Username and password cannot be blank", MessageDialogButton.OK); - return; - } - - this.user = username.getText(); - this.pass = password.getText(); - - close(); - } - - public void onCancel() - { - close(); - } - - @Override - public String[] showDialog(WindowBasedTextGUI textGUI) - { - user = null; - pass = null; - super.showDialog(textGUI); - return new String[] {user, pass}; - } -} diff --git a/src/main/java/xyz/thastertyn/Window/MainWindow.java b/src/main/java/xyz/thastertyn/Window/MainWindow.java index 1b274cb..33e2342 100644 --- a/src/main/java/xyz/thastertyn/Window/MainWindow.java +++ b/src/main/java/xyz/thastertyn/Window/MainWindow.java @@ -2,13 +2,12 @@ package xyz.thastertyn.Window; import java.io.IOException; import java.util.Arrays; - import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.gui2.BasicWindow; -import com.googlecode.lanterna.gui2.Borders; import com.googlecode.lanterna.gui2.DefaultWindowManager; import com.googlecode.lanterna.gui2.Direction; import com.googlecode.lanterna.gui2.EmptySpace; +import com.googlecode.lanterna.gui2.Label; import com.googlecode.lanterna.gui2.LinearLayout; import com.googlecode.lanterna.gui2.MultiWindowTextGUI; import com.googlecode.lanterna.gui2.Panel; @@ -19,58 +18,53 @@ import com.googlecode.lanterna.screen.TerminalScreen; import com.googlecode.lanterna.terminal.DefaultTerminalFactory; import com.googlecode.lanterna.terminal.Terminal; -import xyz.thastertyn.Jecna.Credentials; -import xyz.thastertyn.Jecna.Login; - public class MainWindow { - - Login l = new Login(); + private Terminal terminal; + private Screen screen; + private Window window; + private MultiWindowTextGUI textGUI; + + public void run() { - Terminal terminal = null; try { + //#region init // Setup terminal and screen layers terminal = new DefaultTerminalFactory().createTerminal(); - Screen screen = new TerminalScreen(terminal); + screen = new TerminalScreen(terminal); screen.startScreen(); + // Create window to hold the panel + window = new BasicWindow(); + window.setHints(Arrays.asList(Window.Hint.CENTERED)); + + // Create gui and start gui + textGUI = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT)); + //#endregion + // Create panel to hold components final Panel mainPanel = new Panel(); - mainPanel.setLayoutManager(new LinearLayout(Direction.HORIZONTAL)); + mainPanel.setLayoutManager(new LinearLayout(Direction.VERTICAL)); - // Create window to hold the panel - BasicWindow window = new BasicWindow(); window.setComponent(mainPanel); - window.setHints(Arrays.asList(Window.Hint.CENTERED)); mainPanel.addComponent(new Separator(Direction.VERTICAL).setLayoutData(LinearLayout.createLayoutData(LinearLayout.Alignment.Fill))); - final Panel content = new Panel(); - mainPanel.addComponent(content); + Panel content = new Panel(); + content.addTo(mainPanel); - xyz.thastertyn.Window.Login login = new xyz.thastertyn.Window.Login(); + Login login = new Login(); + login.showDialog(textGUI); - /*Rozvrh r = new Rozvrh(); - r.download(login.getJsessionId()); - - content.addComponent(r.getPanel());*/ + window.addWindowListener(new WindowSwitchListener(content, login.getJessionId())); + + textGUI.addWindowAndWait(window); - // Create gui and start gui - final MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT)); - login.showDialog(gui); - /*KeyStroke k = terminal.readInput(); - if(k.equals(KeyStroke.fromString(""))) - { - window.close(); - }*/ - gui.addWindowAndWait(window); - - - } catch (IOException e) { - e.printStackTrace(); - } + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/xyz/thastertyn/Window/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Rozvrh.java deleted file mode 100644 index 8a8d45f..0000000 --- a/src/main/java/xyz/thastertyn/Window/Rozvrh.java +++ /dev/null @@ -1,62 +0,0 @@ -package xyz.thastertyn.Window; - -import java.io.IOException; -import java.net.UnknownHostException; -import java.util.List; - -import com.googlecode.lanterna.TerminalSize; -import com.googlecode.lanterna.TextColor; -import com.googlecode.lanterna.graphics.SimpleTheme; -import com.googlecode.lanterna.gui2.Direction; -import com.googlecode.lanterna.gui2.Panel; -import com.googlecode.lanterna.gui2.Separator; -import com.googlecode.lanterna.gui2.TextGUIGraphics; -import com.googlecode.lanterna.gui2.table.Table; -import com.googlecode.lanterna.gui2.table.TableCellRenderer; - -public class Rozvrh { - - private Panel rozvrhPanel = new Panel(); - - private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh(); - - private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"}; - - String[] days = {"PO", "UT", "ST", "CT", "PA"}; - - Table t = new Table<>(labels); - - public byte download(String Jsessionid) - { - try - { - rozvrh.downloadRozvrh(Jsessionid); - - String[][] r = rozvrh.getRozvrh(); - - String[] s = new String[labels.length]; - - for(int i = 0; i < r.length; i++) - { - s[0] = days[i]; - for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; } - - t.getTableModel().addRow(s); - } - t.addTo(rozvrhPanel); - - return 0; - }catch(UnknownHostException e) - { - return 127; - }catch(IOException e) - { - return 126; - } - } - - public Panel getPanel() - { - return rozvrhPanel; - } -} diff --git a/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java b/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java new file mode 100644 index 0000000..4a70d2c --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java @@ -0,0 +1,123 @@ +package xyz.thastertyn.Window; + +import java.util.concurrent.atomic.AtomicBoolean; + +import com.googlecode.lanterna.TerminalPosition; +import com.googlecode.lanterna.TerminalSize; +import com.googlecode.lanterna.gui2.Label; +import com.googlecode.lanterna.gui2.Panel; +import com.googlecode.lanterna.gui2.Window; +import com.googlecode.lanterna.gui2.WindowBasedTextGUI; +import com.googlecode.lanterna.gui2.WindowListener; +import com.googlecode.lanterna.input.KeyStroke; +import com.googlecode.lanterna.input.KeyType; + +import xyz.thastertyn.Window.Content.JecnaContent; +import xyz.thastertyn.Window.Content.Rozvrh; +import xyz.thastertyn.Window.Content.Znamky; + +public class WindowSwitchListener implements WindowListener { + + WindowBasedTextGUI gui; + + private JecnaContent[] contents = {new Rozvrh(), new Znamky()}; + + private String JsessionId; + + Panel panel; + Label label; + + int current = 0; + + public WindowSwitchListener(Panel holder, String JsessionId) + { + panel = holder; + this.JsessionId = JsessionId; + this.label = label; + defaultPanel(); + } + + private void defaultPanel() + { + contents[0].download(JsessionId); + panel.removeAllComponents(); + panel.addComponent(contents[0].getPanel()); + //label.setText(contents[0].getLabel()); + } + + public void next() + { + if(current + 1 == contents.length) + { + current = 0; + }else{ + current++; + } + + if(!contents[current].hasStarted()) + { + contents[current].download(JsessionId); + } + + panel.removeAllComponents(); + panel.addComponent(contents[current].getPanel()); + + //label.setText(contents[current].getLabel()); + } + + public void previous() + { + if(current - 1 == -1) + { + current = contents.length - 1; + }else{ + current--; + } + + if(!contents[current].hasStarted()) + { + contents[current].download(JsessionId); + } + panel.removeAllComponents(); + panel.addComponent(contents[current].getPanel()); + + //label.setText(contents[current].getLabel()); + } + + + + @Override + public void onInput(Window basePane, KeyStroke keyStroke, AtomicBoolean deliverEvent) { + KeyType type = keyStroke.getKeyType(); + + switch(type) + { + case Tab: + if(!keyStroke.isShiftDown()) + { + next(); + }else{ + previous(); + } + break; + default: + break; + } + } + + @Override + public void onUnhandledInput(Window basePane, KeyStroke keyStroke, AtomicBoolean hasBeenHandled) { + // TODO Auto-generated method stub + } + + @Override + public void onResized(Window window, TerminalSize oldSize, TerminalSize newSize) { + window.invalidate(); + } + + @Override + public void onMoved(Window window, TerminalPosition oldPosition, TerminalPosition newPosition) { + // TODO Auto-generated method stub + } + +} diff --git a/target/classes/xyz/thastertyn/App.class b/target/classes/xyz/thastertyn/App.class index 8c05ee8d916ff55ddc090c324eade17e126e9041..8fc5f3f79614baaf8f20bb1295a3cec31d6aca30 100644 GIT binary patch delta 31 mcmZ3+x{P&$8WSVuWOXJVUTy{s23`gM20jK62F=M0OlkmLk_7|+ delta 31 mcmZ3+x{P&$8WSVeWOXJVULFPx20jJ>27U$+hLFh(OlkmMrv)(Diu-7K?mt&V4F2t{Dz2E#=_aM;K1gO zP-gE#mIWGKTsT!evX?m#wNC zVQ{UDb~l9Z?7SdEx3*R(LL7|{V?fAqZPeZ7xm5k5EIUOw&21&SLiXD0-)7_*y(Y}^ zf9$Ua>4V+$m0D?kWc-)w!bid!9Du(7GkIgigq1jGAYOc8_`!_;DWe~Q7mgW6hdO2+ Lvm%@@2FQK@MU*?y diff --git a/target/classes/xyz/thastertyn/Jecna/Dochazka.class b/target/classes/xyz/thastertyn/Jecna/Dochazka.class index 5e449962e129bfb14cc0e24a6a3e64ed1fe13f6d..42f6c0eb8800c1502c487945f0bd3bef004a57c2 100644 GIT binary patch delta 438 zcmYL_-A)=&6otPtGj)b3jmaol|9@H#tmCLym13^Ae!EJ>8%M5 z;f;wgCQb3e2k=4kElfAHi8niYo&D{#&N&Z}Q`fzFytxI|$z8c;%5)g-HjH%2Ws+%| zDaBye{t+A;hDWWS(63Qum{r)7u-Vj=PWRIA(+=~BNTHM~mGZ^?>`UH~u!$>%pO^QZ z_So7bS>Zn84lAO6YTfe7jry_fyRSt_lT-}U zbh)bA{iF9$HrVXm8w)cTwrxHrh7QWd<)9u0`C{%@MYlTt!gsEh%$Pd4z{HZ52j18p zCcL?KJ>HmjDer&ddqIy?lOF4eZ|6As{%^L-3zRIyNsm=6wA1ned05Q;1;`l5&c!>Hb%`RV+pb+(jfa6 Di@Q!J delta 371 zcmYL_KTpC?6vfYbttpfm6$-S1g7^mnu?qMXaZv_Hgn`L85z;8e6ob`(i=(SaN8{|` zVoZ!U_yPPPegX#<<82sRZgTGVo%`OsxAK=){``Ia08qg0vwX)&GA0p~5Mj`J{cFQM zXNMKIFEQ9Jy zaCJn%JQkcoUS%ogf#t_tKdm5xB?jTLd*=MGtn4|m5M(#^5FpYXi8tu}SZ0730siCwiyQ-F84e!dsbycWDm;M^ry+tI zWdd#n9;!i7A@~r6pWHBM4LYK9k2vkC5|JLhKu(C1n~P(erfCq8*uW+@;Uc!MO{0ng PNZ>~jaw0K1Bsofdvd}#N diff --git a/target/classes/xyz/thastertyn/Jecna/Jidelna.class b/target/classes/xyz/thastertyn/Jecna/Jidelna.class new file mode 100644 index 0000000000000000000000000000000000000000..b7f18699fdecc733d1084a02b69bea741370bfd6 GIT binary patch literal 288 zcmaJ+u};HK3_Pbv10kgqGeTl(8TuABDi$P$Dk=l0yOUb; zxGMh3a7W0Vn@wBEqYaz#W43XKg==UCeFw@Ejw`0B%s~Um%{NZI)QFHNhBkEIOff&y NiE>XB;ao97e-BA#K6d~B literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Jecna/Login.class b/target/classes/xyz/thastertyn/Jecna/Login.class index f8ffa277b96031a11b2beeb2b7f80b7c47e4fce6..572fe36a60ac3b1e9dc54413698a52330c270ed3 100644 GIT binary patch delta 2625 zcma)8dvp}l8UNkvV`i5r372SD9(F;4lGoUS*aJ0M4M`=E2MHJuAxw5B+1ba;GBX

    6PrreS*ZbSkl_EWbq`}=o64*nB~RDilHeIHsB(L zV9YR5nku5-*%P>euf;8{q1(;ovl2dsyz^S%(%AzHT+_2Td$q1))H>TpsrvjiVcd$X z0zS_$&3P*@jZ(f1w>zH>)?M{QhCrW^&Z%L13EKqR$q*UG#ZuFRf!vT*GX$n3VY{1& zU$Jdd#NE!b!OJd*;~ohP613db+Ob^3y$lk8XVZq7<^5So_&!Gx=H_=%39Y6^WQ(|; zyiFrbw!I93W#?S3MC>D%V#aP&`z3r8-Q*cpY(+$ah(-~Ql8cq=&S>QRIKzc)74-`$ z7B18h>5BUK71w^;((EeBqv&fAzK(AY%{@jsZESE33Kc;S-(;BU>^a;o`DqBnS{g zU^p%z1kq_0Wzlb|md!BTc{4CQPmmU`i56GWI)U+BDkEXrS!fZKagj*d|%T_efzYJK7s-mbc!}&?4eA!-D^BZ;ujFExJ&7BCR%QWkvjuVafz~ zb;T^RXN`atN%P(%O)Gk@+%a+=C)~UrGt8@}9HJh*mJ6D0*wKt)#}d_1%gCs9f*_A- zRy3Cl;{{ZU_!&c8G0*n@Rb;Zu%DR+wjkba=ug8dZnQBjVjq(t}&+$tEzhH>&D7zp( z-Xloa4Ip)#@!UtLa^25LXml;Vc7>su8BJHxB7RG^rbkIzB;eOcptdLT^9;TXYPX0# zkkvy*#2XADTQPf8dxc5+{>;!S7g4p;JasKKE@zY?xYvw^uk#|$wQR-CS#`FVQ|G$H zk$J?DQv16N#f%rHbb&@_CvHYY;|*nm`!0`rO4TKd)a3e!q@<;8^L2*Bbu8#aLUL#_ z{3s(0PIi`s24;N>C76v;T#N`RFb|jFN>maa)wmwD&fB5wk@@7YfIL1y9t+9iljLzV zeXnzNhBelB&!ms$7n4g9b$<~)+<<11zXX(&A%Gyj%J{NjbnsPtbpdO97(}c9tpo*R z7+NZ8`1%5@5*$V;-#F2audh6W(gHU5$n`VS^EMA*3;)6p?pWmKcai5Hc6fn!{>yx) z7n*;CFDnj451SB#@8)~FX#9bQzkmmQ;15+5e;=+c{yxGV^9E!-Fp^*=f8s-u8jDxR zyXh?oL;^$j79SkK<-72ar_s8KA3B1ev-F8W)CL>}E(j~F%~ zj;&CsgZJP*^kN?pcnlhzL=r>vG#!PG6Z9&bMiwvAj&m^aI<1|j7wH}J;XU*-0h?GU zZULvXt}fDtsVJuz5$WC_YGLk(ZVZt=6Yt_#Ai2BR|d^u8!C&ixidsou?m(*U8gg}A?!xZg~m zZY5RRhFaW#`SfI8g*&kr+ej7LNfmdIBJRd&vaO*vxd-Xo&7r-?x&(pv@AYBCnkcNt66W?>lQi8vE-*@nL`sFl_lX~C% NRD@)=7XJu_{tYePyzu}4 delta 1258 zcmYjRU2GIp6#nkc%+Bm~+QRKFbSW(eO$)`kL`hW|e@baXf46oEU8OCZwnKO5c4ld( z6;N5~zo6CaRS|zcMMX_jT50W~@MdCsFa(p5U`+JUH+}Mj7|(8vA(OfH+;hJ9&Uene zcYZ0KU+4evpUYPP?7-Eu{|~uf*mUP^b$fhD!Wp(~hDvc(u8?lc8A^qr1bO*Ns5Z+)022pAjZ&}05Z7VhkeE`o zhZ2;tIoc47HbvT-cIUxHQiYRcNGqiQ9fwiI;2m_F5zEvt&JY&ANyVbb8{#ocWaB+q z`p0z~!BO#`xAKlB7`SC8C*1wEF={^GIwPiiPp=}XYFh$JcW`fEm z+AU&EE)zd_`RZpFlu08oVfyhLUQqG8_{&?i>cy-O*>K%44JR2k=VaWg=9l;3WgV~N zitmU-yEMGYpi^62({`)7jwVTVTEx|gsGxL_F^l#_!yCjk<|HU~nn4|RCx!^E;S51m z1ZRtSN5{M9A>@$Z8X6ijG-`N1D|%vJ)FSwY;&-)#`uUNLkMW6+wYxMw*5OkfpNVB{ zbI}(%RA@dhe5Jz&O~stBrA_Q>k(Sm7pD*lXCc}nSaabx1)iMNI4;hn2*mA;6k%l9K zW-@y&YQ^_?{Y()Rdf1l-8TrJNC;IfM()IA5429T;5H?{e%29(#G?KLk+r%w>I<%b- zcN1a7pzS+lRO<@e?ozmj`L04vV=As<$E*emN1Xr3O zV3?u3s+x~vFzUeq3i;UWI6hK!356NB5;g;llk+{g zL{W_{>fK({VIOt4n@}-ykiQc>wCcqH^dXLZx(^19VSrBVAf_>d({%05;UF$xn3Be^ zNH_0W`sNA}_yME1mV!filK2_pScZ!mm;@&&ozQ5!i6R7O&RPw$JuGK6lI0<3i?~D^ zArbZj&X7+g+8~<9rx2e+@o#9nk+YU)+(lpO@cfPIDlXQmRJ{iqGUW8&GN}S3_D~%$ PeD`pO{sb{x@%sJ+h8Y}y diff --git a/target/classes/xyz/thastertyn/Jecna/Znamky.class b/target/classes/xyz/thastertyn/Jecna/Znamky.class index bc021b48096617377daa0010b6211b3d7670213e..78c6ac40c17b3e2cffd4b90087d83744e4a76aba 100644 GIT binary patch literal 5947 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 Ykmp^`-Ou5C85TxWx=HX($BD@Q038-B3;+NC literal 5108 zcmb_gd3;pW75;8!GH)_@1_)~)AyE-YAQ{w3A&CJ(0E0=e210{dACpJ&$Yf@G?+qcS zRjDnOTBWtM(Jq#5=|YRPGJsT@E_AWG-R!TmNEf?rcCW4RyLaA9WhhiPvyXkMVSEgmtVU50JRcW=?}_E`j`Vq);QP!pn{(bKb0f+#R| z$=P_cwp4e?2+DO-U?C&#HJOUVxsvJpG*ss(drKOsn3?etWf9eIfk4@msD`izi#1%7 zfkR>G!K>q9ED_Ll8_}e>d8fdfC9S!xGg%0s2Fo-o&7)E}AJRmv!0aV0xr$z{LO35` znUCcH7f*7`vrj1js>G!_E+f6+Bc9UsBy!}d<|I8fm*xm~+!H8NbSAZ1NtQv=>g^-g zqD3G?tDPCuJma2jI*4g9RjYNZ!CFR=NK$*{B$4E}o;rDS%3QDAZQ4dJ$uZBfqbe+$ z$cAbLcip60=cH^;o;D9y7-CY4XvLScwE1?!-1Q-ow}g1QT4D!-`4#Qff|q zn;A-ET21$4(VUa~3p7t1`2X8{IXXIBBht^A;Pu9m9&e7MC(eX=&6HHL?7Fs&LIi>! zqKo@nH{sNW!-Io^bxy)DIhSHaU1V?AiNtL)?6^q@eF(d;N5dc?ozUUZtv5TvXnF{H zWzxK81R8UzHE$#-K4c9`X*2T+2e(p8Xdv5kls#2ZL+SI(X~ zg+vH<;eduWvTID`NynRTH=CSeM%8c+Pjc|wIMZ_B^-)vC=`;j!k3fNIhj383dJD(N zxT^`mQszD#Zoz`=pLf;ZZ8HAFYcT z4sQ;Vj+yO&)z9)C#~&H!aUErtPh*=L({ac_i?gq2ue!#OQv&m+rWzfj+eSXe*k}B9 ze31SZv+|clyOtC3h zHmODHrJZ6th41P3zML$<%qWteKdqw~>jG=KGkN$iexl(Sfs*mT(QdeXI!@zR-YM*O zGRCy{dEMEh;iu&FxLo=u%}H|DWG$V-&*kOl7ytW)mu2f2{8HYQ8fCb@*6|w|Zh+xl zWe$aK2EWtsd;Eb*Mj~O#Flr|)^eG}@ng5A1v+9;Ac@218$Cq&^h`-9Eo4Irbf0yR} zA)8v>T`uofH1aR0acf9wJRih=ILbQWydKATtN5LwD${<|mkJWEP~|bp&-}DVk|b<) zOAgk3Iddeys+SI{Z%;R4cBIbMc`f0zAYn3&RV&>8m7L20uB+lQcC5+qn4<0|gB&q$z2-hK{K2nU+tNV}){8iC1E!lCH!m)T_YRTs_CF z)RUHGD90yJ$%9;xLep8U${BZsay2Kdkaab~b5$U#l6z^yS|m>5BA!d4+3mZ+*Ti$J zuP+=yV_D$|@Pa>z^XvWP`^)?(Y#zm;6s}RvU8AT;p}RkF&lMH93z2)8q~i4g4~~tN z@2}V&Khj=uM4fRfx?u1m68Oa`fD0JNgcx@ZCm}1aNQ4k|PuKX5;wI5v>MT8uoAVSnkHQ@B?yz4dV%toQp?5Z<|E{@I1KvkOyr`zVG}c(C)%LctXZ9U6Pi zFGX&VBA5Cy67Q)G)RYBMc%NEkI;3Lh2U7S@3M2Kw5v(o?dKnw8*UGfg538+@9>>R4 z6!G;)3XeQM3Y7(B7tO-a6poERS8vn!EOk}V9#?Uc`JXs6w$FE%$JJOHb9mwMsl?sD zH1HoJJpSd}S;@UsT&c$b-USw-iK$z|ZOK7tRKaCS4hm7QDJcg4@>0CZr)c4WfQ9O<(_;eW# z)7mJLx&l@BEMqIAy*s_90aE32+zBv(<<$K=EsU_Ee1URBiU#+iXpHWCD&?m%UJjY{ zJG2)uU&BESUlKD*#t=qPcHdjpIFA%##&9V@lk933=02Os7<<*rsp}pGrE||XaS(Ex zq-iHs@pM71-OEOB(*wAx^eb($C8Y4x6Zob;#|U=SdK`GFy=K`7d{-85~qB6;P97n&k3Rzlj#=nLb&~vPCN?7Hfe@UKLow^Wjg!pU%e%*g3`^m_^yp X3xw>T1;Qs}50*ESr$nL90!1$Yp|3E1 diff --git a/target/classes/xyz/thastertyn/Predmet.class b/target/classes/xyz/thastertyn/Predmet.class deleted file mode 100644 index 8ffad90deee3154f9bace5d72c533bc95fae967a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmZvXK~KU!5QX2ALbX&N9E?|Q>cPEm({Lf-)TjxD`?gGENokX1ORWFO6A1@@06)q& zYkK7J&Ad0syqVMQ@dv;JqX+@v`m^~`ZmoBYt!qm4W_h(`7a=5!HhQmBq00~Tnr%3D zgx<3$jhhlWclS#|IIC71ql3!?UGxaU)Rg>EZ!@;Zi`}eTHMSq7wsMvtCUoa=B}FaG zn|Lnfs`P~Boi^Iv6B<{;DItEaGnJu%RvQVLgifxFdRo30%Du{>R)mY(ma?8or$hd2 z#=g=E!XW<_;+Bw2?9!F$QHN8#zl_%b50_vV{tN6BAXrmQ;+TPCw8P1k8xbnLLxcbT diff --git a/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class b/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class new file mode 100644 index 0000000000000000000000000000000000000000..4a1dc850350ef3af307b7638ab268243f6218f8b GIT binary patch literal 734 zcma)3O-~y!6r7h0B&6YMflvw;E+|0(OBI|zT#$OGR)7?gO5B`{wK&??(#C0l-^8Ju zD)rDG&>w|(-b85{IB*&Jt>3(vH~aVb_a6X9*eRhv*uT4f5bjnEoXXt25#O}w+8^TF z8mEjCUsY`6xG14WSn0{{Ql!!(;0j;SEh{WtXr~kNz#xa+x;CiC==)N%;DSP~oUrPG(Lqn-{(rS%_rE zTUcicujZApMF3M z{WDO;2gd5CfzL&*2uoOI^yDU=zOO((Jx(#JQ_RAIxq{U(^EmJ4X|s}HPOR}TFEx_% sw-9TL90E2N{}T@$XT)o7ir26?W*+2|fFS%h>w9~O8cckD$_2Jx009StCjbBd literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Window/Content/Jidelna.class b/target/classes/xyz/thastertyn/Window/Content/Jidelna.class new file mode 100644 index 0000000000000000000000000000000000000000..245148867b43e6292a929f4f5eb7482718adfe50 GIT binary patch literal 306 zcma)%F;2rk5Jmqub_~Xlh#OEK5(>6S7eo_@0$EUiLcO*}WFxaHIh%xVE2>BoIRJ-3 z%tko?&HwXfG@~~^zu!9mBlJ^5gv*c3r}8ts@Z9>1Rjvgr7tENDJ-cOF@x2Kr^8@5f;KK!kMjnJX1q#trlGc0s;6i3bpam5d3<&`j42z*zG8#>qna(gWbYoAWLN=2a z&Hj{B#m7AHl80Copej~;%S--3enS31Dy2EM2Z;hf^Dy_^{_eM)``vGTfB4G-0Eh97 zf{?(z8?$qUKVcPp+w*4~V=V7v-RnlT>-e_g8$<5gHE%*eL?E@X<~cj#Sj%Pt6<%O? z-g4{$gY;$GDI@2)xq_W>v$j#N=-zWIBR7+8GXkv+ff&;;earLhtbn*6P*(CHP}{dE zco1zlJ6e_%tZ}3ex6$Ky!Wn&qMJS;fYw_||yAHiqR&yK*z1 zb1Z+xvjsYz+wkPt6gp*&C-Y9;?-U3plB3M2n?%GA##RkFHY?aJu;(hH}Id>=US3O_qvACfH*;DiQ*r))o~hVjHoEc!=0S zJWM=DJVI$B8HCu=QYz%=Dy&3TP@wLg@UUidTpu!zx}Sn#3Mr zH}SMQ?~)d0HB>@Va84kxAvsT6TnxSFlce?wY)!1w5Xn*LdQig)*d(y2FYnj`GgITX z7u>sm-sfhl!l>otWgjdHBmP95J=D0m6W4t(yl$1x$SJrMTREOs+Y!l8c^_jM-oS{! z3y+mc?@bqJD7vikFLXJ=!W#I$U` z5fz?5b=PVI1l{v{^lyI#hhg{(AfvVx~LeW$e@W0*k09Nn4~1 z8u+@y{EsU`NX|&^LUKX|$jKKV=MWKcx&+8kK&vY5L#U<|xy5F#TPXP>_y)d9Eg_z| zk8SBC>{vieD!hPQ{NBy)`UNzksw#fP-gH>sZ>A&qi)K2iC(U%3e!xsCdb62Ub;C?o zmFcZq75xxbRX@VDTtCV+rXM#K(2-J0K3pat;}jLnFko*w^)ot_@Y(_f z?gc5I=ej2-F@^|B+Qiwmh2_+-h%Dmxlz$uFvh>%fr?D&+gCUqifnki43KchLE9tsR z_YDUYF)DEp>3$jR0rMINw@2o2qB%^#nRukljI>ARQQaJmHt{PSZ8L90Md{zMw~%{rS8Qgq&P_q(7p*CT5uZ%?w}Rl z<4{1%P(a|_WnxGJuHy!&slsKLj5h4=7232VYme863lKCAH|Zc^_~ zu=|L+kC{~x%0tvC_(Z`i@i+f-D*wXvN2ozafl!zjm*TL3nQ8`8cvq#iGl=r0qU2`R zkKBZUO3MP_u_vxFx^k7b8F{U7%}=Y0JJ&V-44*F>Hxp&#u>Qqr)1D_x!z*#W3Icrn E4>8($cK`qY literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Window/Content/Znamky.class b/target/classes/xyz/thastertyn/Window/Content/Znamky.class new file mode 100644 index 0000000000000000000000000000000000000000..360f92fcf12e7c1b7ba4855e96d3d04223ded74a GIT binary patch literal 4964 zcmcgwTW}j!8UD^n)=Kg=PMp|{QoC_n)7A#GaAxba1Gl*o2sJ9g}}q-$xB*O7PC z)hdY-O1ZSqmQn}-+FYh|3az0Os6!(+F@->ZLSdNUfxf~Foq;E27+#<=5dO1T*^*+( zc|!7P&;IAXpYQ+AS-F?DwQ_)QS zq$bZEpA+F^XerIPUx{e4EyhrO+7dh{Yf7Aqgd_T_Kc?%kxDwH$ia#!sdP9@_v6Q;Y zZ*c_}Tp1yT+Hip_OS$a~F?z}05mPoyCCb1iNwQPbRI`i0(bPP~;Or$MUN}%8p&XKk z4Gi^byWquoREXHb&|H!^tZIsEgylIsWqMGJ%_44RXe=qyry5GcRCP^)4_hdNeM7^c z$)Ul~?l41B>HI9q2E5pa8Xi+EL+dR|HIMPgwo0hOHiq>{#mx9VAZv0=F&Ku|P?g6X zXfEw-W;H!vxJyDATp~Wga7T#+^`Ze4oWDte2sa^B0k2j(XyUDE#U#|CG9HJh-~V#K-GDALN+~6jvn-h=%uu*sL9Ss z2;xDi1x-0+GHl9fumT;Lnjtg>MC@bm6)eqYDiK$xCRIbk{uu^802Z#64NDQn88)mq6rvtV^UTA5WmNFpVI)}UxR8znsT>T%s@=pGyi zNjQO%3}rpx?%o5XI$6G0fE${VaM}{?9}WfwMSPO_L@{Sa`iH$p;8Pqrk2A!IBV^f7 zplF|3VL4iqhYVVcAcW6I_$)q0$)(0=C8>17%x2YMT??QqNahK7Qo`qXLYzI}!$D4X zO2X5e;F<`A!$aeo^hF8Ja*{aE-5;dwgVUaq@MTVO3#s}`(jpB$v+67jXX zQtZ=H)I7a7hi^!D9xu>-9kobSde6|Uyx<51&JQYzAe4nH(a(_}uCTSR=vZ}nf zO*7nBj&-T!{ST40^U zW9hs(nQJoVZ&A0X+-^~U9D5n;1-j_FI<<=;U0lc!!{tIlNF&jp!*OqCBYb!&G^OdN_w=7~^%M#X4ETVD=8z(NKY7uv&apx7(6TN}xjaRU}#c>7A3zoW8`mH8$ zU>%%vhNwX$wqq08=(&xk+yp76@7;7~@MA~DXxVvkj5?F>VauD?-kQeFJiEIyb_Z4? z4z5P*aB@9q?CB`;m8B8r5a$KiCtgK2!*%p`xZ0Kwn((>OIB*?MNYGLkmvPGRHqI>Ku{1tCK9A{~nJ4mQ z26JYhljW~-Yyn+_INj3F8RntGPlht82 z+k<;p2llW-xQ~s}tIu%+m_{!(Poj%GMQ24+0LFwV91%`pQg{wWg$sCCSimE~Rn!abAR_z@QQ?nJgg+rBe1K`;ZjlCmR~7ylR9m>6?%cAY^5=zi cAIlMS*mec{!ZPqn{EF^g5>4V={ARE3e?}#B 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 Ml!$4fj3HV6e}&gzE&u=k literal 1367 zcmbVL>rN9v7(GKvZ!S_>OSLUnK%^I>TJZ*W2?D01LQJuQ_-kn=Wl7m3-K~I6rHMeI zi4WjI8P9ARAQX-IW51c5J$ue~IrHP^*Y5yk@Y0Vyf#kvA$AYu1+m38Ghh|~JFzeQS zp=>n_(+{sect`)B7n-`+D6DPm$eJVIZQHUX5GkL1syHpfY|Qc7o^IO${Y^z6kSbr` zUy(Ia@6Z$Ns~b9z0^=8P=kr)}K?*)^n1=IQz>~>VsrAaL%Md&WYtS$dKtupR2wd0D z51-l%Y4F46#|?qR?=uM@jfY%#gip?RQ!$Fq0|QtldJxvKmcUV_Vh4Sq*2^XdA_@ zEf#cJ*4O2M^ZH$BE?ZUgOl!!aAh7%&1n+wb4zb+(Y6t@Yey5|vlYdT*gE7p#Hq9En zR3(nbO6AF44`M-Jpdp9~zet%C_!GKe{U&z|~76t&usoWP#W9lRN_-!E-_|v?@VWid?0%e5ymL5T8uhFu131U)72m& zig-YkAaOHz$V~f`7rMG{iB{z%shi*v#A=gLZ+ lmh}{~UHT$dMITV~$C&%XeWz7E_k8T!|AEv0pS!3RzW_k=E}8%U diff --git a/target/classes/xyz/thastertyn/Window/LoginDialog.class b/target/classes/xyz/thastertyn/Window/LoginDialog.class deleted file mode 100644 index 926ccde4872dc4937632f830f81f5541d9f585ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5126 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 ZC?(fU+`vThLfZ5`Ow!pv1N;rNe*x4nv5UsAYE7 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 literal 0 HcmV?d00001