Online multiplayer game using Google Play Games Services in Cocos2D-X

After 6 months I was back to my project, but…
When installing then starting 6 months old apk - I still could connect to GooglePlay.
But compiling the same apk I get E TokenRequestor: You have wrong OAuth2 related configurations.

Then I’ve found my debug.keystore file was changed/updated; seems it been auto-updated every 365 days.
(after adding new/updated SHA-1 signing-certificate fingerprint in OAuth 2.0 client IDs I can connect again :slight_smile: )

I would say to have a single realtime event listener class that will pass the data in the callbacks to the appropriate controller classes using events or directly, instead of having two separate real time event listeners. My solution uses a NetworkController class to send and receive any data over the wire and it acts as a service layer to my game engine.

Here is the .h file for my NetworkController, hope it helps.

class NetworkController : public GameServiceInterface, public gpg::IRealTimeEventListener {
public:
  NetworkController();
protected:
  virtual bool IsAuthorized() override;
  virtual void ListGameSaves() override;
  virtual void DeleteGameSave() override;
  virtual void LoadGame(const std::string &filename, gpg::SnapshotConflictPolicy conflict_policy) override;
  virtual void SaveGame(const std::string& filename, const std::string& description, const std::string& content, gpg::SnapshotConflictPolicy conflict_policy) override;
  virtual std::string NetworkUsername() override;
  virtual void SendMessageToParticipants(std::string &message) override;
  virtual void SendMessageToParticipant(std::string &message, gpg::MultiplayerParticipant participant) override;
  virtual gpg::RealTimeRoom *Gameroom() override;
  virtual void CreateRealtimeGameroom(const int minimumPlayersToStart, const int maxParticipants) override;
  virtual void LeaveRealtimeGameroom() override;
  virtual void PlayerStats() override;
  virtual bool IsSignedIn() override;
  virtual bool IsGameRoomValid() override;
  virtual std::vector<gpg::MultiplayerParticipant> GameRoomParticipants() override;
  virtual void OnNotify(GameEvent *event) override;
  virtual std::string GetHostUsername() override;
  virtual bool IsHost() override;
  virtual gpg::MultiplayerParticipant HostParticipant() override;
  virtual void ShowLeaderboard(const std::string &leaderboardId) override;
  virtual void ShowAchievements() override;

private:
  void InitGpg();
  void OnConnect();
  void SetRoom(gpg::RealTimeRoom const &room);
  void ProcessIncomingData();
  void PickHost();
  void SetHost(const std::string &hostUsername);
  std::string FindParticipantWithHighestId();

  //IRealTimeEventListener
  void OnRoomStatusChanged(gpg::RealTimeRoom const &room) override;
  void OnConnectedSetChanged(gpg::RealTimeRoom const &room) override;
  void OnP2PConnected(gpg::RealTimeRoom const &room, gpg::MultiplayerParticipant const &participant) override;
  void OnP2PDisconnected(gpg::RealTimeRoom const &room, gpg::MultiplayerParticipant const &participant) override;
  void OnParticipantStatusChanged(gpg::RealTimeRoom const &room, gpg::MultiplayerParticipant const &participant) override;
  void OnDataReceived(gpg::RealTimeRoom const &room, gpg::MultiplayerParticipant const &from_participant, std::vector<uint8_t> data, bool is_reliable)
      override;

  gpg::GameServices *gameServices;
  gpg::RealTimeRoom realTimeRoom;
  int maxParticipantsInGameroom;
  rapidjson::Document gameConfigurationJsonObject;
  std::string hostUsername;
  bool isHost;
  gpg::MultiplayerParticipant hostParticipant;
};
#endif

Thanks damort