package dekk.pw.pokemate;
import com.google.common.util.concurrent.AtomicDouble;
import com.pokegoapi.api.PokemonGo;
import com.pokegoapi.api.device.DeviceInfo;
import com.pokegoapi.auth.CredentialProvider;
import com.pokegoapi.exceptions.LoginFailedException;
import com.pokegoapi.exceptions.RemoteServerException;
import com.pokegoapi.util.SystemTimeImpl;
import dekk.pw.pokemate.tasks.TaskController;
import dekk.pw.pokemate.tasks.Update;
import dekk.pw.pokemate.util.LatLongFromLocation;
import dekk.pw.pokemate.util.Time;
import javafx.application.Application;
import okhttp3.OkHttpClient;
import org.apache.commons.codec.binary.Hex;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
* Created by TimD on 7/21/2016.
*/
public class PokeMate {
public static final Path CONFIG_PROPERTIES = Paths.get("config.properties");
public static long startTime;
private static Context context;
private static final Logger logger = LogManager.getLogger(PokeMate.class);
private double getSmallRandom() {
return Math.random() * 0.0003 - 0.0003;
}
private PokeMate() throws LoginFailedException, RemoteServerException {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(60, TimeUnit.SECONDS);
builder.readTimeout(60, TimeUnit.SECONDS);
builder.writeTimeout(60, TimeUnit.SECONDS);
OkHttpClient http = builder.build();
CredentialProvider auth;
AtomicDouble lat;
AtomicDouble lng;
// Co-ordinates by location name
if (Config.isUseCustomNamedLocation()) {
LatLongFromLocation fromLocation = new LatLongFromLocation(Config.getGoogleApiKey());
String namedLocation = Config.getCustomNamedLocation();
fromLocation.parseLocation(namedLocation);
lat = fromLocation.getLatitude();
lng = fromLocation.getLongitude();
logger.info("Using Custom Location {} with lat/lon {}, {}", namedLocation, lat, lng);
} else { // Use given co-ordindates instead
AtomicDouble alat = new AtomicDouble();
alat.set(Double.parseDouble(Config.getProperties().getProperty("latitude")) + getSmallRandom());
lat = alat;
AtomicDouble alng = new AtomicDouble();
alng.set(Double.parseDouble(Config.getProperties().getProperty("longitude")) + getSmallRandom());
lng = alng;
logger.info("Using Coordinates {}, {}", lat, lng);
}
auth = Context.Login(http);
logger.info("Logged in as {}", Config.getUsername());
//PokemonGo go = new PokemonGo(auth, http);
PokemonGo go = new PokemonGo(auth, http, new SystemTimeImpl());
// Generate Device
DeviceInfo deviceInfo = new DeviceInfo();
byte[] b = new byte[16];
new Random().nextBytes(b);
deviceInfo.setDeviceId(Hex.encodeHexString(b));
deviceInfo.setDeviceBrand("Apple");
deviceInfo.setDeviceModel(Config.getDeviceSettings().get(2));
deviceInfo.setDeviceModelBoot(Config.getDeviceSettings().get(0) + "," + Config.getDeviceSettings().get(1)); //TODO: Fix this stupid hack
deviceInfo.setHardwareManufacturer("Apple");
deviceInfo.setHardwareModel(Config.getDeviceSettings().get(3));
deviceInfo.setFirmwareBrand("iPhone OS");
deviceInfo.setFirmwareType(Config.getOsVersion());
go.setDeviceInfo(deviceInfo);
context = new Context(go, go.getPlayerProfile(), false, auth, http);
context.setLat(lat);
context.setLng(lng);
go.setLocation(context.getLat().get(), context.getLng().get(), 0);
Time.sleep(5000);
new Update(context).run();
if (Config.isShowUI()) {
PokeMateUI.setPoke(this);
new Thread(() -> Application.launch(PokeMateUI.class, "")).start();
}
Time.sleep(500);
TaskController controller = new TaskController(context);
controller.start();
startTime = System.currentTimeMillis();
}
public static void main(String[] args) throws RemoteServerException, IOException, LoginFailedException {
File configProperties;
if (args.length == 0) {
configProperties = new File("config.properties");
logger.info("Using default config.properties location");
} else {
configProperties = new File(args[0]);
logger.info("Using configuration file: {}", configProperties.toPath());
}
if (!configProperties.exists()) {
logger.error("ERROR - Could not find the required config.properties file: {}", configProperties.getAbsolutePath());
System.exit(1);
}
Config.load(configProperties.getPath());
new PokeMate();
}
public static Context getContext() {
return context;
}
}