আপনার গেমের মধ্যে PGS Recall API একত্রিত করুন

এই পৃষ্ঠায় আপনার গেমে রিকল এপিআই (Recall API) কীভাবে প্রয়োগ করতে হয় তা ব্যাখ্যা করা হয়েছে। এতে প্রথমে এপিআই সমর্থন করার জন্য আপনার গেম সার্ভার এবং ক্লায়েন্ট সেট আপ করার পদ্ধতি আলোচনা করা হয়েছে, এবং তারপরে টোকেন সংরক্ষণ ও পুনরুদ্ধার করার উপায় ব্যাখ্যা করা হয়েছে।

গেম সার্ভার সেটআপ

গুগল সার্ভারে রিকল এপিআই (Recall API) কল করার জন্য আপনার গেম সার্ভারটি সেট আপ করুন।

১. আপনার প্লে গেমস সার্ভিসেস প্রজেক্টটি সেট আপ করুন।

যদি আপনি ইতিমধ্যে তা না করে থাকেন, তাহলে ‘গুগল প্লে গেমস পরিষেবা সেট আপ করুন’ (Set up Google Play Games Services) অংশে দেওয়া নির্দেশাবলী অনুসরণ করুন।

২. গেমটির জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন।

সার্ভিস অ্যাকাউন্ট তৈরি করার নির্দেশাবলী অনুসরণ করুন। শেষে আপনার কাছে সার্ভিস অ্যাকাউন্টের ক্রেডেনশিয়ালসহ একটি JSON ফাইল থাকবে।

৩. PlayGamesServices-এর জন্য সার্ভার-সাইড জাভা লাইব্রেরি ডাউনলোড করুন।

google-api-services-games লাইব্রেরিটি ডাউনলোড করে আপনার সার্ভারে আপলোড করুন।

৪. রিকল এপিআই কলের জন্য ক্রেডেনশিয়াল প্রস্তুত করুন।

আরও বিস্তারিত তথ্যের জন্য অনুমোদিত এপিআই কল করার প্রস্তুতি দেখুন।

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.games.Games;
import com.google.api.services.games.GamesScopes;

// ...

GoogleCredential credential =
  GoogleCredential.fromStream(new FileInputStream("<credentials>.json"))
    .createScoped(Collections.singleton(GamesScopes.ANDROIDPUBLISHER));

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

গেম ক্লায়েন্ট সেটআপ

আমাদের সার্ভার গুগল সার্ভারের সাথে যোগাযোগের জন্য যে রিকল সেশন আইডিগুলো ব্যবহার করে, সেগুলো পুনরুদ্ধার করতে আপনার গেম ক্লায়েন্ট সেট আপ করুন।

জাভা এসডিকে

আপনার ক্লায়েন্টের মধ্যে জাভা এসডিকে সেট আপ করুন , এবং আপনার গ্রেডল ফাইলে com.google.android.gms:play-services-games-v2:19.0.0 এবং com.google.android.gms:play-services-tasks:18.0.2 বা তার পরবর্তী সংস্করণ অন্তর্ভুক্ত করতে ভুলবেন না।

সঠিক তথ্য দিয়ে গুগলের সার্ভারের সাথে যোগাযোগ করতে, আপনাকে ক্লায়েন্ট SDK থেকে একটি রিকল সেশন আইডি (Recall session ID) অনুরোধ করতে হবে, যা আপনি আপনার গেমের সার্ভারে পাঠান।

কোটলিন

PlayGames.getRecallClient(getActivity())
                .requestRecallAccess()
                .addOnSuccessListener { recallAccess -> val recallSessionId: String = recallAccess.getSessionId() }
                // Send the recallSessionId to your game server

জাভা

PlayGames.getRecallClient(getActivity())
  .requestRecallAccess()
  .addOnSuccessListener(
    recallAccess -> {
      String recallSessionId = recallAccess.getSessionId();
      // Send the recallSessionId to your game server
    });

ইউনিটি এসডিকে

যদি আপনি ইতিমধ্যে তা না করে থাকেন, তাহলে আপনার ক্লায়েন্টের মধ্যে ইউনিটি এসডিকে সেট আপ করুন

সঠিক তথ্য দিয়ে গুগলের সার্ভারের সাথে যোগাযোগ করতে, আপনাকে ক্লায়েন্ট SDK থেকে একটি রিকল সেশন আইডি (Recall session ID) অনুরোধ করে আপনার গেমের সার্ভারে পাঠাতে হবে।

PlayGamesPlatform.Instance.RequestRecallAccess(
    recallAccess => {
        string recallSessionId = recallAccess.sessionId;
        // Send the recallSessionId to your game server
    });

v2 নেটিভ এসডিকে (বিটা)

আপনি যদি এখনও তা না করে থাকেন, তাহলে C এবং C++ এর জন্য Play Games Services ব্যবহার শুরু করুন

// Include the following headers

#include "play_games.h"
#include "recall_client.h"
#include "pgs_status_code.h"
// Request Recall Access
// Initializes the Play Games Services v2 Native SDK (beta).
Pgs_initialize(javaVM, activity);

//Creating Recall Client
PgsRecallClient* pgs_recall_client =
      PgsRecallClient_create(activity);

// RequestRecallAccess Function
PgsRecallClient_requestRecallAccess(
    pgs_recall_client,

    // This is your callback function defined as an inline lambda
    [](PgsStatusCode status_code, char* session_id, user_data) {

        if (status_code == PGS_STATUS_SUCCESS) {
            // Recall Session Id Fetched Successfully
        } else {
            // Fetching Recall Session Id Failed
            // Handle error based on status_code.
            // Examples:
            // PGS_STATUS_NETWORK_ERROR: Check internet connection.
            // PGS_STATUS_INTERNAL_ERROR: An unexpected error occurred.
        }

        // Clean up the client instance passed as user_data
        PgsRecallClient* client = static_cast<PgsRecallClient*>(user_data);
        if (client != nullptr) {
            PgsRecallClient_destroy(client);
        }
    },

    user_data // Data to pass to the callback
);

// Shuts down the Play Games Services v2 Native SDK (beta).
Pgs_destroy()

আপনার গেম সার্ভারের মধ্যে রিকল এপিআই ব্যবহার করুন

আপনার সার্ভার এবং ক্লায়েন্ট কনফিগার করার পরে, আপনি আপনার গেম ক্লায়েন্ট থেকে গেম সার্ভারে recallSessionID পাঠাতে পারেন এবং সার্ভার-সাইডে রিকল টোকেনগুলি সংরক্ষণ, পুনরুদ্ধার বা মুছে ফেলার জন্য জাভা এপিআই ব্যবহার শুরু করতে নিম্নলিখিত নির্দেশিকা অনুসরণ করতে পারেন।

টোকেন সংরক্ষণ করুন

Google Play Games Recall API-তে একটি প্লেয়ার অ্যাকাউন্টে দুটি তথ্য থাকে:

  • একটি পার্সোনা যা ইন-গেম অ্যাকাউন্টের জন্য একটি স্থিতিশীল শনাক্তকারী হিসেবে কাজ করে।
  • একটি টোকেন যা একজন খেলোয়াড়কে নিরাপদে অ্যাকাউন্টে সাইন ইন করার জন্য চাবি হিসেবে কাজ করে।

আপনি LinkPersonaRequest অবজেক্ট ব্যবহার করে একজন ব্যবহারকারীর পার্সোনা এবং টোকেন সংরক্ষণ করতে পারেন। Google API কল করার জন্য GoogleCredential ব্যবহার করুন (প্রসঙ্গের জন্য ‘Calling Google APIs’ দেখুন)। একটি পার্সোনার ১:১ কার্ডিনালিটি সীমাবদ্ধতা রয়েছে: একটি PGS প্রোফাইলে কেবল একটি পার্সোনা থাকতে পারে, এবং একটি পার্সোনা কেবল একটি PGS প্রোফাইলের অন্তর্ভুক্ত হতে পারে। ১:১ কার্ডিনালিটি সীমাবদ্ধতার লঙ্ঘন কীভাবে সমাধান করা হবে তা নির্ধারণ করতে সাংঘর্ষিক লিঙ্ক রেজোলিউশন নীতি সেট করুন।

ঐচ্ছিকভাবে টোকেনের মেয়াদ শেষ হওয়ার সময় নির্ধারণ করুন। একটি 'টাইম টু লিভ' (Time to Live) সেট করতে Durations অবজেক্টের সাথে SetTtl() ব্যবহার করুন অথবা setExpireTime() এর মাধ্যমে একটি নির্দিষ্ট মেয়াদ শেষ হওয়ার সময় প্রদান করুন।

আপনাকে অবশ্যই পার্সোনা এবং গেম টোকেন এনক্রিপ্ট করতে হবে, এবং সেগুলিতে ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্য থাকতে পারবে না। পার্সোনা এবং টোকেন স্ট্রিং সর্বাধিক ২৫৬ অক্ষর দীর্ঘ হতে পারে।

import com.google.api.services.games.Games.Recall.LinkPersona;
import com.google.api.services.games.model.LinkPersonaRequest;
import com.google.api.services.games.model.LinkPersonaResponse;
import com.google.protobuf.util.Durations;

// ...

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

String recallSessionId = ... // recallSessionID from game client
String persona = ... // encrypted opaque string, stable for in-game account
String token = ... // encrypted opaque string encoding the progress line

LinkPersonaRequest linkPersonaRequest =
  LinkPersonaRequest.newBuilder()
    .setSessionId(recallSessionId)
    .setPersona(persona)
    .setToken(token)
    .setCardinalityConstraint(ONE_PERSONA_TO_ONE_PLAYER)
    .setConflictingLinksResolutionPolicy(CREATE_NEW_LINK)
    .setTtl(Durations.fromDays(7)) // Optionally set TTL for token
    .build();

LinkPersonaResponse linkPersonaResponse =
  gamesApi.recall().linkPersona(linkPersonaRequest).execute();

if (linkPersonaResponse.getState() == LINK_CREATED) {
  // success
}

টোকেন পুনরুদ্ধার করুন

আপনার গেমের প্রয়োজন অনুসারে, টোকেন পাওয়ার জন্য তিনটি বিকল্প রয়েছে। আপনি নিম্নলিখিতগুলির জন্য অনুরোধ করতে পারেন:

  • বর্তমান গেমের সাথে সংশ্লিষ্ট টোকেনগুলো, যার মধ্যে গেম-স্কোপড রিকল টোকেনও অন্তর্ভুক্ত।
  • ডেভেলপার অ্যাকাউন্টের মালিকানাধীন সমস্ত গেম জুড়ে সংরক্ষিত সর্বশেষ টোকেন।
  • ডেভেলপার অ্যাকাউন্টের মালিকানাধীন গেমগুলির একটি তালিকা দেওয়া থাকলে, প্রতিটি গেমের সাথে যুক্ত সমস্ত রিকল টোকেন।

গেম-স্কোপড রিকল টোকেন

বর্তমান গেম থেকে রিকল টোকেনগুলো পুনরুদ্ধার করতে, ক্লায়েন্ট থেকে recallSessionId টি নিন এবং retrieveTokens API-তে পাস করুন:

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrievePlayerTokensResponse;
import com.google.api.services.games.model.RecallToken;

// ...

String recallSessionId = ... // recallSessionID from game client

RetrievePlayerTokensResponse retrievePlayerTokensResponse =
  gamesApi.recall().retrieveTokens(recallSessionId).execute();

for (RecallToken recallToken : retrievePlayerTokensResponse.getTokens()) {
  String token recallToken.getToken();
  // Same string as was written in LinkPersona call
  // decrypt and recover in-game account
}

ডেভেলপার অ্যাকাউন্টের মালিকানাধীন সমস্ত গেম জুড়ে সর্বশেষ রিকল টোকেন

গুগল প্লে কনসোলে ডেভেলপার অ্যাকাউন্টের মালিকানাধীন সমস্ত গেম জুড়ে সংরক্ষিত সবচেয়ে সাম্প্রতিক টোকেনটি পুনরুদ্ধার করতে, আপনাকে ক্লায়েন্ট থেকে recallSessionId নিতে হবে এবং নিম্নলিখিত কোড স্নিপেটে দেখানো অনুযায়ী lastTokenFromAllDeveloperGames API-তে তা পাস করতে হবে। প্রতিক্রিয়ার অংশ হিসাবে, আপনি এই টোকেনের সাথে যুক্ত অ্যাপ্লিকেশন আইডিটি পরীক্ষা করতে পারেন।

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrieveDeveloperGamesLastPlayerTokenResponse;
import com.google.api.services.games.model.GamePlayerToken;
import com.google.api.services.games.model.RecallToken;

// ...

String recallSessionId = ... // recallSessionID from game client

RetrieveDeveloperGamesLastPlayerTokenResponse response =
        gamesApi.recall().lastTokenFromAllDeveloperGames(recallSessionId)
        .execute();

if (response.hasGamePlayerToken()) {
    GamePlayerToken gamePlayerToken = response.getGamePlayerToken();

    // The ID of the application that the token is associated with.
    String applicationId = gamePlayerToken.getApplicationId();

    // Same string as was written in LinkPersona call.
    RecallToken recallToken = gamePlayerToken.getRecallToken();

    // Decrypt and recover in-game account.
}

ডেভেলপার অ্যাকাউন্টের মালিকানাধীন গেমগুলির একটি নির্দিষ্ট তালিকা জুড়ে থাকা সমস্ত রিকল টোকেন

গুগল প্লে কনসোলে আপনার ডেভেলপার অ্যাকাউন্টের মালিকানাধীন গেমগুলির তালিকার সাথে যুক্ত সমস্ত টোকেন পুনরুদ্ধার করতে, ক্লায়েন্ট থেকে recallSessionId নিন এবং এটি gamesPlayerTokens API-তে পাস করুন। অ্যাপ্লিকেশন আইডিগুলির একটি তালিকা সরবরাহ করুন।

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrieveGamesPlayerTokensResponse;
import com.google.api.services.games.model.GamePlayerToken;
import com.google.api.services.games.model.RecallToken;

// ...

String recallSessionId = ... // recallSessionID from game client

// Application IDs for which you would like to retrieve the recall tokens.
List<String> applicationIds = ...

RetrieveGamesPlayerTokensResponse response =
gamesApiClient
        .recall()
        .gamesPlayerTokens(recallSessionId)
        .setApplicationIds(applicationIds)
        .execute();

for (GamePlayerToken gamePlayerToken : response.getGamePlayerTokens()) {
    // The ID of the application that the token is associated with.
    String applicationId  = gamePlayerToken.getApplicationId();

    // Same string as was written in LinkPersona call.
    RecallToken recallToken = gamePlayerToken.getRecallToken();

    // Decrypt and recover in-game account.
}

রিকল টোকেন মুছুন

প্রয়োজনে, আপনি নিম্নলিখিত কলটির মাধ্যমে রিকল টোকেনটি মুছে ফেলতে পারেন:

import com.google.api.services.games.Games;
import com.google.api.services.games.model.UnlinkPersonaRequest;
import com.google.api.services.games.model.UnlinkPersonaResponse;

// ...

String recallSessionId = ...
String persona = ...
String token = ...

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

UnlinkPersonaRequest unlinkPersonaRequest =
  UnlinkPersonaRequest.newBuilder()
    .setSessionId(recallSessionId)
    .setPersona(persona)
    // .setToken(token) - alternatively set token, but not both
    .build();

UnlinkPersonaResponse unlinkPersonaResponse =
  gamesApi.recall().unlinkPersona(unlinkPersonaRequest).execute();

boolean unlinked = unlinkPersonaResponse.isUnlinked();

প্রোফাইলবিহীন মোড সক্রিয় করুন

এই ধাপগুলো অনুসরণ করে আপনি সেইসব ব্যবহারকারীদের জন্য সীমিত রিকল এপিআই (Recall API) কার্যকারিতা চালু করতে পারেন, যাদের পিজিএস (PGS) প্রোফাইল নেই:

  1. প্লে ডেভেলপার কনসোলে আপনার পিজিএস গেম প্রোজেক্টের জন্য প্রোফাইলবিহীন রিকল সক্রিয় করুন। "স্টোরেজ চালু করুন" লেবেলযুক্ত বিকল্পটি নির্বাচন করুন।
  2. এই বিভাগের পরবর্তী অংশে বর্ণিত অতিরিক্ত পরিভাষাগুলো পর্যালোচনা করুন।
  3. আপনার অ্যাপ ম্যানিফেস্টে নিম্নলিখিত মেটাডেটা ট্যাগটি যোগ করুন:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

অতিরিক্ত শর্তাবলী

আপনাকে অবশ্যই প্লে গেমস সার্ভিসেস-এর পরিষেবার শর্তাবলীও মেনে চলতে হবে। যদি আপনি পিজিএস প্রোফাইলবিহীন ব্যবহারকারীদের জন্য রিকল এপিআই ব্যবহার করেন, যার মধ্যে গুগলের সাথে ব্যবহারকারীর ডেটা শেয়ার করা অন্তর্ভুক্ত, তবে গুগলের সাথে এই ডেটা শেয়ার করার আগে আপনাকে অবশ্যই ব্যবহারকারীদের একটি উপযুক্ত বিজ্ঞপ্তি প্রদান করতে হবে, যেখানে নিম্নলিখিত বিষয়গুলো বর্ণনা করা থাকবে:

  • প্লে গেমস অ্যাকাউন্ট লিঙ্কিং ফিচারটি চালু করতে আপনি কীভাবে গুগলের সাথে ডেটা শেয়ার করেন।
  • এই শেয়ারিং পরিচালনা করার জন্য সেটিংসের উপলব্ধতা, উদাহরণস্বরূপ, প্লে গেমস সেটিংসের মাধ্যমে।
  • গুগলের গোপনীয়তা নীতির অধীনে এই ডেটার প্রক্রিয়াকরণ, এবং এই শেয়ারিংয়ের জন্য ব্যবহারকারীর যথাযথ সম্মতি গ্রহণের আবশ্যকতা যা সকল প্রযোজ্য আইনি বাধ্যবাধকতা পূরণ করে।