From 94ab336ddbe35aca3bbe9fbcfeb76e853194ba44 Mon Sep 17 00:00:00 2001 From: Thastertyn Date: Sat, 29 Apr 2023 21:12:59 +0200 Subject: [PATCH] Credential saving should work, progressed on choices --- .../thastertyn/Login/LocalCredentials.java | 121 ++++++++++++++ .../xyz/thastertyn/Login/LoginController.java | 157 +++--------------- .../xyz/thastertyn/Scrape/JecnaScrape.java | 10 ++ .../java/xyz/thastertyn/Scrape/Znamky.java | 19 ++- .../java/xyz/thastertyn/Types/Option.java | 2 +- .../UserInterface/Content/JecnaContent.java | 4 +- .../UserInterface/Content/Znamky.java | 16 +- .../UserInterface/Dialogs/OptionsDialog.java | 2 +- .../thastertyn/UserInterface/MainWindow.java | 5 +- .../UserInterface/UpdateListener.java | 4 +- .../UserInterface/WindowSwitchListener.java | 2 +- 11 files changed, 181 insertions(+), 161 deletions(-) create mode 100644 src/main/java/xyz/thastertyn/Login/LocalCredentials.java create mode 100644 src/main/java/xyz/thastertyn/Scrape/JecnaScrape.java diff --git a/src/main/java/xyz/thastertyn/Login/LocalCredentials.java b/src/main/java/xyz/thastertyn/Login/LocalCredentials.java new file mode 100644 index 0000000..f6cb625 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Login/LocalCredentials.java @@ -0,0 +1,121 @@ +package xyz.thastertyn.Login; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public class LocalCredentials { + + /** + * Checks for already saved credentials, at least if its file exists + * @return + */ + + private String path; + + private File credentialsFile; + private File credentialsPath; + + public boolean checkForExistingCredentials() + { + if(System.getProperty("os.name").equals("Linux")) + { + // /home/user/.local/share/jecnak/... + path = System.getProperty("user.home") + "/.local/share/jecnak/"; + }else if(System.getProperty("os.name").contains("Windows")) + { + // C:\Users\\user\AppData\Roaming\... + path = System.getenv("APPDATA") + "\\jecnak\\"; + }else{ + return false; + } + + credentialsPath = new File(path); + credentialsFile = new File(credentialsPath, "credentials.txt"); + + if(!credentialsFile.exists()) + { + return false; + } + + return true; + } + + public String[] getCredentialsFile() + { + String[] result = new String[2]; + if(credentialsFile == null) + { + return null; + } + + try { + BufferedReader reader = new BufferedReader(new FileReader(credentialsFile)); + + String line = ""; + while((line = reader.readLine()) != null) + { + String[] currentValue = line.split("="); + + if(currentValue[0].equals("user")) + { + result[0] = currentValue[1]; + }else if(currentValue[0].equals("pass")) + { + result[1] = currentValue[1]; + } + } + + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + if(result[0] == null || result[1] == null) + { + return null; + } + + return result; + } + + public boolean saveCredentials(String[] credentials) + { + if(credentialsFile == null) + { + return false; + } + + if(!credentialsFile.exists()) + { + try{ + credentialsPath.mkdirs(); + credentialsFile.createNewFile(); + }catch(IOException e) + { + return false; + } + } + + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(credentialsFile)); + writer.append("user=" + credentials[0]); + writer.append("\n"); + writer.append("pass=" + credentials[1]); + + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return true; + } +} + diff --git a/src/main/java/xyz/thastertyn/Login/LoginController.java b/src/main/java/xyz/thastertyn/Login/LoginController.java index 5440b5e..cd12f9f 100644 --- a/src/main/java/xyz/thastertyn/Login/LoginController.java +++ b/src/main/java/xyz/thastertyn/Login/LoginController.java @@ -1,12 +1,9 @@ package xyz.thastertyn.Login; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.net.UnknownHostException; +import java.util.Properties; import java.util.concurrent.TimeoutException; import javax.security.auth.login.CredentialException; @@ -21,6 +18,7 @@ public class LoginController { private WindowBasedTextGUI textGUI; private xyz.thastertyn.Login.CredentialsInput dialog; + private LocalCredentials localCredentials = new LocalCredentials(); private xyz.thastertyn.Login.Login login = new xyz.thastertyn.Login.Login(); public LoginController(WindowBasedTextGUI textGUI) @@ -30,26 +28,36 @@ public class LoginController { public void login() { - dialog = new CredentialsInput(); - if(checkForCredentials()) // Credentials exist + String[] credentials; + + if(localCredentials.checkForExistingCredentials()) // Credentials exist { - if(loginUsingCredentials()) // They are accessible and can read them + credentials = localCredentials.getCredentialsFile(); + }else{ + dialog = new CredentialsInput(); + Triplet data = dialog.showDialog(textGUI); // Failed to get credentials to log in, get them from user + credentials = new String[] {data.getValue0(), data.getValue1()}; + + if(data.getValue2()) { - return; + localCredentials.saveCredentials(credentials); } } - Triplet data = dialog.showDialog(textGUI); // Failed to get credentials to log in, get them from user - try - { - login.loginJecna(data.getValue0(), data.getValue1()); + loginUsingCredentials(credentials); + } + + private void loginUsingCredentials(String[] credentials) + { + try { + login.loginJecna(credentials[0], credentials[1]); }catch (TimeoutException e) { MessageDialog.showMessageDialog(textGUI, "Timeout", "The attempt to connect took too long.", MessageDialogButton.Retry, MessageDialogButton.Abort); } catch (UnknownHostException e) { MessageDialog.showMessageDialog(textGUI, "No Internet connection", - "There seems to be no internet connection, reverting to cached data", + "There seems to be a problem with your internet connection", MessageDialogButton.OK); login(); } catch (CredentialException e) @@ -66,127 +74,4 @@ public class LoginController { login(); } } - - /** - * Zkontroluje zda jiz neexistuji ulozene udaje na systemu - * @return
    - *
  • {@code true} soubor existuje a neni prazdny
  • - *
  • {@code false} neexistuje, nebo je prazdny
  • - *
- */ - private boolean checkForCredentials() - { - return false; - //File credentials = null; - - //if(System.getProperty("os.name").equals("Linux")) - //{ - // credentials = new File("~/.local/share/jecnak/credentials.json"); - - //}else if(System.getProperty("os.name").contains("Windows")) - //{ - // credentials = new File(System.getenv("APPDATA\\jecnak\\")); - //} - - //if(!credentials.exists() || credentials.length() == 0) - //{ - // return false; - //} - //return true; - } - - public boolean saveCredentials(String user, String pass) - { - File credentials; - - if(System.getProperty("os.name").equals("Linux")) - { - credentials = new File("~/.local/share/jecnak/credentials.json"); - - }else if(System.getProperty("os.name").contains("Windows")) - { - credentials = new File(System.getenv("APPDATA\\jecnak\\")); - }else{ - return false; - } - - try { - BufferedWriter writer = new BufferedWriter(new FileWriter(credentials)); - writer.append("username=" + user); - writer.append("password=" + pass); - - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - - return true; - } - - private boolean loginUsingCredentials() - { - File credentials; - - if(System.getProperty("os.name").equals("Linux")) - { - credentials = new File("~/.local/share/jecnak/credentials.json"); - - }else if(System.getProperty("os.name").contains("Windows")) - { - credentials = new File(System.getenv("APPDATA\\jecnak\\")); - }else{ - return false; - } - - if(!credentials.exists() || credentials.length() == 0) - { - return false; - } - - String user = ""; - String pass = ""; - - try { - BufferedReader reader = new BufferedReader(new FileReader(credentials)); - - String line = ""; - while((line = reader.readLine()) != null) - { - if(line.matches("^[a-z]\\=.*$")) - { - String key = line.split("=")[0]; - String value = line.split("=")[1]; - - switch(key) - { - case "username": - user = value; - break; - case "password": - pass = value; - break; - default: - continue; - } - }else{ - continue; - } - } - - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - - try { - login.loginJecna(user, pass); - } catch (CredentialException | IOException | TimeoutException e) { - e.printStackTrace(); - return false; - } - - return true; - } } diff --git a/src/main/java/xyz/thastertyn/Scrape/JecnaScrape.java b/src/main/java/xyz/thastertyn/Scrape/JecnaScrape.java new file mode 100644 index 0000000..e38836d --- /dev/null +++ b/src/main/java/xyz/thastertyn/Scrape/JecnaScrape.java @@ -0,0 +1,10 @@ +package xyz.thastertyn.Scrape; + +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.net.UnknownHostException; + +public abstract class JecnaScrape { + + public abstract void download() throws SocketTimeoutException, UnknownHostException, IOException; +} diff --git a/src/main/java/xyz/thastertyn/Scrape/Znamky.java b/src/main/java/xyz/thastertyn/Scrape/Znamky.java index 571e36a..6b260c6 100644 --- a/src/main/java/xyz/thastertyn/Scrape/Znamky.java +++ b/src/main/java/xyz/thastertyn/Scrape/Znamky.java @@ -1,6 +1,7 @@ package xyz.thastertyn.Scrape; import java.io.IOException; +import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.regex.Pattern; @@ -9,7 +10,6 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; -import xyz.thastertyn.Tuples.Pair; import xyz.thastertyn.Types.Choice; import xyz.thastertyn.Types.Option; import xyz.thastertyn.Types.Options; @@ -32,7 +32,7 @@ public class Znamky { download("https://www.spsejecna.cz/score/student"); } - public void downloadZnamky(Choice choice) throws UnknownHostException, IOException + public void downloadZnamky(Choice choice) throws SocketTimeoutException, UnknownHostException, IOException { download(String.format( "https://www.spsejecna.cz/score/student?schoolYearId=%s&schoolYearHalfId=%s", @@ -67,7 +67,13 @@ public class Znamky { .map(m -> m.group(1)) .orElse(plnyNazevPredmetu); - predmety.add(new Predmet(jmenoPredmetu)); + if(radkyPredmetuHTML[i].get(2).childrenSize() == 0) // Predmet jeste nema vyslednou znamku + { + predmety.add(new Predmet(jmenoPredmetu)); + }else{ + String vyslednaZnamka = radkyPredmetuHTML[i].get(2).select("a.scoreFinal").text(); + predmety.add(new Predmet(jmenoPredmetu, Integer.parseInt(vyslednaZnamka))); + } for(Element znamkaElement : radkyPredmetuHTML[i].get(1).select("a.score")) { @@ -77,7 +83,8 @@ public class Znamky { String textZnamky = znamkaElement.select("span.value").text(); znamka = textZnamky.matches("\\d") ? - Integer.parseInt(textZnamky) : + Integer.parseInt(textZnamky) + : -1; // Nejspis se jedna o N (Nehodnocen) // Mala znamka se bude pocitat jako polovicni vaha @@ -112,9 +119,9 @@ public class Znamky { return predmety; } - public Pair getOptions() + public Options[] getOptions() { - return new Pair(schoolYearOptions, schoolHalfYearOptions); + return new Options[] {schoolYearOptions, schoolHalfYearOptions}; } @Override diff --git a/src/main/java/xyz/thastertyn/Types/Option.java b/src/main/java/xyz/thastertyn/Types/Option.java index c5296df..3b369d4 100644 --- a/src/main/java/xyz/thastertyn/Types/Option.java +++ b/src/main/java/xyz/thastertyn/Types/Option.java @@ -22,6 +22,6 @@ public class Option { } @Override public String toString() { - return value; + return text; } } diff --git a/src/main/java/xyz/thastertyn/UserInterface/Content/JecnaContent.java b/src/main/java/xyz/thastertyn/UserInterface/Content/JecnaContent.java index d66bd45..6cda6de 100644 --- a/src/main/java/xyz/thastertyn/UserInterface/Content/JecnaContent.java +++ b/src/main/java/xyz/thastertyn/UserInterface/Content/JecnaContent.java @@ -16,7 +16,7 @@ import xyz.thastertyn.UserInterface.UpdateListener; public abstract class JecnaContent { protected Panel mainPanel; - protected Boolean hasStarted; + protected boolean hasStarted = false; protected Label borderLabel; protected UpdateListener listener; @@ -32,7 +32,7 @@ public abstract class JecnaContent { public boolean hasStarted() { - return hasStarted.booleanValue(); + return hasStarted; } public Label getLabel() diff --git a/src/main/java/xyz/thastertyn/UserInterface/Content/Znamky.java b/src/main/java/xyz/thastertyn/UserInterface/Content/Znamky.java index 8dc0d14..5e9ad50 100644 --- a/src/main/java/xyz/thastertyn/UserInterface/Content/Znamky.java +++ b/src/main/java/xyz/thastertyn/UserInterface/Content/Znamky.java @@ -48,13 +48,10 @@ public class Znamky extends JecnaContent { private xyz.thastertyn.Scrape.Znamky znamky; private UpdateListener listener; - - private Boolean hasStarted = Boolean.valueOf(false); public Znamky(UpdateListener listener) { super.mainPanel = this.mainPanel; - super.hasStarted = this.hasStarted; super.borderLabel = this.borderLabel; this.listener = listener; } @@ -79,7 +76,7 @@ public class Znamky extends JecnaContent { setGUI(); } - hasStarted = true; + super.hasStarted = true; } @Override @@ -134,17 +131,16 @@ public class Znamky extends JecnaContent { } double prumer = predmet.getVyslednaZnamka(); - String pr; + String prumerAsString; if(predmet.isFinal()) { - int i = (int) prumer; - pr = i + ""; + prumerAsString = ((int) prumer) + ""; }else{ - pr = String.format("%.2f", prumer); + prumerAsString = String.format("%.2f", prumer); } - Label vysl = new Label(pr); + Label vysl = new Label(prumerAsString); vysl.setTheme(colors.get((int) Math.round(prumer))); @@ -155,7 +151,7 @@ public class Znamky extends JecnaContent { @Override public void showOptions(WindowBasedTextGUI textGUI) throws IOException { - OptionsDialog d = new OptionsDialog(znamky.getOptions().getValue0(), znamky.getOptions().getValue1()); + OptionsDialog d = new OptionsDialog(znamky.getOptions()); Choice c = d.showDialog(textGUI); diff --git a/src/main/java/xyz/thastertyn/UserInterface/Dialogs/OptionsDialog.java b/src/main/java/xyz/thastertyn/UserInterface/Dialogs/OptionsDialog.java index 5488743..c646cdd 100644 --- a/src/main/java/xyz/thastertyn/UserInterface/Dialogs/OptionsDialog.java +++ b/src/main/java/xyz/thastertyn/UserInterface/Dialogs/OptionsDialog.java @@ -25,7 +25,7 @@ public class OptionsDialog extends DialogWindow { private boolean useData = false; - public OptionsDialog(Options... options) + public OptionsDialog(Options[] options) { super("Choose from below"); diff --git a/src/main/java/xyz/thastertyn/UserInterface/MainWindow.java b/src/main/java/xyz/thastertyn/UserInterface/MainWindow.java index 6778ccd..206aad2 100644 --- a/src/main/java/xyz/thastertyn/UserInterface/MainWindow.java +++ b/src/main/java/xyz/thastertyn/UserInterface/MainWindow.java @@ -52,15 +52,14 @@ public class MainWindow { window.setComponent(mainPanel); - String title = "Jecnak"; Panel content = new Panel(); - mainPanel.addComponent(content.withBorder(Borders.singleLine(title))); + mainPanel.addComponent(content.withBorder(Borders.singleLine("Jecnak"))); LoginController controller = new LoginController(textGUI); controller.login(); - window.addWindowListener(new WindowSwitchListener(content, title, textGUI)); + window.addWindowListener(new WindowSwitchListener(content, textGUI)); textGUI.addWindowAndWait(window); diff --git a/src/main/java/xyz/thastertyn/UserInterface/UpdateListener.java b/src/main/java/xyz/thastertyn/UserInterface/UpdateListener.java index 635293d..533347c 100644 --- a/src/main/java/xyz/thastertyn/UserInterface/UpdateListener.java +++ b/src/main/java/xyz/thastertyn/UserInterface/UpdateListener.java @@ -1,6 +1,8 @@ package xyz.thastertyn.UserInterface; public interface UpdateListener { - + /** + * Redraw the screen when panel changes due to Choice being used + */ public void updatePanel(); } diff --git a/src/main/java/xyz/thastertyn/UserInterface/WindowSwitchListener.java b/src/main/java/xyz/thastertyn/UserInterface/WindowSwitchListener.java index f8531ad..d753373 100644 --- a/src/main/java/xyz/thastertyn/UserInterface/WindowSwitchListener.java +++ b/src/main/java/xyz/thastertyn/UserInterface/WindowSwitchListener.java @@ -42,7 +42,7 @@ public class WindowSwitchListener implements WindowListener, UpdateListener { int current = contents.length - 1; - public WindowSwitchListener(Panel holder, String title, WindowBasedTextGUI textGUI) + public WindowSwitchListener(Panel holder, WindowBasedTextGUI textGUI) { this.textGUI = textGUI; holder.addComponent(tabsPanel);