Skip to content

Commit 10a76af

Browse files
Merge branch 'main' into wayland-screenshots
2 parents 3a71b7b + 9d36d65 commit 10a76af

18 files changed

+218
-41
lines changed

build.gradle

+12-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
plugins {
22
id 'java'
3-
id 'org.springframework.boot' version '3.1.4'
4-
id 'io.spring.dependency-management' version '1.1.3'
3+
id 'org.springframework.boot' version '3.4.0'
4+
id 'io.spring.dependency-management' version '1.1.6'
55
}
66

77
group = 'tools.sctrade'
8-
version = '1.0.3'
8+
version = '1.0.4'
99

1010
java {
1111
sourceCompatibility = '17'
@@ -24,25 +24,26 @@ dependencies {
2424
implementation 'com.1stleg:jnativehook:2.1.0'
2525

2626
// GUI look and feel
27-
implementation 'com.formdev:flatlaf:3.2.5'
28-
implementation 'com.formdev:flatlaf-intellij-themes:3.2.5'
27+
implementation 'com.formdev:flatlaf:3.5.2'
28+
implementation 'com.formdev:flatlaf-intellij-themes:3.5.2'
2929

3030
// OCR
31-
implementation 'net.sourceforge.tess4j:tess4j:5.8.0'
32-
implementation 'org.openpnp:opencv:4.8.1-0'
31+
implementation 'net.sourceforge.tess4j:tess4j:5.13.0'
32+
implementation 'org.openpnp:opencv:4.9.0-0'
3333

3434
// Utils
3535
implementation 'org.imgscalr:imgscalr-lib:4.2'
3636
implementation 'org.apache.commons:commons-math3:3.6.1'
37-
implementation 'com.opencsv:opencsv:5.7.1'
38-
37+
implementation 'commons-io:commons-io:2.18.0'
38+
implementation 'com.opencsv:opencsv:5.9'
39+
3940
// DBUS interaction libraries
4041
implementation 'com.github.hypfvieh:dbus-java-core:5.1.0'
4142
implementation 'com.github.hypfvieh:dbus-java-transport-junixsocket:5.1.0'
42-
43+
4344
// Tests
4445
testImplementation 'org.springframework.boot:spring-boot-starter-test'
45-
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
46+
testImplementation 'org.junit.jupiter:junit-jupiter:5.11.3'
4647
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
4748
}
4849

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package tools.sctrade.companion.domain.gamelog;
2+
3+
import java.nio.file.Path;
4+
5+
public abstract class FilePathObserver {
6+
private FilePathSubject subject;
7+
protected Path filePath;
8+
9+
protected FilePathObserver(FilePathSubject subject) {
10+
this.subject = subject;
11+
}
12+
13+
protected void update() {
14+
this.filePath = subject.getState();
15+
}
16+
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package tools.sctrade.companion.domain.gamelog;
2+
3+
import java.nio.file.Path;
4+
import java.util.Collection;
5+
6+
public abstract class FilePathSubject {
7+
Collection<FilePathObserver> observers;
8+
Path filePath;
9+
10+
public void attach(FilePathObserver observer) {
11+
observers.add(observer);
12+
}
13+
14+
public void detach(FilePathObserver observer) {
15+
observers.remove(observer);
16+
}
17+
18+
public Path getState() {
19+
return filePath;
20+
}
21+
22+
protected abstract void setState();
23+
24+
protected void notifyObservers() {
25+
observers.forEach(n -> n.update());
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package tools.sctrade.companion.domain.gamelog;
2+
3+
import org.apache.commons.io.input.TailerListener;
4+
import org.apache.commons.io.input.TailerListenerAdapter;
5+
6+
public class GameLogListener extends TailerListenerAdapter implements TailerListener {
7+
@Override
8+
public void handle(String line) {}
9+
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package tools.sctrade.companion.domain.gamelog;
2+
3+
import java.nio.file.Path;
4+
import java.util.ArrayList;
5+
import java.util.Optional;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import tools.sctrade.companion.domain.setting.Setting;
9+
import tools.sctrade.companion.domain.setting.SettingRepository;
10+
11+
public class GameLogPathSubject extends FilePathSubject {
12+
static final String GAME_LOG_FILE = "Game.log";
13+
14+
private final Logger logger = LoggerFactory.getLogger(GameLogPathSubject.class);
15+
16+
private SettingRepository settings;
17+
18+
public GameLogPathSubject(SettingRepository settings) {
19+
super();
20+
this.settings = settings;
21+
this.observers = new ArrayList<>();
22+
setState();
23+
}
24+
25+
public void setStarCitizenLivePath(String starCitizenLivePath) {
26+
if (starCitizenLivePath == null || starCitizenLivePath.strip().isEmpty()) {
27+
logger.warn("Star Citizen LIVE path is empty");
28+
return;
29+
}
30+
31+
starCitizenLivePath = starCitizenLivePath.strip();
32+
settings.set(Setting.STAR_CITIZEN_LIVE_PATH, starCitizenLivePath.replace("\\", "\\\\"));
33+
setState();
34+
}
35+
36+
public Optional<String> getStarCitizenLivePath() {
37+
return Optional.ofNullable(settings.get(Setting.STAR_CITIZEN_LIVE_PATH).toString());
38+
}
39+
40+
@Override
41+
protected void setState() {
42+
if (getStarCitizenLivePath().isEmpty()) {
43+
return;
44+
}
45+
46+
filePath = Path.of(getStarCitizenLivePath().get(), GAME_LOG_FILE);
47+
notifyObservers();
48+
}
49+
}

src/main/java/tools/sctrade/companion/domain/user/Setting.java src/main/java/tools/sctrade/companion/domain/setting/Setting.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package tools.sctrade.companion.domain.user;
1+
package tools.sctrade.companion.domain.setting;
22

33
import java.nio.file.Paths;
44

55
public enum Setting {
6-
OUTPUT_SCREENSHOTS, OUTPUT_TRANSIENT_IMAGES, MY_IMAGES_PATH, MY_DATA_PATH, SC_TRADE_TOOLS_ROOT_URL, USERNAME;
6+
OUTPUT_SCREENSHOTS, OUTPUT_TRANSIENT_IMAGES, MY_IMAGES_PATH, MY_DATA_PATH, SC_TRADE_TOOLS_ROOT_URL, USERNAME, STAR_CITIZEN_LIVE_PATH;
77

88
@SuppressWarnings("unchecked")
99
public <T> T cast(String value) {

src/main/java/tools/sctrade/companion/domain/user/SettingRepository.java src/main/java/tools/sctrade/companion/domain/setting/SettingRepository.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tools.sctrade.companion.domain.user;
1+
package tools.sctrade.companion.domain.setting;
22

33
import java.nio.file.Path;
44
import java.nio.file.Paths;
@@ -13,7 +13,8 @@
1313
import tools.sctrade.companion.utils.CsvUtil;
1414

1515
public class SettingRepository {
16-
private static final Collection<Setting> USER_DEFINED = Arrays.asList(Setting.USERNAME);
16+
private static final Collection<Setting> USER_DEFINED =
17+
Arrays.asList(Setting.USERNAME, Setting.STAR_CITIZEN_LIVE_PATH);
1718
private final Logger logger = LoggerFactory.getLogger(SettingRepository.class);
1819

1920
private Map<Setting, String> settings;

src/main/java/tools/sctrade/companion/domain/user/UserService.java

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import java.util.UUID;
66
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
8+
import tools.sctrade.companion.domain.setting.Setting;
9+
import tools.sctrade.companion.domain.setting.SettingRepository;
810
import tools.sctrade.companion.utils.HashUtil;
911

1012
public class UserService {

src/main/java/tools/sctrade/companion/gui/CompanionGui.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
import javax.swing.JMenuBar;
1616
import javax.swing.JMenuItem;
1717
import javax.swing.JTabbedPane;
18+
import tools.sctrade.companion.domain.gamelog.GameLogPathSubject;
1819
import tools.sctrade.companion.domain.notification.NotificationLevel;
1920
import tools.sctrade.companion.domain.notification.NotificationRepository;
20-
import tools.sctrade.companion.domain.user.SettingRepository;
21+
import tools.sctrade.companion.domain.setting.SettingRepository;
2122
import tools.sctrade.companion.domain.user.UserService;
2223
import tools.sctrade.companion.utils.LocalizationUtil;
2324
import tools.sctrade.companion.utils.TimeFormat;
@@ -27,12 +28,15 @@ public class CompanionGui extends JFrame implements NotificationRepository {
2728
private static final long serialVersionUID = -983766141308946535L;
2829

2930
private transient UserService userService;
31+
private transient GameLogPathSubject gameLogService;
3032
private transient SettingRepository settings;
3133
private final String version;
3234
private LogsTab logsTab;
3335

34-
public CompanionGui(UserService userService, SettingRepository settings, String version) {
36+
public CompanionGui(UserService userService, GameLogPathSubject gameLogService,
37+
SettingRepository settings, String version) {
3538
this.userService = userService;
39+
this.gameLogService = gameLogService;
3640
this.settings = settings;
3741
this.version = version;
3842
}
@@ -100,7 +104,8 @@ private void buildTabs() {
100104

101105
var tabbedPane = new JTabbedPane();
102106
tabbedPane.addTab(LocalizationUtil.get("tabUsage"), new UsageTab());
103-
tabbedPane.addTab(LocalizationUtil.get("tabSettings"), new SettingsTab(userService, settings));
107+
tabbedPane.addTab(LocalizationUtil.get("tabSettings"),
108+
new SettingsTab(userService, gameLogService, settings));
104109
tabbedPane.addTab(LocalizationUtil.get("tabLogs"), logsTab);
105110

106111
add(tabbedPane);

src/main/java/tools/sctrade/companion/gui/SettingsTab.java

+48-11
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,22 @@
77
import javax.swing.JTextField;
88
import javax.swing.event.DocumentEvent;
99
import javax.swing.event.DocumentListener;
10-
import tools.sctrade.companion.domain.user.Setting;
11-
import tools.sctrade.companion.domain.user.SettingRepository;
10+
import tools.sctrade.companion.domain.gamelog.GameLogPathSubject;
11+
import tools.sctrade.companion.domain.setting.Setting;
12+
import tools.sctrade.companion.domain.setting.SettingRepository;
1213
import tools.sctrade.companion.domain.user.UserService;
1314
import tools.sctrade.companion.utils.LocalizationUtil;
1415

1516
public class SettingsTab extends JPanel {
1617
private static final long serialVersionUID = -3532718267415423680L;
1718

18-
public SettingsTab(UserService userService, SettingRepository settings) {
19+
public SettingsTab(UserService userService, GameLogPathSubject gameLogService,
20+
SettingRepository settings) {
1921
super();
2022
setLayout(new GridBagLayout());
2123

2224
buildUsernameField(userService);
25+
buildStarCitizenLivePathField(gameLogService);
2326
buildDataPathField(settings.get(Setting.MY_DATA_PATH).toString());
2427
buildImagesPathField(settings.get(Setting.MY_IMAGES_PATH).toString());
2528
}
@@ -34,20 +37,20 @@ private void buildUsernameField(UserService userService) {
3437
usernameField.getDocument().addDocumentListener(new DocumentListener() {
3538
@Override
3639
public void insertUpdate(DocumentEvent e) {
37-
updateUserLabel();
40+
updateUsername();
3841
}
3942

4043
@Override
4144
public void removeUpdate(DocumentEvent e) {
42-
updateUserLabel();
45+
updateUsername();
4346
}
4447

4548
@Override
4649
public void changedUpdate(DocumentEvent e) {
47-
updateUserLabel();
50+
updateUsername();
4851
}
4952

50-
private void updateUserLabel() {
53+
private void updateUsername() {
5154
userService.updateUsername(usernameField.getText());
5255
}
5356
});
@@ -58,16 +61,50 @@ private void updateUserLabel() {
5861
buildLabel(2, " ");
5962
}
6063

64+
private void buildStarCitizenLivePathField(GameLogPathSubject gameLogService) {
65+
var starCitizenLivePathLabel = buildLabel(3, LocalizationUtil.get("labelStarCitizenLivePath"));
66+
var starCitizenLivePathField = buildTextField(3, gameLogService.getStarCitizenLivePath().get());
67+
starCitizenLivePathField.putClientProperty("JTextField.placeholderText",
68+
LocalizationUtil.get("textFieldStarCitizenLivePathPlaceholder"));
69+
starCitizenLivePathLabel.setLabelFor(starCitizenLivePathField);
70+
71+
starCitizenLivePathField.getDocument().addDocumentListener(new DocumentListener() {
72+
@Override
73+
public void insertUpdate(DocumentEvent e) {
74+
updateStarCitizenLivePath();
75+
}
76+
77+
@Override
78+
public void removeUpdate(DocumentEvent e) {
79+
updateStarCitizenLivePath();
80+
}
81+
82+
@Override
83+
public void changedUpdate(DocumentEvent e) {
84+
updateStarCitizenLivePath();
85+
}
86+
87+
private void updateStarCitizenLivePath() {
88+
gameLogService.setStarCitizenLivePath(starCitizenLivePathField.getText());
89+
}
90+
});
91+
92+
var tooltip = buildLabel(4, LocalizationUtil.get("tooltipStarCitizenLivePath"));
93+
tooltip.putClientProperty("FlatLaf.styleClass", "small");
94+
tooltip.setEnabled(false);
95+
buildLabel(5, " ");
96+
}
97+
6198
private void buildDataPathField(String dataPath) {
62-
var dataPathLabel = buildLabel(3, LocalizationUtil.get("labelMyData"));
63-
var dataPathField = buildTextField(3, dataPath);
99+
var dataPathLabel = buildLabel(6, LocalizationUtil.get("labelMyData"));
100+
var dataPathField = buildTextField(6, dataPath);
64101
dataPathField.setEditable(false);
65102
dataPathLabel.setLabelFor(dataPathField);
66103
}
67104

68105
private void buildImagesPathField(String imagesPath) {
69-
var imagesPathLabel = buildLabel(4, LocalizationUtil.get("labelMyImages"));
70-
var imagesPathField = buildTextField(4, imagesPath);
106+
var imagesPathLabel = buildLabel(7, LocalizationUtil.get("labelMyImages"));
107+
var imagesPathField = buildTextField(7, imagesPath);
71108
imagesPathField.setEditable(false);
72109
imagesPathLabel.setLabelFor(imagesPathField);
73110
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package tools.sctrade.companion.input;
2+
3+
import tools.sctrade.companion.domain.gamelog.FilePathObserver;
4+
import tools.sctrade.companion.domain.gamelog.FilePathSubject;
5+
6+
public class FileTailer extends FilePathObserver {
7+
8+
protected FileTailer(FilePathSubject subject) {
9+
super(subject);
10+
}
11+
12+
@Override
13+
protected void update() {
14+
super.update();
15+
}
16+
17+
}

src/main/java/tools/sctrade/companion/output/DiskImageWriter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import org.slf4j.LoggerFactory;
88
import tools.sctrade.companion.domain.image.ImageType;
99
import tools.sctrade.companion.domain.image.ImageWriter;
10-
import tools.sctrade.companion.domain.user.Setting;
11-
import tools.sctrade.companion.domain.user.SettingRepository;
10+
import tools.sctrade.companion.domain.setting.Setting;
11+
import tools.sctrade.companion.domain.setting.SettingRepository;
1212
import tools.sctrade.companion.utils.ImageUtil;
1313

1414
public class DiskImageWriter implements ImageWriter {

src/main/java/tools/sctrade/companion/output/commodity/CommodityCsvWriter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import tools.sctrade.companion.domain.commodity.CommodityListing;
1313
import tools.sctrade.companion.domain.commodity.CommoditySubmission;
1414
import tools.sctrade.companion.domain.notification.NotificationService;
15-
import tools.sctrade.companion.domain.user.Setting;
16-
import tools.sctrade.companion.domain.user.SettingRepository;
15+
import tools.sctrade.companion.domain.setting.Setting;
16+
import tools.sctrade.companion.domain.setting.SettingRepository;
1717
import tools.sctrade.companion.utils.AsynchronousProcessor;
1818
import tools.sctrade.companion.utils.CsvUtil;
1919
import tools.sctrade.companion.utils.LocalizationUtil;

src/main/java/tools/sctrade/companion/output/commodity/ScTradeToolsClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
import tools.sctrade.companion.domain.commodity.CommodityRepository;
1818
import tools.sctrade.companion.domain.commodity.CommoditySubmission;
1919
import tools.sctrade.companion.domain.notification.NotificationService;
20-
import tools.sctrade.companion.domain.user.Setting;
21-
import tools.sctrade.companion.domain.user.SettingRepository;
20+
import tools.sctrade.companion.domain.setting.Setting;
21+
import tools.sctrade.companion.domain.setting.SettingRepository;
2222
import tools.sctrade.companion.exceptions.PublicationException;
2323
import tools.sctrade.companion.utils.AsynchronousProcessor;
2424
import tools.sctrade.companion.utils.LocalizationUtil;

0 commit comments

Comments
 (0)