View Javadoc

1   package org.inigma.utopia.parser;
2   
3   import java.util.regex.Matcher;
4   import java.util.regex.Pattern;
5   
6   import org.inigma.utopia.Coordinate;
7   import org.inigma.utopia.Province;
8   import org.inigma.utopia.Rank;
9   import org.inigma.utopia.utils.CalendarUtils;
10  
11  public class ProvinceParser extends CommonParser {
12      private static final Pattern CB_INFO = Pattern.compile("The Province of (.*) (\\(\\d+:\\d+\\)) as of (\\w+ \\d+\\w\\w, YR\\d+).*Race\\s+([a-zA-Z ]+[a-zA-Z])\\s+---\\s+Soldiers\\s+([\\d,-]+)\\s+Ruler\\s+(.*)\\s+---\\s+[a-zA-Z ]+[a-zA-Z]\\s+(\\d+)\\s+Land\\s+([\\d,-]+) Acres\\s+---\\s+[a-zA-Z ]+[a-zA-Z]\\s+([\\d,-]+)\\s+Peasants\\s+([\\d ,-]+)\\s+---\\s+[a-zA-Z ]+[a-zA-Z]\\s+([\\d,-]+)\\s+Building Eff.\\s+([\\d,-]+)%\\s+---\\s+Thieves\\s+(.*)\\s+Money\\s+([\\d,-]+)gc\\s+---\\s+Wizards\\s+(.*)\\s+Food\\s+([\\d,-]+) bushels\\s+---\\s+War Horses\\s+([\\d,-]+)\\s+Runes\\s+([\\d,-]+) runes\\s+---\\s+Prisoners\\s+([\\d,-]+)\\s+Trade Balance\\s+([\\d,-]+)gc\\s+---\\s+Off. Points\\s+([\\d,-]+)\\s+.*Def. Points\\s+([\\d,-]+)", Pattern.DOTALL);
13      private static final Pattern ANGEL_CB_INFO = Pattern.compile("The Province of (.+) (\\(\\d+:\\d+\\)).*Server: World of Legends \\(Age \\d+\\).*RL Date: (.+?)\\n.+?Ruler Name: (.+)\\s+Personality & Race: (.+), (.+)\\s+Land: (.+?) Acres\\s+Money: (.+?)gc \\(.*?Food: (.+?) bushels\\s+Runes: (.+?) runes.*?Peasants: (.+?) \\((.+?)% Building Efficiency\\)\\s+Trade Balance: (.+?)gc.*?(Networth: (.+?) \\()?.*?Soldiers: (.+?) \\(.+?: (.+?)\\s+.+?: (.+?)\\s+.+?: (.+?)\\s+.+?: (.+?)\\s+.+?: (.+?)\\s+.*Offense: (.+?) .*Defense: (.+?)\\s+.*?(Thieves: (.+?)\\s+.*?Wizards: (.+?)\\s+.*?)?(Estimated Thieves Number: (.+?)\\s.*Estimated Wizards Number: (.+?)\\s|HINT)", Pattern.DOTALL);
14  
15      private static final String DRAGON = "A Dragon ravages the lands!";
16      private static final String WAR = "Our Kingdom is at WAR!";
17      private static final Pattern NAME = Pattern.compile("(.*?)(Mr\\.|Ms\\.|Sir|Lady|Lord|Noble Lady|Baron|Baroness|Viscount|Viscountess|Count|Countess|Marquis|Marchioness|Duke|Dutchess|Prince|Princess|King|Queen) (.*)");
18  
19      public static Province parse(String cbpage) {
20          Province province = parseRaw(cbpage);
21          if (province == null) {
22              province = parseAngel(cbpage);
23          }
24          return province;
25      }
26  
27      private static Province parseAngel(String cbpage) {
28          Province province = null;
29          Matcher matcher = ANGEL_CB_INFO.matcher(cbpage);
30          if (matcher.find()) {
31              province = new Province();
32              province.setLastUpdate(CalendarUtils.getCalendar());
33              province.setCoordinate(new Coordinate(matcher.group(2)));
34              province.setName(matcher.group(1));
35              Matcher namer = NAME.matcher(matcher.group(4));
36              if (namer.find()) {
37                  province.setGender(Rank.isMale(namer.group(2)));
38                  province.setRank(getRank(namer.group(2)));
39                  province.setLeader(namer.group(1) + namer.group(3));
40                  province.setPersonality(getPersonality(province));
41              }
42              province.setRace(getRace(matcher.group(6)));
43              province.setAcres(getNumber(matcher.group(7)).intValue());
44              province.setGold(getNumber(matcher.group(8)).intValue());
45              province.setFood(getNumber(matcher.group(9)).intValue());
46              province.setRunes(getNumber(matcher.group(10)).intValue());
47              province.setPeasants(getNumber(matcher.group(11)).intValue());
48              province.getSurvey().setEfficiency(getNumber(matcher.group(12)).floatValue() / 100.0f);
49              province.setTradeBalance(getNumber(matcher.group(13)).intValue());
50              province.setNetworth(getNumber(matcher.group(14)).intValue());
51              province.setSoldiers(getNumber(matcher.group(16)).intValue());
52              province.setOffspecs(getNumber(matcher.group(17)).intValue());
53              province.setDefspecs(getNumber(matcher.group(18)).intValue());
54              province.setElites(getNumber(matcher.group(19)).intValue());
55              province.setHorses(getNumber(matcher.group(20)).intValue());
56              province.setPrisoners(getNumber(matcher.group(21)).intValue());
57              province.setOffense(getNumber(matcher.group(22)).intValue());
58              province.setDefense(getNumber(matcher.group(23)).intValue());
59              if (matcher.group(24) == null) { // enemy intel
60                  province.setSelf(false);
61                  province.setThieves(getNumber(matcher.group(28)).intValue());
62                  province.setWizards(getNumber(matcher.group(29)).intValue());
63              } else {
64                  province.setSelf(true);
65                  province.setThieves(getNumber(matcher.group(25)).intValue());
66                  province.setWizards(getNumber(matcher.group(26)).intValue());
67              }
68          }
69          return province;
70      }
71  
72      private static Province parseRaw(String cbpage) {
73          Province province = null;
74          Matcher matcher = CB_INFO.matcher(cbpage);
75          if (matcher.find()) {
76              province = new Province();
77              province.setLastUpdate(CalendarUtils.getCalendar());
78              province.setCoordinate(new Coordinate(matcher.group(2)));
79              province.setName(matcher.group(1));
80              province.setRace(getRace(matcher.group(4)));
81              Matcher namer = NAME.matcher(matcher.group(6));
82              if (namer.find()) {
83                  province.setGender(Rank.isMale(namer.group(2)));
84                  province.setRank(getRank(namer.group(2)));
85                  province.setLeader(namer.group(1) + namer.group(3));
86                  province.setPersonality(getPersonality(province));
87              }
88  
89              province.setAcres(getNumber(matcher.group(8)).intValue());
90              province.setPeasants(getNumber(matcher.group(10)).intValue());
91              province.getSurvey().setEfficiency(getNumber(matcher.group(12)).floatValue() / 100.0f);
92              province.setGold(getNumber(matcher.group(14)).intValue());
93              province.setFood(getNumber(matcher.group(16)).intValue());
94              province.setRunes(getNumber(matcher.group(18)).intValue());
95              province.setTradeBalance(getNumber(matcher.group(20)).intValue());
96              province.setSoldiers(getNumber(matcher.group(5)).intValue());
97              province.setOffspecs(getNumber(matcher.group(7)).intValue());
98              province.setDefspecs(getNumber(matcher.group(9)).intValue());
99              province.setElites(getNumber(matcher.group(11)).intValue());
100             province.setHorses(getNumber(matcher.group(17)).intValue());
101             province.setPrisoners(getNumber(matcher.group(19)).intValue());
102             province.setOffense(getNumber(matcher.group(21)).intValue());
103             province.setDefense(getNumber(matcher.group(22)).intValue());
104             if (!"Unknown".equals(matcher.group(13))) {
105                 province.setSelf(true);
106                 province.setThieves(getNumber(matcher.group(13).substring(0, matcher.group(13).indexOf(' '))).intValue());
107                 province.setWizards(getNumber(matcher.group(15).substring(0, matcher.group(15).indexOf(' '))).intValue());
108             } else {
109                 province.setSelf(false);
110                 province.setThieves(-1);
111                 province.setWizards(-1);
112             }
113         }
114         return province;
115     }
116 }