package alexoft.OGame;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import alexoft.OGame.resources.LimitedStock;
import alexoft.utils.Network;
public class OGame {
private boolean loggedin = false;
private String universe;
private String user;
private String pass;
private Document doc;
private String ogameVersion;
private List<OGamePlanet> planets;
private Timer ogameTimer;
private Queue<BuildItem> buildQueue;
public List<OGamePlanet> getPlanets() {
return planets;
}
public Queue<BuildItem> getQueue() {
return buildQueue;
}
public OGame() {
planets = new ArrayList<OGamePlanet>();
buildQueue = new LinkedList<BuildItem>();
ogameTimer = new Timer();
ogameTimer.schedule(new BackgroundProcess(this), 1000, 60000);
}
private void fetchPage(String p) {
try {
String i = Network.excuteHTTPGet("http://" + universe + "/game/"
+ p);
this.doc = Jsoup.parse(i);
} catch (Exception e) {
e.printStackTrace();
}
}
public void login(String user, String pass, String univ) {
if(loggedin) return;
try {
this.universe = univ;
System.out.println("Logging in..");
String params = "uni_id=&kid=&is_utf8=1&v=2&uni_url=" + univ
+ "&login=" + user + "&pass=" + pass;
String i = Network.excuteHTTPPost("http://" + univ
+ "/game/reg/login2.php", params);
this.doc = Jsoup.parse(i);
updatePlanets();
getResources();
} catch (IOException ex) {
Logger.getLogger(OGame.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void login() {
login(user, pass, universe);
}
public String getOGameVersion() {
if (ogameVersion == null) {
ogameVersion = this.doc.select("meta[name=ogame-version]").first()
.attr("content").trim();
}
return ogameVersion;
}
public void tryBuild(OGamePlanet p, String page, String item) {
this.fetchPage("index.php?page=" + page + "&cp=" + p.id);
if(this.doc.nodeName() == "script"){
loggedin = false;
System.out.println("Relogin, try later");
login();
return;
}
getResources(p, false);
Element e = this.doc.select("li#button" + item + " div div").first();
if (e == null) {
System.out.println("unknown item");
return;
}
String name = e.select("span.textlabel").first().text().trim();
Element i = e.select("a.fastBuild").first();
if (i == null) {
System.out.println("Cannot build '" + name
+ "', adding on queue pos." + this.buildQueue.size()+1);
BuildItem t = new BuildItem();
t.p = p;
t.page = page;
t.item = item;
t.name = name;
this.buildQueue.add(t);
return;
}
String fastbuild = i.attr("onclick").trim();
fastbuild = fastbuild.substring(fastbuild.indexOf("'") + 1,
fastbuild.lastIndexOf("'"));
String rslt = "";
try {
rslt = Network.excuteHTTPGet(fastbuild);
} catch (IOException e1) {
e1.printStackTrace();
}
if(rslt.startsWith("<script")||rslt.equals("")){
System.out.println("Cannot build '" + name
+ "', adding on queue pos." + this.buildQueue.size()+1);
BuildItem t = new BuildItem();
t.p = p;
t.page = page;
t.item = item;
t.name = name;
this.buildQueue.add(t);
return;
}
System.out.println("Building " + name);
}
public void buildNextOnQueue() {
BuildItem t = this.buildQueue.poll();
if (t != null) {
tryBuild(t.p, t.page, t.item);
}
}
public void getResources() {
for (OGamePlanet p : this.planets) {
getResources(p, true);
}
}
public void getResources(OGamePlanet p, boolean fetchpage) {
if (fetchpage)
this.fetchPage("index.php?page=overview&cp=" + p.id);
String js_u = "";
Elements scriptElement = this.doc.select("script");
for (Element s : scriptElement) {
if (s.html().contains("var session = '")) {
js_u = s.html();
}
}
if (js_u != "") {
String s = "var resourceTickerMetal = {";
int d = js_u.indexOf(s) + s.length();
int f = js_u.indexOf("};", d);
String part = js_u.substring(d, f).trim();
d = part.indexOf(' ');
f = part.indexOf(',');
double ava = Double.parseDouble(part.substring(d, f).trim());
part = part.substring(f + 4).trim();
d = part.indexOf(',') + 2;
f = part.indexOf(']', d);
double max = Double.parseDouble(part.substring(d, f).trim());
part = part.substring(f + 4).trim();
d = part.indexOf(' ');
f = part.indexOf(',', d);
double prod = Double.parseDouble(part.substring(d, f).trim());
p.metal_stock = new LimitedStock(ava, prod, max);
s = "var resourceTickerCrystal = {";
d = js_u.indexOf(s) + s.length();
f = js_u.indexOf("};", d);
part = js_u.substring(d, f).trim();
d = part.indexOf(' ');
f = part.indexOf(',');
ava = Double.parseDouble(part.substring(d, f).trim());
part = part.substring(f + 4).trim();
d = part.indexOf(',') + 2;
f = part.indexOf(']', d);
max = Double.parseDouble(part.substring(d, f).trim());
part = part.substring(f + 4).trim();
d = part.indexOf(' ');
f = part.indexOf(',', d);
prod = Double.parseDouble(part.substring(d, f).trim());
p.cristal_stock = new LimitedStock(ava, prod, max);
s = "var resourceTickerDeuterium = {";
d = js_u.indexOf(s) + s.length();
f = js_u.indexOf("};", d);
part = js_u.substring(d, f).trim();
d = part.indexOf(' ');
f = part.indexOf(',');
ava = Double.parseDouble(part.substring(d, f).trim());
part = part.substring(f + 4).trim();
d = part.indexOf(',') + 2;
f = part.indexOf(']', d);
max = Double.parseDouble(part.substring(d, f).trim());
part = part.substring(f + 4).trim();
d = part.indexOf(' ');
f = part.indexOf(',', d);
prod = Double.parseDouble(part.substring(d, f).trim());
p.deuterium_stock = new LimitedStock(ava, prod, max);
s = "getElementByIdWithCache(\"Countdown\"),";
d = js_u.indexOf(s) + s.length();
if (d != s.length() - 1) {
f = js_u.indexOf(",", d);
part = js_u.substring(d, f).trim();
p.countDownBuilding = Integer.parseInt(part);
}else{
p.countDownBuilding = -1;
}
p.lastUpdateSeconds = System.currentTimeMillis()/1000;
}
}
/*
* Dim js As String = jsnode.InnerText Dim js_u As String =
* Regex.Replace(js, "[\s\r\n]", "") m = Regex.Match(js_u,
* "Metal={available:([\.\d]+?),limit:\[0,([\d]+?)],production:([\.\d]+?),")
* If m.Success Then _metal = New stock(m.Groups(1).Value.Replace(".", ","),
* m.Groups(2).Value.Replace(".", ","), m.Groups(3).Value.Replace(".", ","))
*
* m = Regex.Match(js_u,
* "Crystal={available:([\.\d]+?),limit:\[0,([\d]+?)],production:([\.\d]+?),")
* If m.Success Then _cristal = New stock(m.Groups(1).Value.Replace(".",
* ","), m.Groups(2).Value.Replace(".", ","), m.Groups(3).Value.Replace(".",
* ","))
*
* m = Regex.Match(js_u,
* "Deuterium={available:([\.\d]+?),limit:\[0,([\d]+?)],production:([\.\d]+?),")
* If m.Success Then _deuterieum = New stock(m.Groups(1).Value.Replace(".",
* ","), m.Groups(2).Value.Replace(".", ","), m.Groups(3).Value.Replace(".",
* ","))
*/
public void updatePlanets() {
System.out.println("Updating planets..");
Elements planetsElement = this.doc
.select("div#myWorlds div.smallplanet");
OGamePlanet p;
this.planets.clear();
for (Element planet : planetsElement) {
p = new OGamePlanet();
p.name = (planet.select("span.planet-name").text().trim());
p.id = planet.select("a").attr("href");
p.id = p.id.substring(p.id.lastIndexOf('=') + 1);
this.planets.add(p);
}
}
}