Skip to content

Commit 93827df

Browse files
Send partial listings to the website
1 parent 144f836 commit 93827df

File tree

10 files changed

+117
-13
lines changed

10 files changed

+117
-13
lines changed

build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ plugins {
55
}
66

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

1010
java {
11-
sourceCompatibility = '17'
11+
sourceCompatibility = '21'
1212
}
1313

1414
repositories {

src/main/java/tools/sctrade/companion/domain/commodity/CommodityListing.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,19 @@
33
import java.time.Instant;
44

55
public record CommodityListing(String location, TransactionType transactionType, String commodity,
6-
double price, int inventory, InventoryLevel inventoryLevel, String batchId, Instant timestamp) {
6+
Double price, Integer inventory, InventoryLevel inventoryLevel, Integer maxBoxSize,
7+
String batchId, Instant timestamp) {
8+
public CommodityListing(String location, TransactionType transactionType, String commodity,
9+
double price, int inventory, InventoryLevel inventoryLevel, String batchId,
10+
Instant timestamp) {
11+
this(location, transactionType, commodity, price, inventory, inventoryLevel, null, batchId,
12+
timestamp);
13+
}
14+
15+
public CommodityListing(String location, TransactionType transactionType, String commodity,
16+
Integer maxBoxSize, String batchId, Instant timestamp) {
17+
this(location, transactionType, commodity, null, null, null, maxBoxSize, batchId, timestamp);
18+
}
719

820
public CommodityListing withLocation(String location) {
921
return new CommodityListing(location, transactionType(), commodity(), price(), inventory(),

src/main/java/tools/sctrade/companion/domain/commodity/CommodityListingFactory.java

+11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Collections;
99
import java.util.Iterator;
1010
import java.util.List;
11+
import java.util.Locale;
1112
import java.util.Optional;
1213
import java.util.TreeMap;
1314
import org.slf4j.Logger;
@@ -40,6 +41,16 @@ public CommodityListingFactory(CommodityRepository commodityRepository, ImageWri
4041
.withInitial(() -> new CommodityListingsTesseractOcr(preprocessingManipulations));
4142
}
4243

44+
public CommodityListing build(String shopId, String shopName, String commodity,
45+
int maxBoxSizeInScu) {
46+
Instant now = TimeUtil.getNow();
47+
String location = String.format(Locale.ROOT, "%s#%s", shopName, shopId);
48+
String batchId = HashUtil.hash(String.format(Locale.ROOT, "%s%s%d%s", location, commodity,
49+
maxBoxSizeInScu, now.toString()));
50+
return new CommodityListing(location, TransactionType.SELLS, commodity, maxBoxSizeInScu,
51+
batchId, now);
52+
}
53+
4354
public Collection<CommodityListing> build(BufferedImage screenCapture, String location) {
4455
try {
4556
logger.debug("Reading listings...");

src/main/java/tools/sctrade/companion/domain/commodity/CommodityService.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.Collection;
55
import java.util.Optional;
66
import java.util.concurrent.Semaphore;
7+
import java.util.concurrent.TimeUnit;
78
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
910
import org.springframework.scheduling.annotation.Scheduled;
@@ -32,11 +33,21 @@ public CommodityService(CommoditySubmissionFactory submissionFactory,
3233
this.pendingSubmission = Optional.empty();
3334
}
3435

36+
public void process(CommodityListing commodityListing) throws InterruptedException {
37+
CommoditySubmission submission = submissionFactory.build(commodityListing);
38+
39+
process(submission);
40+
}
41+
3542
@Override
3643
public void process(BufferedImage screenCapture) throws InterruptedException {
3744
CommoditySubmission submission = submissionFactory.build(screenCapture);
3845
notificationService.info(LocalizationUtil.get("infoCommodityListingsRead"));
3946

47+
process(submission);
48+
}
49+
50+
private void process(CommoditySubmission submission) throws InterruptedException {
4051
try {
4152
logger.debug("Acquiring mutex...");
4253
mutex.acquire();
@@ -52,7 +63,7 @@ public void process(BufferedImage screenCapture) throws InterruptedException {
5263
}
5364
}
5465

55-
@Scheduled(fixedDelay = 600)
66+
@Scheduled(fixedDelay = 30, timeUnit = TimeUnit.SECONDS)
5667
public void flush() throws InterruptedException {
5768
try {
5869
logger.debug("Acquiring mutex...");

src/main/java/tools/sctrade/companion/domain/commodity/CommoditySubmissionFactory.java

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tools.sctrade.companion.domain.commodity;
22

33
import java.awt.image.BufferedImage;
4+
import java.util.List;
45
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
67
import tools.sctrade.companion.domain.notification.NotificationService;
@@ -40,4 +41,8 @@ CommoditySubmission build(BufferedImage screenCapture) {
4041

4142
return new CommoditySubmission(userService.get(), listings);
4243
}
44+
45+
CommoditySubmission build(CommodityListing commodityListing) {
46+
return new CommoditySubmission(userService.get(), List.of(commodityListing));
47+
}
4348
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,30 @@
11
package tools.sctrade.companion.domain.gamelog.lineprocessors;
22

3+
import java.util.Locale;
34
import java.util.regex.Pattern;
45
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
7+
import tools.sctrade.companion.domain.commodity.CommodityListingFactory;
8+
import tools.sctrade.companion.domain.commodity.CommodityService;
69
import tools.sctrade.companion.domain.gamelog.GameLogLineProcessor;
10+
import tools.sctrade.companion.domain.notification.NotificationService;
11+
import tools.sctrade.companion.utils.LocalizationUtil;
712

813
public class LoadShopInventoryDataLogLineProcessor extends GameLogLineProcessor {
914
private final Logger logger =
1015
LoggerFactory.getLogger(LoadShopInventoryDataLogLineProcessor.class);
1116

12-
public LoadShopInventoryDataLogLineProcessor() {
17+
private NotificationService notificationService;
18+
private CommodityListingFactory commodityListingFactory;
19+
private CommodityService commodityService;
20+
21+
public LoadShopInventoryDataLogLineProcessor(CommodityListingFactory commodityListingFactory,
22+
CommodityService commodityService, NotificationService notificationService) {
1323
this.regex =
14-
".+LoadShopInventoryData.+shopName\\[(?<shopName>\\w+)\\] commodityName\\[ResourceType\\.(?<commodityName>\\w+)\\].+boxSize\\[(?<maxBoxSize>\\d+)\\] \\[Team_NAPU\\]\\[Shops\\]\\[UI\\]";
24+
".+LoadShopInventoryData.+shopId\\[(?<shopId>\\d+)\\] shopName\\[(?<shopName>[\\w-]+)\\] commodityName\\[ResourceType\\.(?<commodityName>[\\w-]+)\\].+boxSize\\[(?<maxBoxSize>\\d+)\\] \\[Team_NAPU\\]\\[Shops\\]\\[UI\\]";
25+
this.commodityListingFactory = commodityListingFactory;
26+
this.commodityService = commodityService;
27+
this.notificationService = notificationService;
1528
}
1629

1730
@Override
@@ -20,11 +33,24 @@ protected void handle(String value) {
2033
var matcher = pattern.matcher(value);
2134
matcher.matches();
2235

36+
var shopId = matcher.group("shopId");
2337
var shopName = matcher.group("shopName");
2438
var commodityName = matcher.group("commodityName");
2539
var maxBoxSize = Integer.valueOf(matcher.group("maxBoxSize"));
2640

27-
logger.info("Shop {} sells {} in boxes of up to {} SCU", shopName, commodityName, maxBoxSize);
28-
}
41+
logger.info("Shop {}#{} sells {} in boxes of up to {} SCU", shopName, shopId, commodityName,
42+
maxBoxSize);
43+
notificationService
44+
.info(String.format(Locale.ROOT, LocalizationUtil.get("infoLocationDetectedFromLogs"),
45+
String.format(Locale.ROOT, "%s#%s", shopName, shopId)));
2946

47+
var commodityListing =
48+
commodityListingFactory.build(shopId, shopName, commodityName, maxBoxSize);
49+
50+
try {
51+
commodityService.process(commodityListing);
52+
} catch (InterruptedException e) {
53+
logger.error("Could not send {} for processing", commodityListing, e);
54+
}
55+
}
3056
}

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ private CommoditySubmissionDto buildDto(CommoditySubmission submission) {
9999
UserDto userDto = new UserDto(submission.getUser().id(), submission.getUser().label());
100100
List<CommodityListingDto> listings = submission.getListings().parallelStream()
101101
.map(n -> new CommodityListingDto(n.location(), n.transactionType().toString(),
102-
n.commodity(), n.price(), n.inventory(), n.inventoryLevel().getSaturation(),
103-
n.batchId(), new Timestamp(n.timestamp().toEpochMilli())))
102+
n.commodity(), n.price(), n.inventory(),
103+
(n.inventoryLevel() == null ? null : n.inventoryLevel().getSaturation()),
104+
n.maxBoxSize(), n.batchId(), new Timestamp(n.timestamp().toEpochMilli())))
104105
.toList();
105106

106107
return new CommoditySubmissionDto(userDto, listings);
@@ -113,7 +114,8 @@ private record UserDto(String id, String label) {
113114
}
114115

115116
private record CommodityListingDto(String location, String transaction, String commodity,
116-
double price, Integer quantity, double saturation, String batchId, Timestamp timestamp) {
117+
Double price, Integer quantity, Double saturation, Integer maxBoxSizeInScu, String batchId,
118+
Timestamp timestamp) {
117119
}
118120

119121
private record LocationDto(String name, String type) {

src/main/java/tools/sctrade/companion/spring/AppConfig.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,11 @@ public GameLogPathSubject buildGameLogSubject(SettingRepository settings) {
9494
}
9595

9696
@Bean("TailerListener")
97-
public TailerListener buildTailerListener() {
97+
public TailerListener buildTailerListener(CommodityListingFactory commodityListingFactory,
98+
CommodityService commodityService, NotificationService notificationService) {
9899
var oldLogLineProcessor = new OldLogLineProcessor();
99-
var loadShopInventoryDataLogLineProcessor = new LoadShopInventoryDataLogLineProcessor();
100+
var loadShopInventoryDataLogLineProcessor = new LoadShopInventoryDataLogLineProcessor(
101+
commodityListingFactory, commodityService, notificationService);
100102
var fallbackLogLineProcessor = new FallbackLogLineProcessor();
101103

102104
oldLogLineProcessor.setNext(loadShopInventoryDataLogLineProcessor);

src/main/resources/bundles/localization.properties

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ infoCommodityListingsCsvOutput = Wrote %d commodity listings to '%s'
2323
infoCommodityListingsScTradeToolsOutput = Sent %d commodity listings to SC Trade Tools
2424
infoCommodityListingsRead = Read commodity listings
2525
infoTailingGameLogs = Watching game logs...
26+
infoLocationDetectedFromLogs = Location detected: %s
2627
warnNoLocation = Select the current shop/city name in the "Your inventories" dropdown
2728
errorNotEnoughColumns = [Code 1] Could not make out %d or more column(s) of text in:%n%s
2829
errorRectangleOutOfBounds = [Code 2] Rectangle '%s' is not within '%s'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package tools.sctrade.companion.domain.gamelog.lineprocessors;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.params.ParameterizedTest;
5+
import org.junit.jupiter.params.provider.ValueSource;
6+
import org.mockito.Mock;
7+
import tools.sctrade.companion.domain.commodity.CommodityListingFactory;
8+
import tools.sctrade.companion.domain.commodity.CommodityService;
9+
import tools.sctrade.companion.domain.notification.NotificationService;
10+
11+
class LoadShopInventoryDataLogLineProcessorTest {
12+
@Mock
13+
private CommodityListingFactory commodityListingFactory;
14+
@Mock
15+
private CommodityService commodityService;
16+
@Mock
17+
private NotificationService notificationService;
18+
19+
private LoadShopInventoryDataLogLineProcessor processor;
20+
21+
@BeforeEach()
22+
void setUp() {
23+
processor = new LoadShopInventoryDataLogLineProcessor(commodityListingFactory, commodityService,
24+
notificationService);
25+
}
26+
27+
@ParameterizedTest
28+
@ValueSource(strings = {
29+
"<2024-12-04T19:23:39.548Z> [Notice] <CEntityComponentCommodityUIProvider::LoadShopInventoryData::<lambda_1>::operator ()> AddingCommodityBox - playerId[123456789012] shopId[5643020808917] shopName[SCShop_CommEx_TDD_Orison] commodityName[ResourceType.Scrap] Available Box Sizes: boxSize[1] boxSize[2] boxSize[4] boxSize[8] boxSize[16] boxSize[24] boxSize[32] [Team_NAPU][Shops][UI]",
30+
"<2024-12-04T19:31:12.471Z> [Notice] <CEntityComponentCommodityUIProvider::LoadShopInventoryData::<lambda_1>::operator ()> AddingCommodityBox - playerId[123456789012] shopId[5643020760642] shopName[SCShop_AdminOffice_NewBabbage-002] commodityName[ResourceType.Scrap] Available Box Sizes: boxSize[1] boxSize[2] boxSize[4] boxSize[8] boxSize[16] boxSize[24] boxSize[32] [Team_NAPU][Shops][UI]"})
31+
void givenValidLogLinesWhenCheckingIfCanHandleThenReturnTrue(String line) {
32+
// TODO
33+
}
34+
}

0 commit comments

Comments
 (0)