Search in sources :

Example 1 with Request

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;
}
Also used : InputStream(java.io.InputStream) ByteString(com.google.protobuf.ByteString) PlatformRequest(POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope.PlatformRequest) Request(POGOProtos.Networking.Requests.RequestOuterClass.Request) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) StatusCode(POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope.StatusCode) PlatformResponse(POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope.PlatformResponse) Response(okhttp3.Response) GetPlayerResponse(POGOProtos.Networking.Responses.GetPlayerResponseOuterClass.GetPlayerResponse) ResponseEnvelope(POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope) LoginFailedException(com.pokegoapi.exceptions.request.LoginFailedException) RequestFailedException(com.pokegoapi.exceptions.request.RequestFailedException) InvalidCredentialsException(com.pokegoapi.exceptions.request.InvalidCredentialsException) BannedException(com.pokegoapi.exceptions.request.BannedException) RequestEnvelope(POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope) BadRequestException(com.pokegoapi.exceptions.request.BadRequestException) PlatformResponse(POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope.PlatformResponse) RequestBody(okhttp3.RequestBody)

Example 2 with Request

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;
}
Also used : LocationFix(POGOProtos.Networking.Envelopes.SignatureOuterClass.Signature.LocationFix) Request(POGOProtos.Networking.Requests.RequestOuterClass.Request)

Example 3 with Request

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;
}
Also used : ByteString(com.google.protobuf.ByteString) Builder(POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope.PlatformRequest.Builder) PlatformRequest(POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope.PlatformRequest) Request(POGOProtos.Networking.Requests.RequestOuterClass.Request) RequestEnvelope(POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope)

Aggregations

Request (POGOProtos.Networking.Requests.RequestOuterClass.Request)3 RequestEnvelope (POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope)2 PlatformRequest (POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope.PlatformRequest)2 ByteString (com.google.protobuf.ByteString)2 Builder (POGOProtos.Networking.Envelopes.RequestEnvelopeOuterClass.RequestEnvelope.PlatformRequest.Builder)1 ResponseEnvelope (POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope)1 PlatformResponse (POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope.PlatformResponse)1 StatusCode (POGOProtos.Networking.Envelopes.ResponseEnvelopeOuterClass.ResponseEnvelope.StatusCode)1 LocationFix (POGOProtos.Networking.Envelopes.SignatureOuterClass.Signature.LocationFix)1 GetPlayerResponse (POGOProtos.Networking.Responses.GetPlayerResponseOuterClass.GetPlayerResponse)1 BadRequestException (com.pokegoapi.exceptions.request.BadRequestException)1 BannedException (com.pokegoapi.exceptions.request.BannedException)1 InvalidCredentialsException (com.pokegoapi.exceptions.request.InvalidCredentialsException)1 LoginFailedException (com.pokegoapi.exceptions.request.LoginFailedException)1 RequestFailedException (com.pokegoapi.exceptions.request.RequestFailedException)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 RequestBody (okhttp3.RequestBody)1 Response (okhttp3.Response)1