11package com .wikia .tibia .objects ;
22
33import lombok .*;
4+ import lombok .extern .slf4j .Slf4j ;
45
56import java .util .Objects ;
67import java .util .regex .MatchResult ;
78import java .util .regex .Pattern ;
89
10+ @ Slf4j
911@ Getter
1012@ NoArgsConstructor (access = AccessLevel .PRIVATE )
1113@ AllArgsConstructor (access = AccessLevel .PRIVATE )
1214@ Builder
1315public 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 )
0 commit comments