Newer
Older
Import / projects / Gameloft / core / Network / ServerConfig.h
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __SERVER_CONFIG_H__
#define __SERVER_CONFIG_H__


#include "Utils/Serializer.h"
#include <chrono>


class ServerConfig : public SerializedBase
{
  JSON_SERIALIZED()

public:
  explicit ServerConfig(bool productionConfig = true) : m_autoReset(!productionConfig), m_cheatsEnabled(true), m_canClientDisableInactivityCheck(!productionConfig)
  {
  }

  // credentials
  inline const std::string& GetUsername() const           { return m_username; }
  inline const std::string& GetPassword() const           { return m_password; }
  inline const std::string& GetScope()    const           { return m_scope; }
  inline const std::string& GetClientId() const           { return m_clientId; }
  inline const std::string& GetDataCenterName() const     { return m_dataCenterName; }

  // client rates
  inline std::chrono::milliseconds GetClientPingInterval() const                 { return m_clientPingInterval; }
  inline std::chrono::milliseconds GetAbandonConnectionThreshold() const         { return m_adbandonConnectionThreshold; }
  inline std::chrono::milliseconds GetInDangerThreshold() const                  { return m_inDangerThreshold; }

  // rates
  inline std::chrono::milliseconds GetServerPingInterval() const                 { return m_serverPingInterval; }
  inline std::chrono::milliseconds GetSaveInterval() const                       { return m_saveInterval; }
  inline std::chrono::milliseconds GetForceSaveInterval() const                  { return m_forceSaveInterval; }
  inline uint32_t GetForceSaveCount() const                                      { return m_forceSaveCount; }
  inline std::chrono::milliseconds GetMatchmakingInterval() const                { return m_matchmakingInterval; }
  inline std::chrono::milliseconds GetOpponentUpdateInterval() const             { return m_opponentUpdateInterval; }
  inline std::chrono::milliseconds GetProfileLockedRetryInterval() const         { return m_profileLockedRetryInterval; }
  inline std::chrono::milliseconds GetMaxFinalProfileFlushTime() const           { return m_maxFinalProfileFlushTime; }
  inline std::chrono::milliseconds GetMaxFinalSetInventoryValuesTime() const     { return m_maxFinalSetInventoryValuesTime; }
  inline uint32_t GetMaxFinalSyncInventoryRetries() const                        { return m_maxFinalSyncInventoryRetries; }

  // on player level-up, sync this to standard matcher location and do a CRM refresh possibly multiple times to make sure it really updates for timely campaigns based on player level
  inline std::vector<std::chrono::milliseconds> GetLevelUpCrmRefreshTimeArray() const  { return m_levelUpCrmRefreshTimeArray; }

  // internals
  inline std::chrono::milliseconds GetRecvTimeout() const       { return m_recvTimeout; }
  inline uint32_t GetUpdateFrequencyHz() const                  { return m_updateFrequencyHz; }
  inline uint32_t GetSvnRevision() const                        { return m_svnRevision; }
  inline uint32_t GetTargetSendBufferSize() const               { return m_targetSendBuffer; }
  inline uint32_t GetTargetRecieveBufferSize() const            { return m_targetRecvBuffer; }
  inline uint32_t GetResizeThreshold() const                    { return m_resizeThreshold; }
  inline uint32_t GetThreadPoolSize() const                     { return m_threadPoolSize; }
  inline bool AllowClientToDisableInactivityCheck() const       { return m_canClientDisableInactivityCheck; }
  inline std::chrono::milliseconds GetCrmConfigIntervalCheck() const  { return m_crmCfgIntervalCheck; }
  inline const std::string& GetServerVersion() const            { return m_version; }
  inline void SetServerVersion(const std::string& v)            { m_version = v; }

  // logging
  inline size_t GetLogLevel() const           { return static_cast<size_t>(m_logLevel); }
  inline bool GetMessageStatsEnabled() const  { return m_messageStatsEnabled; }
  inline bool SendServerSideTrackingEnabled() const  { return m_sendSeverSideTrackersEnabled; }
  inline const std::vector<uint32_t>& ServerSideGlotTrackingEventIDs() const { return m_serverSideGlotTrackingEventIDs; }

  // gameplay
  inline bool GetAutoReset() const            { return m_autoReset; }
  inline bool CheatsEnabled() const           { return m_cheatsEnabled; }
  
  inline bool IsDBCacheEnabled() const          { return m_cacheDB; }
  inline std::chrono::milliseconds DBCacheRefreshTimeout() const { return m_cacheDBRefreshTimeout; }

  // security
  void ApplySecurityLock(const ServerConfig& lock);
  inline const std::vector<std::string>& GetAllowedClientIdList() const { return m_allowedClientIds; }
  inline bool GetBatchProfileMigrationAllowed() const { return m_batchProfileMigrationAllowed; }

  // leaderboard
  inline std::string GetLeagueLeaderboardName() const { return m_leagueLeaderboardName; }
  inline std::string GetGlobalLeaderboardName() const { return m_globalLeaderboardName; }
  inline std::string GetLocalLeaderboardName() const { return m_localLeaderboardName; }
  inline Timestamp   GetLeagueLeaderboardBaseTime() const { return m_leagueLeaderboardBaseTime; }
  inline std::chrono::milliseconds    GetLeagueLeaderboardDuration() const { return m_leagueLeaderboardDuration; }
  inline const bne::JsonValueConstRef GetLeagueLeaderboardTierJson() const { return m_leagueLeaderboardTierJson; }
  inline uint32_t    GetGeoLocationLeaderboardDistance() const { return m_geoLocationLeaderboardDistance; }
  inline bool        GetGeoLocationLeaderboardCenterOnUser() const { return m_geoLocationLeaderboardCenterOnUser; }
  
  // seshat
  inline const std::vector<std::string>& GetSehatMatcherList() const { return m_matcherList; }
  inline std::string GetSehatMatcherIncludes() const                  { return m_matcherIncludes; }
  inline bool ShouldSortMatchesByDifficulty() const                   { return m_bSortMatchesByDifficulty; }
  inline std::string GetForcedCompatibilitySuffix() const { return m_forcedCompatiblitySuffix; }
  inline std::string GetForcedCompatibilityHash() const { return m_forcedCompatiblityHash; }
  inline uint32_t GetMaxOpponentPlayerLevelsAbove() const { return m_maxOpponentPlayerLevelsAbove; }
  inline uint32_t GetMaxOpponentPlayerLevelsBelow() const { return m_maxOpponentPlayerLevelsBelow; }
  inline uint32_t GetMaxOpponentTrophiesAbove() const { return m_maxOpponentTrophiesAbove; }
  inline uint32_t GetMaxOpponentTrophiesBelow() const { return m_maxOpponentTrophiesBelow; }
  inline uint32_t GetTargetFreeOpponentSize() const { return m_targetFreeOpponentSize; }

  // tracking
  inline bool ShouldSendServerSideTrackingEvents() const { return m_bSendServerSideTrackingEvents;  }
  inline std::chrono::milliseconds GetTrackingUpdatePeriodSecs() const { return m_targetUpdatePeriod; }
  inline std::chrono::milliseconds GetTrackingInitEvePeriodSecs() const { return m_targetInitEvePeriod; }
  inline std::chrono::milliseconds GetTrackingFlushPeriodSecs() const { return m_flushEventPeriod; }
  inline uint32_t GetTrackingMaxPendingQueueSize() const { return m_maxPendingPackages; }
  
  void EraseSensitiveInformation()
  {
    m_username = "";
    m_password = "";
  }

  // Clan/Crew
  inline const std::string & GetClanLeaderboardName() const { return m_clanLeaderboardName; }
  inline const std::string & GetClanCategoryName() const { return m_clanCategoryName; }
  inline std::chrono::milliseconds GetClanStatusIntervalCheckMs() const          { return m_clanStatusIntervalCheck; }
  inline std::chrono::milliseconds GetClanWallPostLifeTimeSecs() const          { return m_clanWallPostLifeTime; }

  // notifications
  inline const std::string & GetNotificationType() const { return m_notificationType; }
  inline const std::string & GetNotificationWnsType() const { return m_notificationWnsType; }

  // shields
  inline uint32_t GetShieldAttackThresholdCount() const { return m_ShieldAttackThresholdCount; } 
  inline std::chrono::milliseconds  GetShieldAttackThresholdDurationSecs() const { return m_ShieldAttackThresholdDuration; }
  inline std::chrono::milliseconds  GetShieldDurationSecs() const { return m_ShieldDuration; }

  // crm
  inline const std::vector<std::string>& GetAgeLimitationCountries() const { return m_ageLimitationCountries; }
protected:

  inline void SetDefaultTierJson(const std::string& lbName)
  {
    m_leagueLeaderboardTierJson = lbName;
  }
  inline void SetUserName(const std::string & a_sDataVal) { m_username = a_sDataVal; }
  inline void SetPassword(const std::string & a_sDataVal) { m_password = a_sDataVal; }
  inline void SetScope(const std::string & a_sDataVal) { m_scope = a_sDataVal; }
  inline void SetClientId(const std::string & a_sDataVal) { m_clientId = a_sDataVal; }
  inline void SetDataCenter(const std::string & a_sDataVal) { m_dataCenterName = a_sDataVal; }
  inline void SetSvnRevision(uint32_t a_uiRevision) { m_svnRevision = a_uiRevision; }
  inline void SetLogLevel(RKLogLevel a_LogVal) { m_logLevel = a_LogVal; }
  inline void SetMatcherList(const std::vector<std::string> & a_vMatcherList) { m_matcherList = a_vMatcherList; }
  inline void SetMatcherIncludes(const std::string & a_sDataVal) { m_matcherIncludes = a_sDataVal; }
  inline void SetLevelUpCRMRefresh(const std::vector<std::chrono::milliseconds> & a_vRefreshTimes) { m_levelUpCrmRefreshTimeArray = a_vRefreshTimes; }
  inline void SetAllowedClientIds(const std::vector<std::string> & a_vClientIds) { m_allowedClientIds = a_vClientIds; }
  inline void SetLeagueLeaderboardName(const std::string & a_sDataVal) { m_leagueLeaderboardName = a_sDataVal; }
  inline void SetGlobalLeaderboardName(const std::string & a_sDataVal) { m_globalLeaderboardName = a_sDataVal; }
  inline void SetLocalLeaderboardName(const std::string & a_sDataVal) { m_localLeaderboardName = a_sDataVal; }
  inline void SetLeagueLeaderboardBaseTime(const Timestamp & a_DataVal) { m_leagueLeaderboardBaseTime = a_DataVal; }
  inline void SetLeagueLeaderboardDuration(std::chrono::milliseconds a_uiDataValInSecs) { m_leagueLeaderboardDuration = a_uiDataValInSecs; }
  inline void SetGeolocationLeaderboardCenterOnUser(bool a_bDataVal) { m_geoLocationLeaderboardCenterOnUser = a_bDataVal; }
  inline void SetGeolocationLeaderboardDistance(uint32_t a_uiDataVal) { m_geoLocationLeaderboardDistance = a_uiDataVal; }
  inline void SetClanCategoryName(const std::string & a_sDataVal) { m_clanCategoryName = a_sDataVal; }
  inline void SetClanLeaderboardName(const std::string & a_sDataVal) { m_clanLeaderboardName = a_sDataVal; }
  inline void SetClanStatusIntervalCheck(std::chrono::milliseconds a_uiDataVal) { m_clanStatusIntervalCheck = a_uiDataVal; }
  inline void SetClanWallPostListTime(std::chrono::milliseconds a_iDataVal) { m_clanWallPostLifeTime = a_iDataVal; }
  inline void SetForcedCompabilitySuffix(const std::string & a_sDataVal) { m_forcedCompatiblitySuffix = a_sDataVal; }
  inline void SetForcedCompabilityHash(const std::string & a_sDataVal) { m_forcedCompatiblityHash = a_sDataVal; }
  inline void SetAutoReset(bool a_bDataVal) { m_autoReset = a_bDataVal; }
  inline void SetCheatsEnabled(bool a_bDataVal) { m_cheatsEnabled = a_bDataVal; }
  inline void SetCanClientDisabledInactivityCheck(bool a_bDataVal) { m_canClientDisableInactivityCheck = a_bDataVal; }

private:

  std::string m_username;
  std::string m_password;
  std::string m_scope;

  std::string m_clientId;
  std::string m_dataCenterName;

  // rates
  std::chrono::milliseconds m_serverPingInterval          = std::chrono::seconds(1); // 1s

  // client rates
  std::chrono::milliseconds m_clientPingInterval          = std::chrono::seconds(1); // 1s

#ifdef _DEBUG
  std::chrono::milliseconds m_adbandonConnectionThreshold = std::chrono::seconds(5);
  std::chrono::milliseconds m_inDangerThreshold           = std::chrono::seconds(2);
#else
  std::chrono::milliseconds m_adbandonConnectionThreshold = std::chrono::seconds(5);
  std::chrono::milliseconds m_inDangerThreshold           = std::chrono::seconds(2);
#endif

  // base intervals
  std::chrono::milliseconds m_expectedLongestFedRequestTime = std::chrono::seconds(15);  // some timeouts need to be based on max 
  std::chrono::milliseconds m_baseInterval = std::chrono::seconds(15);  // used as value other values are based on

  std::chrono::milliseconds m_saveInterval = m_baseInterval * 20;
  std::chrono::milliseconds m_forceSaveInterval = m_baseInterval * 2;
  std::chrono::milliseconds m_matchmakingInterval = m_baseInterval * 4;
  std::chrono::milliseconds m_opponentUpdateInterval = m_baseInterval * 60;
  std::chrono::milliseconds m_profileLockedRetryInterval = m_baseInterval * 4;
  std::chrono::milliseconds m_maxFinalProfileFlushTime = m_expectedLongestFedRequestTime * 8;
  std::chrono::milliseconds m_maxFinalSetInventoryValuesTime = m_expectedLongestFedRequestTime;

  std::vector<std::chrono::milliseconds> m_levelUpCrmRefreshTimeArray;

  uint32_t m_forceSaveCount               = 5;
  uint32_t m_maxFinalSyncInventoryRetries = 3;

  // internals
  std::chrono::milliseconds m_recvTimeout = std::chrono::milliseconds(100);
  uint32_t m_updateFrequencyHz            = 30; // Hz
  uint32_t m_svnRevision                  = 0;
  uint32_t m_targetSendBuffer             = 4096;
  uint32_t m_targetRecvBuffer             = 2048;
  uint32_t m_resizeThreshold              = 20;
  uint32_t m_threadPoolSize               = 32;
  std::chrono::milliseconds m_crmCfgIntervalCheck = std::chrono::seconds(20 * 60);   // Check the hestia/CRM config at 20 mins interval by default
  std::string m_version;

  // logging
  RKLogLevel m_logLevel = RKLL_UNKNOWN;
  bool       m_messageStatsEnabled = false;
  bool       m_sendSeverSideTrackersEnabled = false;
  std::vector<uint32_t> m_serverSideGlotTrackingEventIDs;

  bool      m_cacheDB = false;
  std::chrono::milliseconds m_cacheDBRefreshTimeout = std::chrono::seconds(15 * 60); // 15 min

  // gameplay
  bool m_autoReset      = false;
  bool m_cheatsEnabled  = false;

  // security 
  bool m_canClientDisableInactivityCheck = false;

  // security 
  std::vector<std::string> m_allowedClientIds;
  bool m_batchProfileMigrationAllowed = false;

  // leaderboard
  std::string    m_leagueLeaderboardName;
  std::string    m_globalLeaderboardName;
  std::string    m_localLeaderboardName;
  Timestamp      m_leagueLeaderboardBaseTime;
  std::chrono::milliseconds       m_leagueLeaderboardDuration = std::chrono::seconds(0);
  uint32_t       m_geoLocationLeaderboardDistance = 0;
  bool           m_geoLocationLeaderboardCenterOnUser = false; // if true the leaderboard data will be centered on the user who made the request.
  bne::JsonValue m_leagueLeaderboardTierJson;

  // Crew
  std::string    m_clanCategoryName;
  std::string    m_clanLeaderboardName;
  std::chrono::milliseconds       m_clanWallPostLifeTime = std::chrono::seconds(0);   // Wall post older than this will be deleted in seconds
  std::chrono::milliseconds       m_clanStatusIntervalCheck = std::chrono::seconds(0);

  // seshat
  std::vector<std::string> m_matcherList;
  std::string m_matcherIncludes;
  bool m_bSortMatchesByDifficulty = false;
  std::string m_forcedCompatiblitySuffix;
  std::string m_forcedCompatiblityHash;
  uint32_t m_maxOpponentPlayerLevelsAbove = 3;
  uint32_t m_maxOpponentPlayerLevelsBelow = 3;
  uint32_t m_maxOpponentTrophiesAbove = std::numeric_limits<uint32_t>::max();
  uint32_t m_maxOpponentTrophiesBelow = std::numeric_limits<uint32_t>::max();
  uint32_t m_targetFreeOpponentSize = 12;

  // tracking
  bool m_bSendServerSideTrackingEvents = false;  // Is server-side tracking turned on?
  std::chrono::milliseconds m_targetUpdatePeriod = std::chrono::seconds(30);  // The time period between polling the client connection event queues for new events.
  std::chrono::milliseconds m_targetInitEvePeriod = std::chrono::seconds(30); // The time period between polling eve for the etsv2 url at startup
  std::chrono::milliseconds m_flushEventPeriod = std::chrono::seconds(40);    // The time period we wait before sending tracking event batch that's not full.
  uint32_t m_maxPendingPackages = 100;     // The maximum internal message queue size.. each element can have 100 events.. so it's really 10,000

  // notifications
  std::string m_notificationType = "launch"; // temp default until Android Framework is patched.
  std::string m_notificationWnsType = "";

  // shields
  uint32_t m_ShieldAttackThresholdCount = 3;           // the number of attacks in a given period before shield is activated
  std::chrono::milliseconds m_ShieldAttackThresholdDuration = std::chrono::seconds(86400); // the period over which to consider the count 
  std::chrono::milliseconds m_ShieldDuration = std::chrono::seconds(21600);                // the duration the shield will be in effect once active

  // CRM
  std::vector<std::string> m_ageLimitationCountries;
};
#endif //__SERVER_CONFIG_H__

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////