Added visual checks if dlls and config are ok (WIP)

Other improvements (might need to be backported to 1.0.x)
This commit is contained in:
Jeddunk 2020-05-10 14:27:33 +02:00
parent f2b289f8c5
commit 2e5399971e
5 changed files with 144 additions and 67 deletions

View File

@ -2,6 +2,8 @@
<project version="4"> <project version="4">
<component name="Encoding"> <component name="Encoding">
<file url="file://$PROJECT_DIR$" charset="UTF-8" /> <file url="file://$PROJECT_DIR$" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="PROJECT" charset="UTF-8" /> <file url="PROJECT" charset="UTF-8" />
</component> </component>
</project> </project>

View File

@ -1,4 +1,5 @@
import com.jfoenix.controls.*; import com.jfoenix.controls.*;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.concurrent.Service; import javafx.concurrent.Service;
@ -9,6 +10,7 @@ import javafx.scene.control.Tooltip;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.ex.ConfigurationException;
import org.jsoup.HttpStatusException;
import pojo.App; import pojo.App;
import util.CreamApiConfig; import util.CreamApiConfig;
import util.CreamApiDllHandler; import util.CreamApiDllHandler;
@ -26,9 +28,11 @@ import java.util.Objects;
public class Controller { public class Controller {
private static final String REGEX = "(?<steamApiDll>steam_api(?:64)?.dll)$"; private static final String REGEX = "(?<steamApiDll>steam_api(?:64)?.dll)$";
private CreamApiDllHandler handler = CreamApiDllHandler.getInstance(); public FontAwesomeIconView creamApiDllAppliedIcon;
private CreamApiConfig config = CreamApiConfig.getInstance(); public FontAwesomeIconView creamApiConfigExists;
private SteamAppsListCache cache = new SteamAppsListCache(); private final CreamApiDllHandler handler = CreamApiDllHandler.getInstance();
private final CreamApiConfig config = CreamApiConfig.getInstance();
private final SteamAppsListCache cache = new SteamAppsListCache();
@FXML @FXML
public Label state_label; public Label state_label;
@FXML @FXML
@ -69,6 +73,7 @@ public class Controller {
generate_tooltips(); generate_tooltips();
fix_dlc_textarea_prompt_text(); fix_dlc_textarea_prompt_text();
reset(true); reset(true);
state_label.setText("Ready.");
} }
private void read() { private void read() {
@ -148,8 +153,10 @@ public class Controller {
config.sync(); config.sync();
} catch (IOException | ConfigurationException e) { } catch (IOException | ConfigurationException e) {
e.printStackTrace(); e.printStackTrace();
cancel();
} catch (NullPointerException e) { } catch (NullPointerException e) {
System.err.println("No configuration file set!"); System.err.println("No configuration file set!");
cancel();
} }
return null; return null;
} }
@ -164,6 +171,10 @@ public class Controller {
setDisableAllButtons(false); setDisableAllButtons(false);
state_label.setText("Saved successfully!"); state_label.setText("Saved successfully!");
}); });
s.setOnCancelled(event -> {
setDisableAllButtons(false);
state_label.setText("Could not save configuration file!");
});
s.start(); s.start();
} }
@ -192,10 +203,20 @@ public class Controller {
return new Task<Void>() { return new Task<Void>() {
@Override @Override
protected Void call() { protected Void call() {
try {
Map<Number, String> collect = cache.getDlcMap(appId_textfield.getText()); Map<Number, String> collect = cache.getDlcMap(appId_textfield.getText());
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
collect.forEach((k, v) -> sb.append(k).append("=").append(v).append("\n")); collect.forEach((k, v) -> sb.append(k).append("=").append(v).append("\n"));
dlc_textarea.setText(sb.toString()); dlc_textarea.setText(sb.toString());
} catch (HttpStatusException e) {
if (e.getStatusCode() == 404) {
System.err.println("App ID empty or not found! (HTTP Status Code: 404)");
}
cancel();
} catch (IOException e) {
e.printStackTrace();
cancel();
}
return null; return null;
} }
}; };
@ -209,6 +230,10 @@ public class Controller {
setDisableAllButtons(false); setDisableAllButtons(false);
state_label.setText("Got list of DLCs successfully!"); state_label.setText("Got list of DLCs successfully!");
}); });
s.setOnCancelled(event -> {
setDisableAllButtons(false);
state_label.setText("Could not get list of DLCs!");
});
s.start(); s.start();
} }
@ -225,6 +250,7 @@ public class Controller {
path_textfield.setText(file.getParent()); path_textfield.setText(file.getParent());
steamApiPathString = file.getAbsolutePath(); steamApiPathString = file.getAbsolutePath();
reset(true); reset(true);
state_label.setText("Ready.");
} catch (ConfigurationException | IOException e) { } catch (ConfigurationException | IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -20,8 +20,8 @@ public class CreamApiConfig {
private Boolean unlockAll; private Boolean unlockAll;
private Boolean extraProtection; private Boolean extraProtection;
private Boolean forceOffline; private Boolean forceOffline;
private Map<Integer, String> dlc = new HashMap<>(); private final Map<Integer, String> dlc = new HashMap<>();
private List<String> languages = new ArrayList<>(); private final List<String> languages = new ArrayList<>();
private CreamApiConfig() { private CreamApiConfig() {
try { try {
@ -35,7 +35,7 @@ public class CreamApiConfig {
File langFile = new File("languages.txt"); File langFile = new File("languages.txt");
try { try {
BufferedReader fIn = new BufferedReader(new FileReader(langFile)); BufferedReader fIn = new BufferedReader(new FileReader(langFile));
fIn.lines().filter(line -> !line.isEmpty() && !line.startsWith("#")).forEach(line -> languages.add(line)); fIn.lines().filter(line -> !line.isEmpty() && !line.startsWith("#")).forEach(languages::add);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -4,7 +4,6 @@ import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import kong.unirest.HttpResponse; import kong.unirest.HttpResponse;
import kong.unirest.Unirest; import kong.unirest.Unirest;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element; import org.jsoup.nodes.Element;
@ -26,29 +25,31 @@ import java.util.stream.Collectors;
public class SteamAppsListCache { public class SteamAppsListCache {
private SteamAppsList list = new SteamAppsList(); private SteamAppsList list = new SteamAppsList();
private File cacheFile = new File("steamapps.json"); private final File cacheFile = new File("steamapps.json");
private MainEnv env; private MainEnv env;
//private String key; //private String key;
public SteamAppsListCache() { public SteamAppsListCache() {
try { try {
Class envDefault = Class.forName("util.env.Default"); Class<?> envDefault = Class.forName("util.env.Default");
env = (MainEnv) envDefault.newInstance(); env = (MainEnv) envDefault.newInstance();
//System.out.println(env.getKey()); // System.out.println(env.getKey());
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
env = new MainEnv(); env = new MainEnv();
} catch (IllegalAccessException | InstantiationException e) { } catch (IllegalAccessException | InstantiationException e) {
// Only thrown by newInstance() // Only thrown by newInstance()
e.printStackTrace(); e.printStackTrace();
} }
boolean fileFound = true; //boolean fileFound = true;
try { try {
getListFromFile(); getListFromFile();
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
System.err.println("File does not exist, trying to create steamapps.json for the first time..."); System.err.println("File does not exist, trying to create steamapps.json for the first time...");
fileFound = false; //fileFound = false;
sync();
} }
if (!fileFound || Instant.now().isAfter(list.getTimestamp().plus(Duration.ofDays(3)))) { if (Instant.now().isAfter(list.getTimestamp().plus(Duration.ofDays(3)))) {
System.err.println("List in file is not recent!");
sync(); sync();
} }
} }
@ -89,6 +90,7 @@ public class SteamAppsListCache {
} }
private void getListFromApi() { private void getListFromApi() {
System.out.println("Trying to get SteamAppList from API...");
List<App> apps = getApps(); List<App> apps = getApps();
list.setTimestamp(Instant.now()); list.setTimestamp(Instant.now());
list.setSteamAppsList(apps); list.setSteamAppsList(apps);
@ -104,23 +106,27 @@ public class SteamAppsListCache {
} }
private void saveListToFile() throws IOException { private void saveListToFile() throws IOException {
System.out.println("Trying to save SteamAppList to file (" + cacheFile.getAbsolutePath() + ")...");
Gson gson = new Gson(); Gson gson = new Gson();
String jsonString = gson.toJson(list); String jsonString = gson.toJson(list);
BufferedWriter fOut = new BufferedWriter(new FileWriter(cacheFile)); BufferedWriter fOut = new BufferedWriter(new FileWriter(cacheFile));
fOut.write(jsonString); fOut.write(jsonString);
fOut.close(); fOut.close();
System.out.println("Successfully saved SteamAppList to file (" + cacheFile.getAbsolutePath() + ")...");
} }
private void getListFromFile() throws FileNotFoundException { private void getListFromFile() throws FileNotFoundException {
System.out.println("Trying to get SteamAppList from file (" + cacheFile.getAbsolutePath() + ")...");
BufferedReader fIn = new BufferedReader(new FileReader(cacheFile)); BufferedReader fIn = new BufferedReader(new FileReader(cacheFile));
String json = fIn.lines().collect(Collectors.joining()); String json = fIn.lines().collect(Collectors.joining());
final Type type = new TypeToken<SteamAppsList>() { final Type type = new TypeToken<SteamAppsList>() {
}.getType(); }.getType();
Gson gson = new Gson(); Gson gson = new Gson();
list = gson.fromJson(json, type); list = gson.fromJson(json, type);
System.out.println("Successfully got SteamAppList from file (" + cacheFile.getAbsolutePath() + ")...");
} }
public LinkedHashMap<Number, String> getDlcMap(String appId) { public LinkedHashMap<Number, String> getDlcMap(String appId) throws IOException{
Map<Integer, String> steamStoreDLCs = new HashMap<>(); Map<Integer, String> steamStoreDLCs = new HashMap<>();
Map<Integer, String> steamDbDLCs = new HashMap<>(); Map<Integer, String> steamDbDLCs = new HashMap<>();
//StringBuilder sb = new StringBuilder(); //StringBuilder sb = new StringBuilder();
@ -152,12 +158,6 @@ public class SteamAppsListCache {
} }
steamDbDLCs.put(Integer.parseInt(dlc_id), dlc_name); steamDbDLCs.put(Integer.parseInt(dlc_id), dlc_name);
} }
} catch (HttpStatusException e) {
if (e.getStatusCode() == 404) {
System.err.println("App ID empty or not found! (HTTP Status Code: 404)");
}
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) { } catch (NullPointerException e) {
// ignore // ignore
} }

View File

@ -8,11 +8,15 @@
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?> <?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<GridPane hgap="10.0" minHeight="400.0" minWidth="655.0" vgap="10.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller"> <BorderPane prefHeight="361.0" prefWidth="693.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller">
<center>
<GridPane hgap="10.0" minHeight="360.0" minWidth="655.0" vgap="10.0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="1.7976931348623157E308" minWidth="-Infinity" prefWidth="375.0" /> <ColumnConstraints hgrow="SOMETIMES" maxWidth="1.7976931348623157E308" minWidth="-Infinity" prefWidth="375.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="120.0" /> <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="120.0" />
@ -27,11 +31,7 @@
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="-Infinity" prefHeight="60.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="-Infinity" prefHeight="60.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="-Infinity" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints> </rowConstraints>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
<JFXTextField fx:id="path_textfield" promptText="Path to game's steam_api(64).dll..." GridPane.columnSpan="2" /> <JFXTextField fx:id="path_textfield" promptText="Path to game's steam_api(64).dll..." GridPane.columnSpan="2" />
<JFXButton fx:id="path_button" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onAction="#openFileChooser" ripplerFill="BLACK" style="-fx-background-color: #ddd;" GridPane.columnIndex="2"> <JFXButton fx:id="path_button" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onAction="#openFileChooser" ripplerFill="BLACK" style="-fx-background-color: #ddd;" GridPane.columnIndex="2">
<graphic> <graphic>
@ -53,5 +53,54 @@
<JFXButton fx:id="retrieveDlcList_button" maxHeight="1.7976931348623157E308" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onAction="#getDlcList" ripplerFill="BLACK" style="-fx-background-color: #ddd;" text="Get DLCs for AppID" GridPane.rowIndex="7" /> <JFXButton fx:id="retrieveDlcList_button" maxHeight="1.7976931348623157E308" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onAction="#getDlcList" ripplerFill="BLACK" style="-fx-background-color: #ddd;" text="Get DLCs for AppID" GridPane.rowIndex="7" />
<JFXButton fx:id="save_button" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onAction="#save" ripplerFill="BLACK" style="-fx-background-color: #ddd;" text="Save" GridPane.columnIndex="1" GridPane.rowIndex="7" /> <JFXButton fx:id="save_button" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onAction="#save" ripplerFill="BLACK" style="-fx-background-color: #ddd;" text="Save" GridPane.columnIndex="1" GridPane.rowIndex="7" />
<JFXButton fx:id="reset_button" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onAction="#resetFromButton" ripplerFill="BLACK" style="-fx-background-color: #ddd;" text="Reset" GridPane.columnIndex="2" GridPane.rowIndex="7" /> <JFXButton fx:id="reset_button" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" onAction="#resetFromButton" ripplerFill="BLACK" style="-fx-background-color: #ddd;" text="Reset" GridPane.columnIndex="2" GridPane.rowIndex="7" />
<Label fx:id="state_label" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" GridPane.columnSpan="2147483647" GridPane.rowIndex="8" /> <BorderPane.margin>
</GridPane> <Insets />
</BorderPane.margin>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</GridPane>
</center>
<bottom>
<Label fx:id="state_label" maxWidth="1.7976931348623157E308" minHeight="25.0" minWidth="-Infinity" style="-fx-background-color: #ddd; -fx-border-color: #aaa;" text="Ready." textFill="#555555" BorderPane.alignment="CENTER">
<BorderPane.margin>
<Insets />
</BorderPane.margin>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding></Label>
</bottom>
<right>
<GridPane maxHeight="-Infinity" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="250.0"
BorderPane.alignment="CENTER">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding>
<Label maxHeight="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity"
text="CreamAPI DLL applied">
<font>
<Font size="14.0"/>
</font>
<graphic>
<FontAwesomeIconView fx:id="creamApiDllAppliedIcon" glyphName="CIRCLE" size="20"/>
</graphic>
</Label>
<Label layoutX="20.0" layoutY="20.0" maxHeight="1.7976931348623157E308" minHeight="-Infinity"
minWidth="-Infinity" text="CreamAPI configuration file exists" GridPane.rowIndex="1">
<font>
<Font size="14.0"/>
</font>
<graphic>
<FontAwesomeIconView fx:id="creamApiConfigExists" glyphName="CIRCLE" size="20"/>
</graphic>
</Label>
</GridPane>
</right>
</BorderPane>