use of POGOProtos.Networking.Requests.RequestOuterClass.Request in project PokeGOAPI-Java by Grover-c13.
the class RequestHandler method sendInternal.
/**
* Sends an already built request envelope
*
* @param serverResponse the response to append to
* @param requests list of ServerRequests to be sent
* @param platformRequests list of ServerPlatformRequests to be sent
* @param builder the request envelope builder
* @throws RequestFailedException if this message fails to send
*/
private ServerResponse sendInternal(ServerResponse serverResponse, ServerRequest[] requests, ServerPlatformRequest[] platformRequests, RequestEnvelope.Builder builder) throws RequestFailedException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
RequestEnvelope request = builder.build();
try {
request.writeTo(stream);
} catch (IOException e) {
Log.wtf(TAG, "Failed to write request to bytearray ouput stream. This should never happen", e);
}
RequestBody body = RequestBody.create(BINARY_MEDIA, stream.toByteArray());
okhttp3.Request httpRequest = new okhttp3.Request.Builder().url(apiEndpoint).post(body).build();
try (Response response = client.newCall(httpRequest).execute()) {
if (response.code() != 200) {
throw new RequestFailedException("Got a unexpected http code : " + response.code());
}
ResponseEnvelope responseEnvelope;
try (InputStream content = response.body().byteStream()) {
responseEnvelope = ResponseEnvelope.parseFrom(content);
} catch (IOException e) {
// retrieved garbage from the server
throw new RequestFailedException("Received malformed response : " + e);
}
if (responseEnvelope.getApiUrl() != null && responseEnvelope.getApiUrl().length() > 0) {
apiEndpoint = "https://" + responseEnvelope.getApiUrl() + "/rpc";
}
if (responseEnvelope.hasAuthTicket()) {
authTicket = responseEnvelope.getAuthTicket();
}
StatusCode statusCode = responseEnvelope.getStatusCode();
if (requests.length > 0) {
for (int i = 0; i < responseEnvelope.getReturnsCount(); i++) {
ByteString returned = responseEnvelope.getReturns(i);
ServerRequest serverRequest = requests[i];
if (returned != null) {
serverResponse.addResponse(serverRequest.type, returned);
if (serverRequest.type == RequestType.GET_PLAYER) {
if (GetPlayerResponse.parseFrom(returned).getBanned()) {
throw new BannedException("Cannot send request, your account has been banned!");
}
}
} else {
throw new RequestFailedException("Received empty response from server");
}
}
}
for (int i = 0; i < responseEnvelope.getPlatformReturnsCount(); i++) {
PlatformResponse platformResponse = responseEnvelope.getPlatformReturns(i);
ByteString returned = platformResponse.getResponse();
if (returned != null) {
serverResponse.addResponse(platformResponse.getType(), returned);
}
}
if (statusCode != StatusCode.OK && statusCode != StatusCode.OK_RPC_URL_IN_RESPONSE) {
if (statusCode == StatusCode.INVALID_AUTH_TOKEN) {
try {
authTicket = null;
api.getAuthInfo(true);
return sendInternal(serverResponse, requests, platformRequests);
} catch (LoginFailedException | InvalidCredentialsException e) {
throw new RequestFailedException("Failed to refresh auth token!", e);
} catch (RequestFailedException e) {
throw new RequestFailedException("Failed to send request with refreshed auth token!", e);
}
} else if (statusCode == StatusCode.REDIRECT) {
// API_ENDPOINT was not correctly set, should be at this point, though, so redo the request
return sendInternal(serverResponse, requests, platformRequests, builder);
} else if (statusCode == StatusCode.BAD_REQUEST) {
if (api.playerProfile.banned) {
throw new BannedException("Cannot send request, your account has been banned!");
} else {
throw new BadRequestException("A bad request was sent!");
}
} else {
throw new RequestFailedException("Failed to send request: " + statusCode);
}
}
} catch (IOException e) {
throw new RequestFailedException(e);
} catch (RequestFailedException e) {
throw e;
}
return serverResponse;
}
use of POGOProtos.Networking.Requests.RequestOuterClass.Request in project PokeGOAPI-Java by Grover-c13.
the class LocationFixes method getDefault.
/**
* Gets the default device info for the given api
*
* @param api the api
* @param builder the request builder
* @param currentTime the current time
* @param random random object
* @return the default device info for the given api
*/
public static LocationFixes getDefault(PokemonGo api, RequestEnvelopeOuterClass.RequestEnvelope.Builder builder, long currentTime, Random random) {
if (Double.isNaN(api.latitude) || Double.isNaN(api.longitude)) {
return new LocationFixes();
}
boolean hasMapUpdate = false;
boolean empty = builder.getRequestsCount() == 0 || builder.getRequests(0) == null;
for (Request request : builder.getRequestsList()) {
if (request.getRequestType() == RequestType.GET_MAP_OBJECTS) {
hasMapUpdate = true;
break;
}
}
int pn = random.nextInt(100);
int providerCount;
int[] negativeSnapshotProviders = new int[0];
int chance = random.nextInt(100);
LocationFixes locationFixes;
if (api.locationFixes == null) {
locationFixes = new LocationFixes();
api.locationFixes = locationFixes;
providerCount = pn < 75 ? 6 : pn < 95 ? 5 : 8;
if (providerCount != 8) {
// a 5% chance that the second provider got a negative value else it should be the first only
negativeSnapshotProviders = new int[1];
negativeSnapshotProviders[0] = chance < 95 ? 0 : 1;
} else {
negativeSnapshotProviders = new int[chance >= 50 ? 3 : 2];
negativeSnapshotProviders[0] = 0;
negativeSnapshotProviders[1] = 1;
if (chance >= 50) {
negativeSnapshotProviders[2] = 2;
}
}
} else {
locationFixes = api.locationFixes;
locationFixes.clear();
boolean expired = currentTime - locationFixes.timestampCreate < (random.nextInt(10000) + 5000);
if (empty || (!hasMapUpdate && expired)) {
locationFixes.timestampCreate = currentTime;
return locationFixes;
} else if (hasMapUpdate) {
providerCount = chance >= 90 ? 2 : 1;
} else {
providerCount = pn < 60 ? 1 : pn < 90 ? 2 : 3;
}
}
locationFixes.timestampCreate = currentTime;
for (int i = 0; i < providerCount; i++) {
float latitude = (float) api.latitude;
float longitude = (float) api.longitude;
if (i < providerCount - 1) {
latitude = offsetOnLatLong(api.latitude, random.nextInt(100) + 10);
longitude = offsetOnLatLong(api.longitude, random.nextInt(100) + 10);
}
float altitude = (float) api.altitude;
float verticalAccuracy = (float) (15 + (23 - 15) * random.nextDouble());
// Fake errors
if (!hasMapUpdate) {
if (random.nextInt(100) > 90) {
latitude = 360;
longitude = -360;
}
if (random.nextInt(100) > 90) {
altitude = (float) (66 + 94 * random.nextDouble());
}
}
LocationFix.Builder locationFixBuilder = LocationFix.newBuilder();
locationFixBuilder.setProvider("fused").setTimestampSnapshot(contains(negativeSnapshotProviders, i) ? random.nextInt(1000) - 3000 : currentTime - api.startTime + (150 * (i + 1) + random.nextInt(250 * (i + 1) - (150 * (i + 1))))).setLatitude(latitude).setLongitude(longitude).setHorizontalAccuracy((float) api.accuracy).setAltitude(altitude).setVerticalAccuracy(verticalAccuracy).setProviderStatus(3L).setLocationType(1L).setSpeed(-1.0f).setCourse(-1.0f);
locationFixes.add(locationFixBuilder.build());
}
return locationFixes;
}
use of POGOProtos.Networking.Requests.RequestOuterClass.Request in project PokeGOAPI-Java by Grover-c13.
the class RequestHandler method buildRequest.
private RequestEnvelope.Builder buildRequest(ServerRequest[] requests, ServerPlatformRequest[] platformRequests) throws RequestFailedException {
RequestEnvelope.Builder builder = RequestEnvelope.newBuilder();
resetBuilder(builder);
for (ServerRequest serverRequest : requests) {
ByteString data = serverRequest.request.toByteString();
Request request = Request.newBuilder().setRequestMessage(data).setRequestType(serverRequest.type).build();
builder.addRequests(request);
}
Signature.setSignature(api, builder);
for (ServerPlatformRequest platformRequest : platformRequests) {
ByteString data = platformRequest.request;
Builder request = PlatformRequest.newBuilder().setType(platformRequest.type).setRequestMessage(data);
builder.addPlatformRequests(request);
}
return builder;
}
Aggregations