diff --git a/src/main/java/com/fi0x/edct/Main.java b/src/main/java/com/fi0x/edct/Main.java index 45df853..a6dea7e 100644 --- a/src/main/java/com/fi0x/edct/Main.java +++ b/src/main/java/com/fi0x/edct/Main.java @@ -5,6 +5,7 @@ import com.fi0x.edct.logging.Logger; import com.fi0x.edct.logging.MixpanelHandler; import com.fi0x.edct.logic.filesystem.BlacklistHandler; +import com.fi0x.edct.logic.filesystem.DiscordHandler; import com.fi0x.edct.logic.filesystem.RedditHandler; import com.fi0x.edct.logic.filesystem.SettingsHandler; import com.fi0x.edct.logic.threads.DistanceHandler; @@ -34,6 +35,7 @@ public class Main public static File settings; public static File blacklist; public static File reddit; + public static File discord; //TODO: Update version information public static final String version = "1.6.9.7";//All.GUI.Logic.Hotfix public static final boolean portable = false; @@ -112,6 +114,10 @@ private static void setupLocalFiles() reddit = new File(localStorage.getPath() + File.separator + "reddit.json"); createFileIfNotExists(reddit, true); RedditHandler.fillRedditFileIfEmpty(); + + discord = new File(localStorage.getPath() + File.separator + "discord.json"); + createFileIfNotExists(discord, true); + DiscordHandler.fillDiscordFileIfEmpty(); } private static boolean createFileIfNotExists(File file, boolean isFile) diff --git a/src/main/java/com/fi0x/edct/gui/controller/Settings.java b/src/main/java/com/fi0x/edct/gui/controller/Settings.java index 330dac8..b7d036c 100644 --- a/src/main/java/com/fi0x/edct/gui/controller/Settings.java +++ b/src/main/java/com/fi0x/edct/gui/controller/Settings.java @@ -58,6 +58,8 @@ public class Settings implements Initializable private TextField txtUnloadingTonProfit; @FXML private Tooltip ttReddit; + @FXML + private Tooltip ttDiscord; @Override public void initialize(URL url, ResourceBundle resourceBundle) @@ -148,6 +150,7 @@ public void initialize(URL url, ResourceBundle resourceBundle) btnDetails.setText(detailedResults.name() + " Results"); ttReddit.setText("This opens the config file for reddit-texts in the Windows-editor.\nYou can find out how to configure the file correctly in the wiki"); + ttDiscord.setText("This opens the config file for discord-texts in the Windows-editor.\nYou can find out how to configure the file correctly in the wiki"); } @FXML @@ -196,6 +199,11 @@ private void openRedditConfig() { ExternalProgram.openNotepad(Main.reddit); } + @FXML + private void openDiscordConfig() + { + ExternalProgram.openNotepad(Main.discord); + } public static void loadSettings() { diff --git a/src/main/java/com/fi0x/edct/gui/controller/Station.java b/src/main/java/com/fi0x/edct/gui/controller/Station.java index 8432ff2..cb4c35b 100644 --- a/src/main/java/com/fi0x/edct/gui/controller/Station.java +++ b/src/main/java/com/fi0x/edct/gui/controller/Station.java @@ -50,6 +50,10 @@ public class Station implements Initializable @FXML private Label lblAge; @FXML + private Button btnDiscord; + @FXML + private Tooltip ttDiscord; + @FXML private Button btnReddit; @FXML private Tooltip ttReddit; @@ -79,8 +83,22 @@ public void initialize(URL url, ResourceBundle resourceBundle) ExternalProgram.copyToClipboard(text); }); + btnDiscord.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> + { + TRADE station = isBuying ? resultsController.getCurrentBuyStation() : resultsController.getCurrentSellStation(); + String text = ConvertToString.discordText(resultsController, station, isBuying); + + if(text == null) + { + Logger.ERROR(992, "Something went wrong when creating a discord String"); + return; + } + + ExternalProgram.copyToClipboard(text); + }); ttReddit.setText("Left click here to copy a title for your reddit post.\nRight click here to copy a text for your reddit post"); + ttDiscord.setText("Click here to copy a text that you can publish on discord"); } @FXML @@ -183,6 +201,9 @@ public void setDetailsVisibility(Settings.Details detailLevel) btnReddit.setVisible(advanced); btnReddit.setManaged(advanced); + + btnDiscord.setVisible(advanced); + btnDiscord.setManaged(advanced); } public void setResultsController(Results controller, boolean isBuying) diff --git a/src/main/java/com/fi0x/edct/logic/filesystem/ConfigHandler.java b/src/main/java/com/fi0x/edct/logic/filesystem/ConfigHandler.java new file mode 100644 index 0000000..f21ceec --- /dev/null +++ b/src/main/java/com/fi0x/edct/logic/filesystem/ConfigHandler.java @@ -0,0 +1,37 @@ +package com.fi0x.edct.logic.filesystem; + +import org.json.simple.JSONObject; + +import javax.annotation.Nullable; + +public class ConfigHandler +{ + public static String getValue(JSONObject json, String key, boolean unloading, @Nullable String type) + { + JSONObject keyArea = null; + if(json.containsKey("Required Variables") && ((JSONObject) json.get("Required Variables")).containsKey(key)) + { + keyArea = (JSONObject) json.get("Required Variables"); + } else if(json.containsKey("Custom Variables") && ((JSONObject) json.get("Custom Variables")).containsKey(key)) + { + keyArea = (JSONObject) json.get("Custom Variables"); + } + if(keyArea == null) return ""; + + String value = keyArea.get(key).toString(); + if(value.charAt(0) != '{') return value; + + JSONObject keyJson = (JSONObject) keyArea.get(key); + if(keyJson.containsKey(unloading ? "UNLOADING" : "LOADING")) + { + if(type == null) return keyJson.get(unloading ? "UNLOADING" : "LOADING").toString(); + else + { + JSONObject loadingJson = (JSONObject) keyJson.get(unloading ? "UNLOADING" : "LOADING"); + if(loadingJson.containsKey(type)) return loadingJson.get(type).toString(); + } + } else return keyJson.toString(); + + return ""; + } +} diff --git a/src/main/java/com/fi0x/edct/logic/filesystem/DiscordHandler.java b/src/main/java/com/fi0x/edct/logic/filesystem/DiscordHandler.java new file mode 100644 index 0000000..9dcf90a --- /dev/null +++ b/src/main/java/com/fi0x/edct/logic/filesystem/DiscordHandler.java @@ -0,0 +1,70 @@ +package com.fi0x.edct.logic.filesystem; + +import com.fi0x.edct.Main; +import com.fi0x.edct.logging.Logger; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import javax.annotation.Nullable; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class DiscordHandler +{ + public static void addMissingKeys(JSONObject json) + { + try + { + var jsonInput = Main.class.getResourceAsStream("/defaults/discord.json"); + JSONObject originalJson = (JSONObject) new JSONParser().parse(jsonInput.toString()); + for(Object o : originalJson.keySet()) + { + String key = o.toString(); + if(!json.containsKey(key)) json.put(key, originalJson.get(key)); + } + } catch(ParseException ignored) + { + } + } + + @Nullable + public static JSONObject getDiscordConfig() + { + JSONObject json = null; + try + { + String fileContent = Files.readString(Main.discord.toPath()); + json = (JSONObject) new JSONParser().parse(fileContent); + } catch(IOException | ParseException ignored) + { + } + + return json; + } + + public static void fillDiscordFileIfEmpty() + { + try + { + List fileContent = new ArrayList<>(Files.readAllLines(Main.discord.toPath(), StandardCharsets.UTF_8)); + + if(fileContent.size() <= 0) + { + var jsonInput = Main.class.getResourceAsStream("/defaults/discord.json"); + fileContent = new BufferedReader(new InputStreamReader(jsonInput, StandardCharsets.UTF_8)).lines().collect(Collectors.toList()); + } + + Files.write(Main.discord.toPath(), fileContent, StandardCharsets.UTF_8); + } catch(IOException e) + { + Logger.WARNING(996, "Could not write default entry to discord config", e); + } + } +} diff --git a/src/main/java/com/fi0x/edct/logic/filesystem/RedditHandler.java b/src/main/java/com/fi0x/edct/logic/filesystem/RedditHandler.java index 99c06f2..19ca3d0 100644 --- a/src/main/java/com/fi0x/edct/logic/filesystem/RedditHandler.java +++ b/src/main/java/com/fi0x/edct/logic/filesystem/RedditHandler.java @@ -49,35 +49,6 @@ public static JSONObject getRedditConfig() return json; } - public static String getValue(JSONObject json, String key, boolean unloading, @Nullable String type) - { - JSONObject keyArea = null; - if(json.containsKey("Required Variables") && ((JSONObject) json.get("Required Variables")).containsKey(key)) - { - keyArea = (JSONObject) json.get("Required Variables"); - } else if(json.containsKey("Custom Variables") && ((JSONObject) json.get("Custom Variables")).containsKey(key)) - { - keyArea = (JSONObject) json.get("Custom Variables"); - } - if(keyArea == null) return ""; - - String value = keyArea.get(key).toString(); - if(value.charAt(0) != '{') return value; - - JSONObject keyJson = (JSONObject) keyArea.get(key); - if(keyJson.containsKey(unloading ? "UNLOADING" : "LOADING")) - { - if(type == null) return keyJson.get(unloading ? "UNLOADING" : "LOADING").toString(); - else - { - JSONObject loadingJson = (JSONObject) keyJson.get(unloading ? "UNLOADING" : "LOADING"); - if(loadingJson.containsKey(type)) return loadingJson.get(type).toString(); - } - } else return keyJson.toString(); - - return ""; - } - public static void fillRedditFileIfEmpty() { try diff --git a/src/main/java/com/fi0x/edct/logic/helper/ConvertToString.java b/src/main/java/com/fi0x/edct/logic/helper/ConvertToString.java index 07910c6..a5f7571 100644 --- a/src/main/java/com/fi0x/edct/logic/helper/ConvertToString.java +++ b/src/main/java/com/fi0x/edct/logic/helper/ConvertToString.java @@ -4,6 +4,8 @@ import com.fi0x.edct.gui.controller.Filters; import com.fi0x.edct.gui.controller.Results; import com.fi0x.edct.gui.controller.Settings; +import com.fi0x.edct.logic.filesystem.ConfigHandler; +import com.fi0x.edct.logic.filesystem.DiscordHandler; import com.fi0x.edct.logic.filesystem.RedditHandler; import com.fi0x.edct.logic.structures.TRADE; import org.json.simple.JSONObject; @@ -60,8 +62,26 @@ public static String redditContent(Results results, TRADE station, boolean unloa return content.toString(); } + @Nullable + public static String discordText(Results results, TRADE station, boolean unloading) + { + JSONObject discordConfig = DiscordHandler.getDiscordConfig(); + if(discordConfig == null) return null; + DiscordHandler.addMissingKeys(discordConfig); + + StringBuilder content = new StringBuilder(); - private static String transformAndAddKey(String key, JSONObject redditConfig, Results results, TRADE station, boolean unloading) + String contentConfig = discordConfig.get("Text Structure").toString(); + String[] contentParts = contentConfig.split(" "); + for(String part : contentParts) + { + content.append(transformAndAddKey(part, discordConfig, results, station, unloading)); + } + + return content.toString(); + } + + private static String transformAndAddKey(String key, JSONObject config, Results results, TRADE station, boolean unloading) { boolean prefix = key.charAt(0) == '+'; boolean suffix = key.charAt(key.length() - 1) == '+'; @@ -73,51 +93,56 @@ private static String transformAndAddKey(String key, JSONObject redditConfig, Re part.append(System.lineSeparator()); break; case "COMMODITY": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "COMMODITY", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "COMMODITY", unloading, "PREFIX")); part.append(results.getCurrentTrade().NAME); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "COMMODITY", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "COMMODITY", unloading, "SUFFIX")); break; case "PROFIT": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "PROFIT", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "PROFIT", unloading, "PREFIX")); if(unloading) part.append(Settings.unloadingTonProfit / 1000).append("k"); else part.append(Settings.loadingTonProfit / 1000).append("k"); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "PROFIT", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "PROFIT", unloading, "SUFFIX")); break; case "PAD": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "PAD", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "PAD", unloading, "PREFIX")); part.append(station.STATION.PAD); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "PAD", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "PAD", unloading, "SUFFIX")); + break; + case "STAR_DISTANCE": + if(prefix) part.append(ConfigHandler.getValue(config, "STAR_DISTANCE", unloading, "PREFIX")); + part.append(station.STATION.DISTANCE_TO_STAR); + if(suffix) part.append(ConfigHandler.getValue(config, "STAR_DISTANCE", unloading, "SUFFIX")); break; case "QUANTITY": assert Filters.getInstance() != null; - if(prefix) part.append(RedditHandler.getValue(redditConfig, "QUANTITY", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "QUANTITY", unloading, "PREFIX")); part.append(Integer.parseInt(Filters.getInstance().txtQuantity.getText()) / 1000).append("k"); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "QUANTITY", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "QUANTITY", unloading, "SUFFIX")); break; case "STATION": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "STATION", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "STATION", unloading, "PREFIX")); part.append(station.STATION.NAME); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "STATION", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "STATION", unloading, "SUFFIX")); break; case "SYSTEM": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "SYSTEM", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "SYSTEM", unloading, "PREFIX")); part.append(station.STATION.SYSTEM); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "SYSTEM", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "SYSTEM", unloading, "SUFFIX")); break; case "STATION_PRICE": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "STATION_PRICE", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "STATION_PRICE", unloading, "PREFIX")); if(unloading) part.append(station.BUY_PRICE); else part.append(station.SELL_PRICE); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "STATION_PRICE", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "STATION_PRICE", unloading, "SUFFIX")); break; case "CARRIER_PRICE": - if(prefix) part.append(RedditHandler.getValue(redditConfig, "CARRIER_PRICE", unloading, "PREFIX")); + if(prefix) part.append(ConfigHandler.getValue(config, "CARRIER_PRICE", unloading, "PREFIX")); if(unloading) part.append(Details.carrierSell); else part.append(Details.carrierBuy); - if(suffix) part.append(RedditHandler.getValue(redditConfig, "CARRIER_PRICE", unloading, "SUFFIX")); + if(suffix) part.append(ConfigHandler.getValue(config, "CARRIER_PRICE", unloading, "SUFFIX")); break; default: - part.append(RedditHandler.getValue(redditConfig, key.replace("+", "").toUpperCase(Locale.ROOT), unloading, null)); + part.append(ConfigHandler.getValue(config, key.replace("+", "").toUpperCase(Locale.ROOT), unloading, null)); break; } diff --git a/src/main/java/com/fi0x/edct/logic/threads/EDDNHandler.java b/src/main/java/com/fi0x/edct/logic/threads/EDDNHandler.java index 4e0afa8..8f13af9 100644 --- a/src/main/java/com/fi0x/edct/logic/threads/EDDNHandler.java +++ b/src/main/java/com/fi0x/edct/logic/threads/EDDNHandler.java @@ -126,7 +126,7 @@ private void retrieveStationInterrupted(String outputString) stationtype = EDDNCleanup.getStationType(html); starDistance = EDDNCleanup.getStarDistance(html); - if(stationtype == null || padsize == null || starDistance < 0) + if(stationtype == null || padsize == null) { Platform.runLater(() -> MainWindow.getInstance().interactionController.storageController.setEDDNStatus(false)); Logger.WARNING("Aborted station update for " + stationName + " type=" + stationtype + " pad=" + padsize + " starDistance=" + starDistance + " - html: " + html); diff --git a/src/main/resources/css/station.css b/src/main/resources/css/station.css index 4576b3f..9bf0ef7 100644 --- a/src/main/resources/css/station.css +++ b/src/main/resources/css/station.css @@ -42,6 +42,14 @@ -fx-padding: 0 5 0 5; } #btnReddit:hover { - -fx-text-fill: #ffffff; + -fx-text-fill: #000000; -fx-background-color: #ff5700; +} +#btnDiscord { + -fx-text-fill: #ffffff; + -fx-background-color: #202225; + -fx-padding: 0 5 0 5; +} +#btnDiscord:hover { + -fx-background-color: #36393f; } \ No newline at end of file diff --git a/src/main/resources/defaults/discord.json b/src/main/resources/defaults/discord.json new file mode 100644 index 0000000..261228a --- /dev/null +++ b/src/main/resources/defaults/discord.json @@ -0,0 +1,112 @@ +{ + "Text Structure": "JOB LINE LINE +System LINE Carrier LINE +Station LINE +Commodity LINE +Profit+ LINE +Quantity LINE +Station_Price+ LINE +Carrier_Price+ LINE +Pad LINE +Star_Distance+ LINE LINE Tool_credits", + "Required Variables": { + "SEPARATOR": " - ", + "CARRIER": "Carrier: [Your carrier name goes here]", + "TOOL_CREDITS": "The information for this trade was gathered by EDCT. You can download the tool here: https://github.com/Fi0x/EDCT/releases/latest.", + "JOB": { + "LOADING": "Carrier Loading Job", + "UNLOADING": "Carrier Unloading Job" + }, + "TYPE": { + "LOADING": "Type: Loading", + "UNLOADING": "Type: Unloading" + }, + "COMMODITY": { + "LOADING": { + "PREFIX": "Commodity: ", + "SUFFIX": "" + }, + "UNLOADING": { + "PREFIX": "Commodity: ", + "SUFFIX": "" + } + }, + "PROFIT": { + "LOADING": { + "PREFIX": "Profit: ", + "SUFFIX": "cr/t" + }, + "UNLOADING": { + "PREFIX": "Profit: ", + "SUFFIX": "cr/t" + } + }, + "PAD": { + "LOADING": { + "PREFIX": "Landing Pad: ", + "SUFFIX": "" + }, + "UNLOADING": { + "PREFIX": "Landing Pad: ", + "SUFFIX": "" + } + }, + "STAR_DISTANCE": { + "LOADING": { + "PREFIX": "Star Distance: ", + "SUFFIX": "Ls" + }, + "UNLOADING": { + "PREFIX": "Star Distance: ", + "SUFFIX": "Ls" + } + }, + "QUANTITY": { + "LOADING": { + "PREFIX": "Demand: ", + "SUFFIX": "" + }, + "UNLOADING": { + "PREFIX": "Supply: ", + "SUFFIX": "" + } + }, + "STATION": { + "LOADING": { + "PREFIX": "Station: ", + "SUFFIX": "" + }, + "UNLOADING": { + "PREFIX": "Station: ", + "SUFFIX": "" + } + }, + "SYSTEM": { + "LOADING": { + "PREFIX": "System: ", + "SUFFIX": "" + }, + "UNLOADING": { + "PREFIX": "System: ", + "SUFFIX": "" + } + }, + "STATION_PRICE": { + "LOADING": { + "PREFIX": "Station sell Price: ", + "SUFFIX": "cr" + }, + "UNLOADING": { + "PREFIX": "Station buy Price: ", + "SUFFIX": "cr" + } + }, + "CARRIER_PRICE": { + "LOADING": { + "PREFIX": "Carrier buying at: ", + "SUFFIX": "cr" + }, + "UNLOADING": { + "PREFIX": "Carrier selling at: ", + "SUFFIX": "cr" + } + } + }, + "Custom Variables": { + "CUSTOM_VARIABLE": { + "LOADING": "Your custom text for loading the carrier", + "UNLOADING": "Your custom text for unloading the carrier" + } + } +} \ No newline at end of file diff --git a/src/main/resources/defaults/reddit.json b/src/main/resources/defaults/reddit.json index 27b599d..ad75c18 100644 --- a/src/main/resources/defaults/reddit.json +++ b/src/main/resources/defaults/reddit.json @@ -1,6 +1,6 @@ { "Title Structure": "JOB SEPARATOR COMMODITY SEPARATOR PROFIT+", - "Text Structure": "Type LINE +System LINE Carrier LINE +Station LINE +Commodity LINE +Profit+ LINE +Quantity LINE +Station_Price+ LINE +Carrier_Price+ LINE +Pad LINE LINE Tool_credits", + "Text Structure": "Type LINE +System LINE Carrier LINE +Station LINE +Commodity LINE +Profit+ LINE +Quantity LINE +Station_Price+ LINE +Carrier_Price+ LINE +Pad +Star_Distance+ LINE LINE Tool_credits", "Required Variables": { "SEPARATOR": " - ", "CARRIER": "Carrier: [Your carrier name goes here]", @@ -43,6 +43,16 @@ "SUFFIX": "" } }, + "STAR_DISTANCE": { + "LOADING": { + "PREFIX": "Star Distance: ", + "SUFFIX": "Ls" + }, + "UNLOADING": { + "PREFIX": "Star Distance: ", + "SUFFIX": "Ls" + } + }, "QUANTITY": { "LOADING": { "PREFIX": "Demand: ", diff --git a/src/main/resources/fxml/settings.fxml b/src/main/resources/fxml/settings.fxml index 9f75216..b398d18 100644 --- a/src/main/resources/fxml/settings.fxml +++ b/src/main/resources/fxml/settings.fxml @@ -126,6 +126,8 @@ + + + diff --git a/src/main/resources/fxml/station.fxml b/src/main/resources/fxml/station.fxml index 4b200d9..2a5deb7 100644 --- a/src/main/resources/fxml/station.fxml +++ b/src/main/resources/fxml/station.fxml @@ -58,17 +58,23 @@ - + + - +