Skip to content

Commit efa57e2

Browse files
Release 1.1.0 (#23)
* Fix logging * Change loot statistics to include reward chest loot
1 parent 94f237a commit efa57e2

5 files changed

Lines changed: 119 additions & 56 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ target
1818
!maven-wrapper.properties
1919
!maven-wrapper.jar
2020
!system.properties
21-
!src/main/resources/log.properties
21+
!src/main/resources/log4j.properties
2222
src/main/resources/temp

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.wikia.tibia</groupId>
88
<artifactId>TibiaWikiBot</artifactId>
9-
<version>1.0.0</version>
9+
<version>1.1.0</version>
1010
<packaging>jar</packaging>
1111
<name>TibiaWikiBot</name>
1212
<url>https://github.com/benjaminkomen/TibiaWikiBot</url>

src/main/java/com/wikia/tibia/objects/LootStatisticsItem.java

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package com.wikia.tibia.objects;
22

33
import lombok.*;
4+
import lombok.extern.slf4j.Slf4j;
45

56
import java.util.Objects;
67
import java.util.regex.MatchResult;
78
import java.util.regex.Pattern;
89

10+
@Slf4j
911
@Getter
1012
@NoArgsConstructor(access = AccessLevel.PRIVATE)
1113
@AllArgsConstructor(access = AccessLevel.PRIVATE)
1214
@Builder
1315
public class LootStatisticsItem {
1416

15-
private final String NUMBER_REGEX = "(\\d+)";
16-
private final String NUMBER_RANGE_REGEX = "(\\d+)-(\\d+)";
17+
private static final String NUMBER_REGEX = "^(\\d+)$";
18+
private static final Pattern NUMBER_PATTERN = Pattern.compile(NUMBER_REGEX);
19+
private static final String NUMBER_RANGE_REGEX = "^(\\d+)-(\\d+)$";
20+
private static final Pattern NUMBER_RANGE_PATTERN = Pattern.compile(NUMBER_RANGE_REGEX);
1721
private String itemName;
1822
private String times;
1923
private String amount;
@@ -45,16 +49,32 @@ public LootStatisticsItem add(LootStatisticsItem other) {
4549
}
4650

4751
private String sumStringsAsInt(String left, String right) {
52+
if (left == null && right == null) {
53+
return "";
54+
} else if (left == null) {
55+
return right;
56+
} else if (right == null) {
57+
return left;
58+
}
4859
return String.valueOf(Integer.parseInt(left) + Integer.parseInt(right));
4960
}
5061

5162
private String sumAmounts(String left, String right) {
63+
64+
if (left == null && right == null) {
65+
return "";
66+
} else if (left == null) {
67+
return right;
68+
} else if (right == null) {
69+
return left;
70+
}
71+
5272
// if both are a single number, take the maximum
5373
if (left.matches(NUMBER_REGEX) && right.matches(NUMBER_REGEX)) {
54-
String[] leftMatches = getMatches(left);
74+
String[] leftMatches = getMatches(NUMBER_PATTERN, left);
5575
var leftUpper = leftMatches[0];
5676

57-
String[] rightMatches = getMatches(right);
77+
String[] rightMatches = getMatches(NUMBER_PATTERN, right);
5878
var rightUpper = rightMatches[0];
5979

6080
var newUpper = Math.max(Integer.parseInt(leftUpper), Integer.parseInt(rightUpper));
@@ -64,10 +84,12 @@ private String sumAmounts(String left, String right) {
6484

6585
// if both are a range, take the lowest to the highest as new range
6686
if (left.matches(NUMBER_RANGE_REGEX) && right.matches(NUMBER_RANGE_REGEX)) {
67-
String[] leftMatches = getMatches(left);
87+
String[] leftMatches = getMatches(NUMBER_RANGE_PATTERN, left);
88+
leftMatches = leftMatches[0].split("-");
6889
var leftLower = leftMatches[0];
6990
var leftUpper = leftMatches[1];
70-
String[] rightMatches = getMatches(right);
91+
String[] rightMatches = getMatches(NUMBER_RANGE_PATTERN, right);
92+
rightMatches = rightMatches[0].split("-");
7193
var rightLower = rightMatches[0];
7294
var rightUpper = rightMatches[1];
7395

@@ -77,11 +99,47 @@ private String sumAmounts(String left, String right) {
7799
return String.format("%s-%s", newLower, newUpper);
78100
}
79101

80-
return left; // TODO this is not the best default
102+
// if one is a single number and the other a range, compute the range taking the single number into account
103+
if ((left.matches(NUMBER_REGEX) && right.matches(NUMBER_RANGE_REGEX)) ||
104+
(left.matches(NUMBER_RANGE_REGEX) && right.matches(NUMBER_REGEX))) {
105+
106+
if (left.matches(NUMBER_REGEX)) {
107+
String[] leftMatches = getMatches(NUMBER_PATTERN, left);
108+
var leftNumber = leftMatches[0];
109+
110+
String[] rightMatches = getMatches(NUMBER_RANGE_PATTERN, right);
111+
rightMatches = rightMatches[0].split("-");
112+
var rightLower = rightMatches[0];
113+
var rightUpper = rightMatches[1];
114+
115+
var newLower = Math.min(Integer.parseInt(leftNumber), Integer.parseInt(rightLower));
116+
var newUpper = Math.max(Integer.parseInt(leftNumber), Integer.parseInt(rightUpper));
117+
118+
return String.format("%s-%s", newLower, newUpper);
119+
}
120+
121+
if (right.matches(NUMBER_REGEX)) {
122+
String[] rightMatches = getMatches(NUMBER_PATTERN, right);
123+
var rightNumber = rightMatches[0];
124+
125+
String[] leftMatches = getMatches(NUMBER_RANGE_PATTERN, left);
126+
leftMatches = leftMatches[0].split("-");
127+
var leftLower = leftMatches[0];
128+
var leftUpper = leftMatches[1];
129+
130+
var newLower = Math.min(Integer.parseInt(rightNumber), Integer.parseInt(leftLower));
131+
var newUpper = Math.max(Integer.parseInt(rightNumber), Integer.parseInt(leftUpper));
132+
133+
return String.format("%s-%s", newLower, newUpper);
134+
}
135+
}
136+
137+
log.warn("Could not correctly sum amounts, neither left ({}) nor right ({}) is a valid number.", left, right);
138+
return "";
81139
}
82140

83-
private String[] getMatches(String left) {
84-
return Pattern.compile(NUMBER_RANGE_REGEX)
141+
private String[] getMatches(Pattern pattern, String left) {
142+
return pattern
85143
.matcher(left)
86144
.results()
87145
.map(MatchResult::group)

src/test/java/com/wikia/tibia/usecases/FixLootStatisticsTest.java

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@ public class FixLootStatisticsTest {
2424
private FixLootStatistics target;
2525
private CreatureRepository mockCreatureRepository;
2626
private LootRepository mockLootRepository;
27-
private Creature CreatureRat = makeCreatureRat();
28-
private Creature CreatureAmazon = makeCreatureAmazon();
29-
private Loot LootRat = makeLootRat();
30-
private Loot LootAmazon = makeLootAmazon();
31-
32-
private Loot LootRatWithSword = makeLootRatWithSword();
27+
private final Creature CreatureRat = makeCreatureRat();
28+
private final Creature CreatureAmazon = makeCreatureAmazon();
29+
private final LootWrapper LootRat = makeLootRat();
30+
private final LootWrapper LootAmazon = makeLootAmazon();
31+
private final LootWrapper LootRatWithSword = makeLootRatWithSword();
3332

3433
@Before
3534
public void setup() {
@@ -122,51 +121,57 @@ private Creature makeCreatureAmazon() {
122121
.build();
123122
}
124123

125-
private static Loot makeLootRat() {
126-
return Loot.builder()
127-
.kills("14605")
128-
.name("Rat")
129-
.loot(new ArrayList<>(Arrays.asList(
130-
LootStatisticsItem.builder().itemName("Empty").times("108").build(),
131-
LootStatisticsItem.builder().itemName("Cheese").times("5741").build(),
132-
LootStatisticsItem.builder().itemName("Gold Coin").times("14477").amount("1").total("20591").build()
133-
)))
134-
.version("9.63")
124+
private static LootWrapper makeLootRat() {
125+
return LootWrapper.builder()
126+
.loot2(Loot.builder()
127+
.kills("14605")
128+
.name("Rat")
129+
.loot(new ArrayList<>(Arrays.asList(
130+
LootStatisticsItem.builder().itemName("Empty").times("108").build(),
131+
LootStatisticsItem.builder().itemName("Cheese").times("5741").build(),
132+
LootStatisticsItem.builder().itemName("Gold Coin").times("14477").amount("1").total("20591").build()
133+
)))
134+
.version("9.63")
135+
.build())
135136
.build();
136137
}
137138

138-
private static Loot makeLootRatWithSword() {
139-
return Loot.builder()
140-
.kills("14605")
141-
.name("Rat")
142-
.loot(new ArrayList<>(Arrays.asList(
143-
LootStatisticsItem.builder().itemName("Empty").times("108").build(),
144-
LootStatisticsItem.builder().itemName("Cheese").times("5741").build(),
145-
LootStatisticsItem.builder().itemName("Gold Coin").times("14477").amount("1").total("20591").build(),
146-
LootStatisticsItem.builder().itemName("Sword").times("1").build()
147-
)))
148-
.version("9.63")
139+
private static LootWrapper makeLootRatWithSword() {
140+
return LootWrapper.builder()
141+
.loot2(Loot.builder()
142+
.kills("14605")
143+
.name("Rat")
144+
.loot(new ArrayList<>(Arrays.asList(
145+
LootStatisticsItem.builder().itemName("Empty").times("108").build(),
146+
LootStatisticsItem.builder().itemName("Cheese").times("5741").build(),
147+
LootStatisticsItem.builder().itemName("Gold Coin").times("14477").amount("1").total("20591").build(),
148+
LootStatisticsItem.builder().itemName("Sword").times("1").build()
149+
)))
150+
.version("9.63")
151+
.build())
149152
.build();
150153
}
151154

152-
private Loot makeLootAmazon() {
153-
return Loot.builder()
154-
.kills("21983")
155-
.name("Amazon")
156-
.loot(new ArrayList<>(Arrays.asList(
157-
LootStatisticsItem.builder().itemName("Empty").times("253").build(),
158-
LootStatisticsItem.builder().itemName("Dagger").times("17606").amount("1").total("17606").build(),
159-
LootStatisticsItem.builder().itemName("Skull").times("17581").amount("1-2").total("26316").build(),
160-
LootStatisticsItem.builder().itemName("Gold Coin").times("1").amount("1").total("2").build(),
161-
LootStatisticsItem.builder().itemName("Brown Bread").times("1").amount("1").total("2").build(),
162-
LootStatisticsItem.builder().itemName("Sabre").times("1").amount("1").total("2").build(),
163-
LootStatisticsItem.builder().itemName("Girlish Hair Decoration").times("1").amount("1").total("2").build(),
164-
LootStatisticsItem.builder().itemName("Protective Charm").times("1").amount("1").total("2").build(),
165-
LootStatisticsItem.builder().itemName("Torch").times("1").amount("1").total("2").build(),
166-
LootStatisticsItem.builder().itemName("Crystal Necklace").times("1").amount("1").total("2").build(),
167-
LootStatisticsItem.builder().itemName("Small Ruby").times("1").amount("1").total("1").build()
168-
)))
169-
.version("8.6")
155+
private LootWrapper makeLootAmazon() {
156+
return LootWrapper.builder()
157+
.loot2(Loot.builder()
158+
.kills("21983")
159+
.name("Amazon")
160+
.loot(new ArrayList<>(Arrays.asList(
161+
LootStatisticsItem.builder().itemName("Empty").times("253").build(),
162+
LootStatisticsItem.builder().itemName("Dagger").times("17606").amount("1").total("17606").build(),
163+
LootStatisticsItem.builder().itemName("Skull").times("17581").amount("1-2").total("26316").build(),
164+
LootStatisticsItem.builder().itemName("Gold Coin").times("1").amount("1").total("2").build(),
165+
LootStatisticsItem.builder().itemName("Brown Bread").times("1").amount("1").total("2").build(),
166+
LootStatisticsItem.builder().itemName("Sabre").times("1").amount("1").total("2").build(),
167+
LootStatisticsItem.builder().itemName("Girlish Hair Decoration").times("1").amount("1").total("2").build(),
168+
LootStatisticsItem.builder().itemName("Protective Charm").times("1").amount("1").total("2").build(),
169+
LootStatisticsItem.builder().itemName("Torch").times("1").amount("1").total("2").build(),
170+
LootStatisticsItem.builder().itemName("Crystal Necklace").times("1").amount("1").total("2").build(),
171+
LootStatisticsItem.builder().itemName("Small Ruby").times("1").amount("1").total("1").build()
172+
)))
173+
.version("8.6")
174+
.build())
170175
.build();
171176
}
172177
}

0 commit comments

Comments
 (0)