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) {
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 }